upnp: ask if user wishes to stop playback on remote device on stop
authorJoakim Plate <elupus@ecce.se>
Mon, 13 Jan 2014 20:43:42 +0000 (21:43 +0100)
committerJoakim Plate <elupus@ecce.se>
Mon, 13 Jan 2014 21:49:38 +0000 (22:49 +0100)
This allow user to detach from a remote upnp player without
stopping playback.

language/English/strings.po
xbmc/Application.cpp
xbmc/network/upnp/UPnPPlayer.cpp
xbmc/network/upnp/UPnPPlayer.h

index 0b15eb7..93698b3 100755 (executable)
@@ -15014,3 +15014,13 @@ msgstr ""
 msgctxt "#37021"
 msgid "Set GUI resolution limit"
 msgstr ""
+
+#: xbmc/network/upnp/UPnPPlayer.cpp
+msgctxt "#37022"
+msgid "UPnP Player"
+msgstr ""
+
+#: xbmc/network/upnp/UPnPPlayer.cpp
+msgctxt "#37023"
+msgid "Do you wish to stop playback on the remote device?"
+msgstr ""
index 0b6ebef..1072efc 100644 (file)
@@ -2630,7 +2630,8 @@ bool CApplication::OnAction(const CAction &action)
 
   // Now check with the player if action can be handled.
   if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO ||
-      (g_windowManager.GetActiveWindow() == WINDOW_DIALOG_VIDEO_OSD && (action.GetID() == ACTION_NEXT_ITEM || action.GetID() == ACTION_PREV_ITEM || action.GetID() == ACTION_CHANNEL_UP || action.GetID() == ACTION_CHANNEL_DOWN)))
+      (g_windowManager.GetActiveWindow() == WINDOW_DIALOG_VIDEO_OSD && (action.GetID() == ACTION_NEXT_ITEM || action.GetID() == ACTION_PREV_ITEM || action.GetID() == ACTION_CHANNEL_UP || action.GetID() == ACTION_CHANNEL_DOWN)) ||
+      action.GetID() == ACTION_STOP)
   {
     if (m_pPlayer->OnAction(action))
       return true;
index a5712c4..3327fca 100644 (file)
@@ -37,6 +37,8 @@
 #include "Application.h"
 #include "dialogs/GUIDialogBusy.h"
 #include "guilib/GUIWindowManager.h"
+#include "guilib/Key.h"
+#include "dialogs/GUIDialogYesNo.h"
 
 
 NPT_SET_LOCAL_LOGGER("xbmc.upnp.player")
@@ -161,6 +163,7 @@ CUPnPPlayer::CUPnPPlayer(IPlayerCallback& callback, const char* uuid)
 , m_control(NULL)
 , m_delegate(NULL)
 , m_started(false)
+, m_stopremote(false)
 {
   m_control  = CUPnP::GetInstance()->m_MediaController;
 
@@ -301,6 +304,7 @@ bool CUPnPPlayer::OpenFile(const CFileItem& file, const CPlayerOptions& options)
                                     , m_delegate), failed);
   }
 
+  m_stopremote = true;
   m_started = true;
   m_callback.OnPlayBackStarted();
   NPT_CHECK_LABEL_SEVERE(m_control->GetPositionInfo(m_delegate->m_device
@@ -360,12 +364,21 @@ failed:
 bool CUPnPPlayer::CloseFile(bool reopen)
 {
   NPT_CHECK_POINTER_LABEL_SEVERE(m_delegate, failed);
-  NPT_CHECK_LABEL(m_control->Stop(m_delegate->m_device
-                                , m_delegate->m_instance
-                                , m_delegate), failed);
-  if(!m_delegate->m_resevent.WaitMSec(10000)) goto failed;
-  NPT_CHECK_LABEL(m_delegate->m_resstatus, failed);
-  m_callback.OnPlayBackStopped();
+  if(m_stopremote)
+  {
+    NPT_CHECK_LABEL(m_control->Stop(m_delegate->m_device
+                                  , m_delegate->m_instance
+                                  , m_delegate), failed);
+    if(!m_delegate->m_resevent.WaitMSec(10000)) goto failed;
+    NPT_CHECK_LABEL(m_delegate->m_resstatus, failed);
+  }
+
+  if(m_started)
+  {
+    m_started = false;
+    m_callback.OnPlayBackStopped();
+  }
+
   return true;
 failed:
   CLog::Log(LOGERROR, "UPNP: CUPnPPlayer::CloseFile - unable to stop playback");
@@ -509,4 +522,22 @@ CStdString CUPnPPlayer::GetPlayingTitle()
   return "";
 };
 
+bool CUPnPPlayer::OnAction(const CAction &action)
+{
+  switch (action.GetID())
+  {
+    case ACTION_STOP:
+      if(IsPlaying())
+      {
+        if(CGUIDialogYesNo::ShowAndGetInput(37022, 37023, 0, 0)) /* stop on remote system */
+          m_stopremote = true;
+        else
+          m_stopremote = false;
+        return false; /* let normal code handle the action */
+      }
+    default:
+      return false;
+  }
+}
+
 } /* namespace UPNP */
index b8c721c..81bb93b 100644 (file)
@@ -68,7 +68,7 @@ public:
   virtual bool IsCaching() const {return false;};
   virtual int GetCacheLevel() const {return -1;};
   virtual void DoAudioWork();
-
+  virtual bool OnAction(const CAction &action);
 
   virtual CStdString GetPlayingTitle();
 
@@ -78,6 +78,7 @@ private:
   CStdString             m_current_uri;
   CStdString             m_current_meta;
   bool                   m_started;
+  bool                   m_stopremote;
 };
 
 } /* namespace UPNP */