[vlc-commits] chromecast: keep track of the state of the device
Steve Lhomme
git at videolan.org
Fri Mar 25 09:06:42 CET 2016
vlc | branch: master | Steve Lhomme <robux4 at videolabs.io> | Mon Mar 21 16:06:14 2016 +0100| [f9c31fa0b109660025f62108eeb0126723ddc7b2] | committer: Jean-Baptiste Kempf
chromecast: keep track of the state of the device
It can be either Idle, Playing, Buffering or Paused
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f9c31fa0b109660025f62108eeb0126723ddc7b2
---
modules/stream_out/chromecast/chromecast.h | 8 +++
modules/stream_out/chromecast/chromecast_ctrl.cpp | 55 ++++++++++++++++++---
2 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h
index 5b0e947..d817528 100644
--- a/modules/stream_out/chromecast/chromecast.h
+++ b/modules/stream_out/chromecast/chromecast.h
@@ -59,6 +59,13 @@ enum connection_status
CHROMECAST_CONNECTION_DEAD,
};
+enum receiver_state {
+ RECEIVER_IDLE,
+ RECEIVER_PLAYING,
+ RECEIVER_BUFFERING,
+ RECEIVER_PAUSED,
+};
+
struct intf_sys_t
{
intf_sys_t(vlc_object_t * const p_this);
@@ -71,6 +78,7 @@ struct intf_sys_t
std::string appTransportId;
std::string mediaSessionId;
+ receiver_state receiverState;
int i_sock_fd;
vlc_tls_creds_t *p_creds;
diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp
index dc6d503..c2639c5 100644
--- a/modules/stream_out/chromecast/chromecast_ctrl.cpp
+++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
@@ -241,6 +241,7 @@ void intf_sys_t::buildMessage(const std::string & namespace_,
*****************************************************************************/
intf_sys_t::intf_sys_t(vlc_object_t * const p_this)
: p_module(p_this)
+ , receiverState(RECEIVER_IDLE)
, p_tls(NULL)
, conn_status(CHROMECAST_DISCONNECTED)
, i_receiver_requestId(0)
@@ -319,6 +320,7 @@ void intf_sys_t::disconnectChromecast()
setConnectionStatus(CHROMECAST_DISCONNECTED);
appTransportId = "";
mediaSessionId = ""; // this session is not valid anymore
+ receiverState = RECEIVER_IDLE;
}
}
@@ -575,18 +577,55 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg)
status[0]["playerState"].operator const char *(),
(int)(json_int_t) status[0]["mediaSessionId"]);
- char session_id[32];
- if( snprintf( session_id, sizeof(session_id), "%" PRId64, (json_int_t) status[0]["mediaSessionId"] ) >= (int)sizeof(session_id) )
+ vlc_mutex_locker locker(&lock);
+ receiver_state oldPlayerState = receiverState;
+ std::string newPlayerState = status[0]["playerState"].operator const char *();
+
+ if (newPlayerState == "IDLE")
+ receiverState = RECEIVER_IDLE;
+ else if (newPlayerState == "PLAYING")
+ receiverState = RECEIVER_PLAYING;
+ else if (newPlayerState == "BUFFERING")
+ receiverState = RECEIVER_BUFFERING;
+ else if (newPlayerState == "PAUSED")
+ receiverState = RECEIVER_PAUSED;
+ else if (!newPlayerState.empty())
+ msg_Warn( p_module, "Unknown Chromecast state %s", newPlayerState.c_str());
+
+ if (receiverState == RECEIVER_IDLE)
+ mediaSessionId = ""; // this session is not valid anymore
+ else
{
- msg_Err( p_module, "snprintf() truncated string for mediaSessionId" );
- session_id[sizeof(session_id) - 1] = '\0';
- }
- if (!mediaSessionId.empty() && session_id[0] && mediaSessionId != session_id) {
- msg_Warn( p_module, "different mediaSessionId detected %s was %s", mediaSessionId.c_str(), this->mediaSessionId.c_str());
+ char session_id[32];
+ if( snprintf( session_id, sizeof(session_id), "%" PRId64, (json_int_t) status[0]["mediaSessionId"] ) >= (int)sizeof(session_id) )
+ {
+ msg_Err( p_module, "snprintf() truncated string for mediaSessionId" );
+ session_id[sizeof(session_id) - 1] = '\0';
+ }
+ if (!mediaSessionId.empty() && session_id[0] && mediaSessionId != session_id) {
+ msg_Warn( p_module, "different mediaSessionId detected %s was %s", mediaSessionId.c_str(), this->mediaSessionId.c_str());
+ }
+
+ mediaSessionId = session_id;
}
- mediaSessionId = session_id;
+ if (receiverState != oldPlayerState)
+ {
+#ifndef NDEBUG
+ msg_Dbg( p_module, "change Chromecast player state from %d to %d", oldPlayerState, receiverState);
+#endif
+ switch( receiverState )
+ {
+ case RECEIVER_PAUSED:
+#ifndef NDEBUG
+ msg_Dbg( p_module, "Playback paused");
+#endif
+ break;
+ case RECEIVER_IDLE:
+ break;
+ }
+ }
}
else if (type == "LOAD_FAILED")
{
More information about the vlc-commits
mailing list