Fix for sound not played after resuming widget
authorPiotr Grad <p.grad@samsung.com>
Mon, 30 Sep 2013 15:08:25 +0000 (17:08 +0200)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Fri, 11 Oct 2013 05:12:41 +0000 (05:12 +0000)
[Title] Sound not played after resuming application when clicking play, just after resume.
[Issue] N_SE-51493
[Problem] Suspend method from HTMLMediaElement was causing gstreamer state change to NULL, so that further play trigger was not working
[Solution] Prevent from changing network and ready states when player is suspended, fixed paused method (paused means "not playing" for HTMLMediaElement).
           Add guard for seek method (seek can be performed only when GStreamer is in playing or paused state. Updated suspend time when seeking. When in suspend state suspendTime is returned.

Change-Id: I318221b351ae1b93701ff07200b8d5524831e92f

Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

index 8bdd49b..224bf2a 100755 (executable)
@@ -3968,8 +3968,8 @@ void HTMLMediaElement::suspend(ReasonForSuspension why)
 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
             if (shouldSuspendMedia()) {
                 pause();
-                m_player->suspend();
                 m_suspended = true;
+                m_player->suspend();
             }
 #endif
             break;
index 656c2fc..31ac3a6 100755 (executable)
@@ -335,6 +335,7 @@ MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player)
     , m_webkitVideoSink(0)
 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
     , m_videoSinkBin(0)
+    , m_suspended(false)
 #endif
     , m_fpsSink(0)
     , m_source(0)
@@ -666,6 +667,10 @@ float MediaPlayerPrivateGStreamer::currentTime() const
     if (m_seeking)
         return m_seekTime;
 
+#if ENABLE(TIZEN_GSTREAMER_VIDEO)
+    if(m_suspended)
+        return m_suspendTime;
+#endif
     // Workaround for
     // https://bugzilla.gnome.org/show_bug.cgi?id=639941 In GStreamer
     // 0.10.35 basesink reports wrong duration in case of EOS and
@@ -690,9 +695,23 @@ void MediaPlayerPrivateGStreamer::seek(float time)
 #if ENABLE(TIZEN_DLOG_SUPPORT)
     TIZEN_LOGI("Seek attempt to %f secs", time);
 #endif
-
+#if ENABLE(TIZEN_GSTREAMER_VIDEO)
+    GstState state;
+    GstState pending;
+    gst_element_get_state(m_playBin.get(), &state, &pending, 0);
+    m_suspendTime = time;
+    if (state < GST_STATE_PAUSED) {
+        m_seekTime = time;
+        if (pending < GST_STATE_PAUSED)
+            gst_element_set_state(m_playBin.get(), GST_STATE_PAUSED);
+        return;
+    }
+    // Avoid useless seeking.
+    if (time == currentTime() && !m_suspended)
+#else
     // Avoid useless seeking.
     if (time == currentTime())
+#endif
         return;
 
     // Extract the integer part of the time (seconds) and the
@@ -739,7 +758,11 @@ bool MediaPlayerPrivateGStreamer::paused() const
 
     GstState state;
     gst_element_get_state(m_playBin.get(), &state, 0, 0);
+#if ENABLE(TIZEN_GSTREAMER_VIDEO)
+    return state != GST_STATE_PLAYING;
+#else
     return state == GST_STATE_PAUSED;
+#endif
 }
 
 bool MediaPlayerPrivateGStreamer::seeking() const
@@ -1081,6 +1104,12 @@ gboolean MediaPlayerPrivateGStreamer::handleMessage(GstMessage* message)
         LOG_MEDIA_MESSAGE("End of Stream");
         didEnd();
         break;
+#if ENABLE(TIZEN_GSTREAMER_VIDEO)
+    case GST_MESSAGE_ASYNC_DONE:
+        if (!isLocalMediaStream())
+            updateStates();
+        break;
+#endif
     case GST_MESSAGE_STATE_CHANGED:
         // Ignore state changes if load is delayed (preload=none). The
         // player state will be updated once commitLoad() is called.
@@ -1106,10 +1135,11 @@ gboolean MediaPlayerPrivateGStreamer::handleMessage(GstMessage* message)
 
 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
             HTMLMediaElement* element = static_cast<HTMLMediaElement*>(player()->mediaPlayerClient());
-            if (element->suspended() && newState == GST_STATE_PAUSED) {
-                if (m_suspendTime > 0 && !(isLocalMediaStream() || m_isEndReached))
+            if (element->suspended() && newState >= GST_STATE_PAUSED && oldState < GST_STATE_PAUSED) {
+                if (!isLocalMediaStream())
                     seek(m_suspendTime);
                 m_suspendTime = 0;
+                m_suspended = false;
                 m_player->mediaPlayerClient()->setSuspended(false);
             }
 #endif
@@ -1410,6 +1440,13 @@ void MediaPlayerPrivateGStreamer::updateStates()
     GstState state;
     GstState pending;
 
+#if ENABLE(TIZEN_GSTREAMER_VIDEO)
+    HTMLMediaElement* element = static_cast<HTMLMediaElement*>(player()->mediaPlayerClient());
+    if (element->suspended()) {
+        return;
+    }
+#endif
+
     GstStateChangeReturn ret = gst_element_get_state(m_playBin.get(),
         &state, &pending, 250 * GST_NSECOND);
 
@@ -2469,6 +2506,7 @@ void MediaPlayerPrivateGStreamer::setProxy(GstElement* source)
 void MediaPlayerPrivateGStreamer::suspend()
 {
     m_suspendTime = currentTime();
+    m_suspended = true;
     gst_element_set_state(m_playBin.get(), GST_STATE_NULL);
 #if ENABLE(TIZEN_GSTREAMER_AUDIO)
     if (m_audioSessionManager)
index bc781c9..c76ede2 100644 (file)
@@ -265,6 +265,7 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface
 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
             GstBufferingMode m_bufferingMode;
             float m_suspendTime;
+            bool m_suspended;
 #endif
     };
 }