javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/PlayerImpl.java
branchRCL_3
changeset 65 ae942d28ec0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/PlayerImpl.java	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,492 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This class is native player implementation of Player interface
+*
+*/
+
+
+package com.nokia.microedition.media;
+
+import javax.microedition.media.PlayerListener;
+import javax.microedition.media.MediaException;
+import com.nokia.microedition.media.NativeError;
+import com.nokia.mj.impl.rt.support.Finalizer;
+import com.nokia.mj.impl.utils.Logger;
+
+public class PlayerImpl extends PlayerBase
+{
+    // CMMAPlayer handle
+    protected int iPlayerHandle;
+
+    // Controls container
+    protected ControlContainer iControls;
+
+    // object for waiting native asynchronous method calls
+    protected Object iLockObject = new Object();
+    protected Object iPrefetchLockObject = new Object();
+
+    // native error code
+    protected int iError;
+
+    protected PlayerListenerImpl iPlayerListenerImpl;
+
+    private Finalizer mFinalizer;
+
+    private boolean iWaitFlag = true;
+
+    private boolean iStartWaitFlag = true;
+
+    /**
+     * Constructor
+     * @param aPlayerHandle handle to player (CMMAPlayer)
+     */
+    public PlayerImpl(int aPlayerHandle)
+    {
+        iPlayerHandle = aPlayerHandle;
+
+        iPlayerListenerImpl = new PlayerListenerImpl(this);
+
+        // Initialize player
+        int err = _initPlayer(iPlayerListenerImpl,
+                              ManagerImpl.getEventSource(),
+                              iPlayerHandle);
+        if (err < NativeError.KErrNone)
+        {
+            throw new OutOfMemoryError(NativeError.errorMessage(err));
+        }
+
+        mFinalizer = new Finalizer()
+        {
+            public void finalizeImpl()
+            {
+                doFinalize();
+            }
+        };
+
+        iControls = ControlContainer.populateControls(this,
+                    ManagerImpl.getEventSource(),
+                    iPlayerHandle);
+    }
+
+    private void doFinalize()
+    {
+        if (mFinalizer != null)
+        {
+            registeredFinalize();
+            mFinalizer = null;
+        }
+    }
+
+    /**
+     * This method is called when garbage collection occurs
+     * to delete native object
+     */
+    protected void registeredFinalize()
+    {
+        close();
+    }
+
+    /**
+     * Returns native player handle.
+     * @return Native player handle.
+     */
+    public int getPlayerHandle()
+    {
+        return iPlayerHandle;
+    }
+
+    /**
+     * @return Player's PlayerListenerImpl
+     */
+    public PlayerListenerImpl getPlayerListenerImpl()
+    {
+        return iPlayerListenerImpl;
+    }
+
+    /**
+     * Adds control to the player.
+     * @param aControl Player's control
+     * @param aControlName Identifies the control. Name must contain
+     * full package information
+     */
+    public void addControl(javax.microedition.media.Control aControl,
+                           String aControlName)
+    {
+        iControls.addControl(aControl, aControlName);
+    }
+
+    /**
+     * interface Controllable
+     * Return controls
+     * @return list of controls
+     * @see Controllable
+     */
+    public javax.microedition.media.Control[] getControls()
+    {
+        closeCheck();
+        unrealizedCheck();
+        return iControls.getControls();
+    }
+
+    /**
+     * interface Controllable
+     * get control by content type
+     * @param aControlType content type of wanted control
+     * @return control
+     * @see Controllable
+     * @see Control
+     */
+    public javax.microedition.media.Control getControl(String aControlType)
+    {
+        closeCheck();
+        unrealizedCheck();
+        return iControls.getControl(aControlType);
+    }
+
+    /**
+     * interface Player
+     * @see Player
+     */
+    public void addPlayerListener(PlayerListener aPlayerListener)
+    {
+        closeCheck();
+        iPlayerListenerImpl.addPlayerListener(aPlayerListener);
+    }
+
+    /**
+     * From Player
+     * @see Player
+     */
+    public void removePlayerListener(PlayerListener aPlayerListener)
+    {
+        closeCheck();
+        iPlayerListenerImpl.removePlayerListener(aPlayerListener);
+    }
+
+    /**
+     * From Player
+     * @see Player
+     */
+    public int getState()
+    {
+        int state = CLOSED;
+        if (iState != CLOSED)
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : before _getState()  ");
+            state = _getState(ManagerImpl.getEventSource(), iPlayerHandle);
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : after _getState()  ");
+        }
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"+ PlayerIMPl.getState() ");
+        return state;
+    }
+
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public void doRealize() throws MediaException
+    {
+        int err = _realize(ManagerImpl.getEventSource(), iPlayerHandle);
+
+        if (err < NativeError.KErrNone)
+        {
+            throw new MediaException(
+                "Realize failed, Symbian OS error: " + err);
+        }
+    }
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public void doPrefetch() throws MediaException
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doPrefetch");
+        synchronized (iPrefetchLockObject)
+        {
+            if (PREFETCHED == getState())
+                return;
+            synchronized (iLockObject)
+            {
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doPrefetch inside try"+Thread.currentThread().getName());
+                //int retval[] = new int[1];
+                int err = _prefetch(ManagerImpl.getEventSource(), iPlayerHandle);
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doPrefetch err = " + err);
+                if (err < NativeError.KErrNone)
+                {
+                    throw new MediaException(
+                        "Prefetch failed, Symbian OS error: " + err);
+                }
+                if (iWaitFlag)
+                {
+                    try
+                    {
+                        // wait until actionCompleted( int aError ) is called
+                        iLockObject.wait();
+                    }
+                    catch (InterruptedException ie)
+                    {
+                        // cannot occur
+                    }
+                }
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doPrefetch Sync end");
+            } // end   synchronized (iLockObject)
+        }
+
+        if (iError < NativeError.KErrNone)
+        {
+            throw new MediaException(
+                "Prefetch failed, Symbian OS error: " + iError);
+        }
+    }
+
+    /**
+     * Notify that action is completed. Called from native side.
+     * @param aError error code
+     */
+    private void actionCompleted(int aError)
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"actionCompleted callback11 aError ="+ aError + "    "+Thread.currentThread().getName());
+        iError = aError;
+
+        synchronized (iLockObject)
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"actionCompleted callback inside synchronized (iLockObject)");
+            iLockObject.notify();
+        }
+    }
+
+    private void actionCompletedFile()
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : actionCompletedFile");
+        iWaitFlag = false;
+
+    }
+
+    private void actionCompletedStart()
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : actionCompletedStart");
+        iStartWaitFlag = false;
+
+    }
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public void doDeallocate()
+    {
+        int ret = _deallocate(ManagerImpl.getEventSource(), iPlayerHandle);
+        if (ret < NativeError.KErrNone)
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,
+                       "_deallocate() failed: err=" + ret);
+        }
+    }
+
+    /**
+     * From Player.
+     * @see Player
+     */
+    public void start() throws MediaException
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : start()");
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : start() outside if(iSPrefetchOngoing)");
+        prefetch();
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl, start, state = "+getState());
+        // Only preteched player may be started. If player is already started
+        // this method returns silently.
+        if (getState() == PREFETCHED)
+        {
+            synchronized (iLockObject)
+            {
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl, before calling native _start() thread is =" +Thread.currentThread().getName());
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl, before calling native _start()");
+                int err = _start(ManagerImpl.getEventSource(), iPlayerHandle);
+                Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl, before calling native _start( ) returned : err = "+err);
+                if (err < NativeError.KErrNone)
+                {
+                    throw new MediaException(
+                        "Start failed, Symbian OS error: " + err);
+                }
+                if (iError < NativeError.KErrNone)
+                {
+                    throw new MediaException(
+                        "Start failed, Symbian OS error: " + iError);
+                }
+                if (iStartWaitFlag)
+                {
+                    try
+                    {
+                        // wait until actionCompleted( int aError ) is called
+                        iLockObject.wait();   // only for tck run
+                    }
+                    catch (InterruptedException ie)
+                    {
+                        // cannot occur
+                    }
+
+                }
+            }
+        }
+    }
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public void doStop() throws MediaException
+    {
+        /*
+        Stops the Player. It will pause the playback at the current media time.
+        Calling start will resume the playback from where it is stopped.
+        If stop is called on a stopped Player, the request is ignored.
+        */
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doStop()");
+        int err = _stop(ManagerImpl.getEventSource(), iPlayerHandle);
+        if (err < NativeError.KErrNone)
+        {
+            throw new MediaException(
+                "Stop failed, Symbian OS error: " + err);
+        }
+        // After this request is completed,
+        // the Player is in the PREFETCHED state.
+    }
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public void doClose()
+    {
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doclose() 1");
+        _close(ManagerImpl.getEventSource(), iPlayerHandle);
+
+        if (iPlayerHandle > NativeError.KErrNone)  // construction has succeed
+        {
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doclose() 2");
+            // notify the controls
+            iControls.dispose();
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doclose() 3");
+
+            // delete the native object
+            _dispose(ManagerImpl.getEventSource(), iPlayerHandle);
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerImpl.java : doclose() 4");
+            iPlayerHandle = 0; // Do not use native object anymore
+        }
+    }
+    /**
+     * interface Player
+     * @see Player
+     */
+    public void setLoopCount(int aCount)
+    {
+        super.setLoopCount(aCount);
+        _setLoopCount(ManagerImpl.getEventSource(), iPlayerHandle, aCount);
+    }
+
+    /**
+     * interface Player
+     * @see Player
+     */
+    public long getDuration()
+    {
+        closeCheck();
+        long duration = _duration(ManagerImpl.getEventSource(), iPlayerHandle);
+        if (duration < NativeError.KErrNone)
+        {
+            duration = TIME_UNKNOWN;
+        }
+        return duration;
+    }
+
+    /**
+     * From PlayerBase
+     * @see PlayerBase
+     */
+    public long setMediaTime(long aNow) throws MediaException
+    {
+        long time = _setMediaTime(ManagerImpl.getEventSource(),
+                                  iPlayerHandle,
+                                  super.setMediaTime(aNow));
+        if (time < NativeError.KErrNone)
+        {
+            throw new MediaException(
+                "Could not set media time, Symbian OS error: " + time);
+        }
+        return time;
+    }
+
+    /**
+     * interface Player
+     * @see Player
+     */
+    public long getMediaTime()
+    {
+        closeCheck();
+        long time = _getMediaTime(ManagerImpl.getEventSource(), iPlayerHandle);
+        if (time < NativeError.KErrNone)
+        {
+            time = TIME_UNKNOWN;
+        }
+        return time;
+    }
+
+
+    /**
+     * interface Player
+     * @see Player
+     */
+    public String getContentType()
+    {
+        closeCheck();
+        unrealizedCheck();
+
+        return _getContentType(iPlayerHandle);
+    }
+
+    // JNI
+    private native int _initPlayer(Object aPlayerListenerObject,
+                                   int aEventSource,
+                                   int aPlayerHandle);
+
+    private static native int _start(int aEventPoster, int aPlayer);
+    private static native int _stop(int aEventPoster, int aPlayer);
+    private static native int _close(int aEventPoster, int aPlayer);
+    private static native int _prefetch(int aEventPoster, int aPlayer);
+
+    private static native int _setLoopCount(int aEventPoster, int aPlayer,
+                                            int aLoopCount);
+
+    private static native int _realize(int aEventPoster, int aPlayer);
+    private static native long _duration(int aEventPoster, int aPlayer);
+    private static native long _setMediaTime(int aEventPoster, int aPlayer,
+            long aNow);
+
+    private static native int _deallocate(int aEventPoster, int aPlayer);
+    private static native long _getMediaTime(int aEventPoster, int aPlayer);
+    private static native int _getState(int aEventPoster, int aPlayer);
+
+    protected static native int _addSourceStream(int aEventPoster,
+            int aPlayerHandle,
+            Object aSourceStreamReader);
+
+    private static native String _getContentType(int aPlayerHandle);
+
+    private static native void _dispose(int aEventSourceHandle,
+                                        int aObjectHandle);
+}
+
+// End of File