src/3rdparty/phonon/mmf/audioplayer.cpp
changeset 18 2f34d5167611
parent 3 41300fa6a67c
child 14 c0432d11811c
--- a/src/3rdparty/phonon/mmf/audioplayer.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/src/3rdparty/phonon/mmf/audioplayer.cpp	Fri Apr 16 15:50:13 2010 +0300
@@ -34,13 +34,9 @@
 // Constructor / destructor
 //-----------------------------------------------------------------------------
 
-MMF::AudioPlayer::AudioPlayer()
-{
-    construct();
-}
-
-MMF::AudioPlayer::AudioPlayer(const AbstractPlayer& player)
-        : AbstractMediaPlayer(player)
+MMF::AudioPlayer::AudioPlayer(MediaObject *parent, const AbstractPlayer *player)
+        :   AbstractMediaPlayer(parent, player)
+        ,   m_totalTime(0)
 {
     construct();
 }
@@ -50,10 +46,10 @@
     TRACE_CONTEXT(AudioPlayer::AudioPlayer, EAudioApi);
     TRACE_ENTRY_0();
 
-    TRAPD(err, m_player.reset(CPlayerType::NewL(*this, 0, EMdaPriorityPreferenceNone)));
-    if (KErrNone != err) {
-        changeState(ErrorState);
-    }
+    NativePlayer *player = 0;
+    QT_TRAP_THROWING(player = NativePlayer::NewL(*this, 0, EMdaPriorityPreferenceNone));
+    m_player.reset(player);
+    m_player->RegisterForAudioLoadingNotification(*this);
 
     TRACE_EXIT_0();
 }
@@ -66,6 +62,11 @@
     TRACE_EXIT_0();
 }
 
+MMF::AudioPlayer::NativePlayer *MMF::AudioPlayer::nativePlayer() const
+{
+    return m_player.data();
+}
+
 //-----------------------------------------------------------------------------
 // Public API
 //-----------------------------------------------------------------------------
@@ -125,6 +126,24 @@
     return err;
 }
 
+int MMF::AudioPlayer::openUrl(const QString& /*url*/)
+{
+    // Streaming playback is generally not supported by the implementation
+    // of the audio player API, so we use CVideoPlayerUtility for both
+    // audio and video streaming.
+    Utils::panic(AudioUtilityUrlNotSupported);
+
+    // Silence warning
+    return 0;
+}
+
+int MMF::AudioPlayer::bufferStatus() const
+{
+    int result = 0;
+    TRAP_IGNORE(m_player->GetAudioLoadingProgressL(result));
+    return result;
+}
+
 void MMF::AudioPlayer::close()
 {
     m_player->Close();
@@ -151,7 +170,7 @@
 
         // If we don't cast away constness here, we simply have to ignore
         // the error.
-        const_cast<AudioPlayer*>(this)->setError(NormalError);
+        const_cast<AudioPlayer*>(this)->setError(tr("Getting position failed"), err);
     }
 
     return result;
@@ -159,7 +178,7 @@
 
 qint64 MMF::AudioPlayer::totalTime() const
 {
-    return toMilliSeconds(m_player->Duration());
+    return m_totalTime;
 }
 
 
@@ -182,12 +201,12 @@
 
     if (KErrNone == aError) {
         maxVolumeChanged(m_player->MaxVolume());
-        emit totalTimeChanged(totalTime());
+        m_totalTime = toMilliSeconds(m_player->Duration());
+        emit totalTimeChanged(m_totalTime);
         updateMetaData();
         changeState(StoppedState);
     } else {
-        // TODO: set different error states according to value of aError?
-        setError(NormalError);
+        setError(tr("Opening clip failed"), aError);
     }
 
     TRACE_EXIT_0();
@@ -202,42 +221,13 @@
     TRACE_CONTEXT(AudioPlayer::MapcPlayComplete, EAudioInternal);
     TRACE_ENTRY("state %d error %d", state(), aError);
 
-    stopTickTimer();
-
-    if (KErrNone == aError) {
-        changeState(StoppedState);
-        // TODO: move on to m_nextSource
-    } else {
-        // TODO: do something with aError?
-        setError(NormalError);
-    }
-
-    /*
-        if (aError == KErrNone) {
-            if (m_nextSource.type() == MediaSource::Empty) {
-                emit finished();
-            } else {
-                setSource(m_nextSource);
-                m_nextSource = MediaSource();
-            }
-
-            changeState(StoppedState);
-        }
-        else {
-            m_error = NormalError;
-            changeState(ErrorState);
-        }
-    */
+    // Call base class function which handles end of playback for both
+    // audio and video clips.
+    playbackComplete(aError);
 
     TRACE_EXIT_0();
 }
 
-CPlayerType *MMF::AudioPlayer::player() const
-{
-    return m_player.data();
-}
-
-
 #ifdef QT_PHONON_MMF_AUDIO_DRM
 void MMF::AudioPlayer::MaloLoadingStarted()
 {
@@ -252,6 +242,21 @@
 
 
 //-----------------------------------------------------------------------------
+// MAudioLoadingObserver callbacks
+//-----------------------------------------------------------------------------
+
+void MMF::AudioPlayer::MaloLoadingStarted()
+{
+    bufferingStarted();
+}
+
+void MMF::AudioPlayer::MaloLoadingComplete()
+{
+    bufferingComplete();
+}
+
+
+//-----------------------------------------------------------------------------
 // Private functions
 //-----------------------------------------------------------------------------