[vlc-commits] chromecast: keep track of the last command sent to the device

Steve Lhomme git at videolan.org
Fri Mar 25 09:06:43 CET 2016


vlc | branch: master | Steve Lhomme <robux4 at videolabs.io> | Mon Mar 21 16:17:31 2016 +0100| [a3d86a75c02b5bbb059a628db232162deac15f20] | committer: Jean-Baptiste Kempf

chromecast: keep track of the last command sent to the device

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a3d86a75c02b5bbb059a628db232162deac15f20
---

 modules/stream_out/chromecast/chromecast.h        |   22 ++++++++++++++++++++-
 modules/stream_out/chromecast/chromecast_ctrl.cpp |   14 +++++++++----
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h
index d817528..2031fee 100644
--- a/modules/stream_out/chromecast/chromecast.h
+++ b/modules/stream_out/chromecast/chromecast.h
@@ -55,10 +55,16 @@ enum connection_status
     CHROMECAST_TLS_CONNECTED,
     CHROMECAST_AUTHENTICATED,
     CHROMECAST_APP_STARTED,
-    CHROMECAST_MEDIA_LOAD_SENT,
     CHROMECAST_CONNECTION_DEAD,
 };
 
+enum command_status {
+    NO_CMD_PENDING,
+    CMD_LOAD_SENT,
+    CMD_PLAYBACK_SENT,
+    CMD_SEEK_SENT,
+};
+
 enum receiver_state {
     RECEIVER_IDLE,
     RECEIVER_PLAYING,
@@ -131,6 +137,11 @@ struct intf_sys_t
 
     void processMessage(const castchannel::CastMessage &msg);
 
+    command_status getPlayerStatus() const
+    {
+        return cmd_status;
+    }
+
 private:
     int sendMessage(const castchannel::CastMessage &msg);
 
@@ -141,7 +152,16 @@ private:
 
     void pushMediaPlayerMessage(const std::stringstream & payload);
 
+    void setPlayerStatus(enum command_status status) {
+        if (cmd_status != status)
+        {
+            msg_Dbg(p_module, "change Chromecast command status from %d to %d", cmd_status, status);
+            cmd_status = status;
+        }
+    }
+
     enum connection_status conn_status;
+    enum command_status    cmd_status;
 
     unsigned i_receiver_requestId;
     unsigned i_requestId;
diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp
index c2639c5..d741b48 100644
--- a/modules/stream_out/chromecast/chromecast_ctrl.cpp
+++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
@@ -171,7 +171,7 @@ int Open(vlc_object_t *p_module)
     // Lock the sout thread until we have sent the media loading command to the Chromecast.
     deadline = mdate() + 6 * CLOCK_FREQ;
     vlc_mutex_lock(&p_sys->lock);
-    while (p_sys->getConnectionStatus() != CHROMECAST_MEDIA_LOAD_SENT)
+    while (p_sys->getPlayerStatus() != CMD_LOAD_SENT)
     {
         int i_ret = vlc_cond_timedwait(&p_sys->loadCommandCond, &p_sys->lock, deadline);
         if (i_ret == ETIMEDOUT)
@@ -244,6 +244,7 @@ intf_sys_t::intf_sys_t(vlc_object_t * const p_this)
  , receiverState(RECEIVER_IDLE)
  , p_tls(NULL)
  , conn_status(CHROMECAST_DISCONNECTED)
+ , cmd_status(NO_CMD_PENDING)
  , i_receiver_requestId(0)
  , i_requestId(0)
 {
@@ -255,7 +256,6 @@ intf_sys_t::~intf_sys_t()
 {
     switch (getConnectionStatus())
     {
-    case CHROMECAST_MEDIA_LOAD_SENT:
     case CHROMECAST_APP_STARTED:
         // Generate the close messages.
         msgReceiverClose(appTransportId);
@@ -320,6 +320,7 @@ void intf_sys_t::disconnectChromecast()
         setConnectionStatus(CHROMECAST_DISCONNECTED);
         appTransportId = "";
         mediaSessionId = ""; // this session is not valid anymore
+        setPlayerStatus(NO_CMD_PENDING);
         receiverState = RECEIVER_IDLE;
     }
 }
@@ -521,7 +522,7 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg)
                     msgConnect(appTransportId);
                     setConnectionStatus(CHROMECAST_APP_STARTED);
                     msgPlayerLoad();
-                    setConnectionStatus(CHROMECAST_MEDIA_LOAD_SENT);
+                    setPlayerStatus(CMD_LOAD_SENT);
                     vlc_cond_signal(&loadCommandCond);
                 }
             }
@@ -531,7 +532,6 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg)
                 {
                 /* If the app is no longer present */
                 case CHROMECAST_APP_STARTED:
-                case CHROMECAST_MEDIA_LOAD_SENT:
                     msg_Warn( p_module, "app is no longer present. closing");
                     msgReceiverClose(appTransportId);
                     setConnectionStatus(CHROMECAST_CONNECTION_DEAD);
@@ -616,6 +616,11 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg)
 #endif
                 switch( receiverState )
                 {
+                case RECEIVER_PLAYING:
+                    /* TODO reset demux PCR ? */
+                    setPlayerStatus(CMD_PLAYBACK_SENT);
+                    break;
+
                 case RECEIVER_PAUSED:
 #ifndef NDEBUG
                     msg_Dbg( p_module, "Playback paused");
@@ -623,6 +628,7 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg)
                     break;
 
                 case RECEIVER_IDLE:
+                    setPlayerStatus(NO_CMD_PENDING);
                     break;
                 }
             }



More information about the vlc-commits mailing list