vlc | branch: master | Steve Lhomme <[email protected]> | Thu Apr 28 14:18:37 2016 +0200| [2db0901b35c39cc47b10a9a2daef3f9f1f4ee107] | committer: Thomas Guillem
chromecast: tell the control class when there's a file to play or not Signed-off-by: Thomas Guillem <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2db0901b35c39cc47b10a9a2daef3f9f1f4ee107 --- modules/stream_out/chromecast/chromecast.h | 3 + modules/stream_out/chromecast/chromecast_ctrl.cpp | 63 +++++++++++++++++---- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h index a8ab0be..4252ccf 100644 --- a/modules/stream_out/chromecast/chromecast.h +++ b/modules/stream_out/chromecast/chromecast.h @@ -81,6 +81,8 @@ struct intf_sys_t intf_sys_t(vlc_object_t * const p_this, int local_port, std::string device_addr, int device_port = 0); ~intf_sys_t(); + void setHasInput( bool has_input, const std::string mime_type = ""); + vlc_object_t * const p_module; const int i_port; std::string serverIP; @@ -172,6 +174,7 @@ private: unsigned i_receiver_requestId; unsigned i_requestId; + bool has_input; static void* ChromecastThread(void* p_data); }; diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp index e0f8b36..ba8599a 100644 --- a/modules/stream_out/chromecast/chromecast_ctrl.cpp +++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp @@ -106,6 +106,7 @@ intf_sys_t::intf_sys_t(vlc_object_t * const p_this, int port, std::string device , cmd_status(NO_CMD_PENDING) , i_receiver_requestId(0) , i_requestId(0) + , has_input(false) { vlc_mutex_init(&lock); vlc_cond_init(&loadCommandCond); @@ -120,6 +121,8 @@ intf_sys_t::intf_sys_t(vlc_object_t * const p_this, int port, std::string device intf_sys_t::~intf_sys_t() { + setHasInput( false ); + switch (getConnectionStatus()) { case CHROMECAST_APP_STARTED: @@ -142,6 +145,40 @@ intf_sys_t::~intf_sys_t() vlc_mutex_destroy(&lock); } +void intf_sys_t::setHasInput( bool b_has_input, const std::string mime_type ) +{ + vlc_mutex_locker locker(&lock); + msg_Dbg( p_module, "setHasInput device:%s session:%s", + targetIP.c_str(), mediaSessionId.c_str() ); + + this->has_input = b_has_input; + this->mime = mime_type; + + if( this->has_input ) + { + mutex_cleanup_push(&lock); + while (conn_status != CHROMECAST_APP_STARTED && conn_status != CHROMECAST_CONNECTION_DEAD) + { + msg_Dbg( p_module, "setHasInput waiting for Chromecast connection, current %d", conn_status); + vlc_cond_wait(&loadCommandCond, &lock); + } + vlc_cleanup_pop(); + + if (conn_status == CHROMECAST_CONNECTION_DEAD) + { + msg_Warn( p_module, "no Chromecast hook possible"); + return; + } + + if ( receiverState == RECEIVER_IDLE ) + { + // we cannot start a new load when the last one is still processing + msgPlayerLoad(); + setPlayerStatus(CMD_LOAD_SENT); + } + } +} + /** * @brief Connect to the Chromecast * @return the opened socket file descriptor or -1 on error @@ -390,9 +427,10 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg) { msgConnect(appTransportId); setConnectionStatus(CHROMECAST_APP_STARTED); - msgPlayerLoad(); - setPlayerStatus(CMD_LOAD_SENT); - vlc_cond_signal(&loadCommandCond); + } + else + { + msgPlayerGetStatus(); } } else @@ -497,10 +535,18 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg) break; case RECEIVER_IDLE: - setPlayerStatus(NO_CMD_PENDING); + if ( has_input ) + setPlayerStatus(NO_CMD_PENDING); break; } } + + if ( cmd_status != CMD_LOAD_SENT && receiverState == RECEIVER_IDLE && has_input ) + { + msg_Dbg( p_module, "the device missed the LOAD command"); + msgPlayerLoad(); + setPlayerStatus(CMD_LOAD_SENT); + } } else if (type == "LOAD_FAILED") { @@ -533,6 +579,7 @@ void intf_sys_t::processMessage(const castchannel::CastMessage &msg) if (type == "CLOSE") { msg_Warn( p_module, "received close message"); + setHasInput( false ); vlc_mutex_locker locker(&lock); setConnectionStatus(CHROMECAST_CONNECTION_DEAD); } @@ -625,21 +672,15 @@ void intf_sys_t::msgPlayerGetStatus() void intf_sys_t::msgPlayerLoad() { - char *psz_mime = var_InheritString(p_module, CONTROL_CFG_PREFIX "mime"); - if (psz_mime == NULL) - return; - std::stringstream ss; ss << "{\"type\":\"LOAD\"," << "\"media\":{\"contentId\":\"http://" << serverIP << ":" << i_port << "/stream\"," << "\"streamType\":\"LIVE\"," - << "\"contentType\":\"" << std::string(psz_mime) << "\"}," + << "\"contentType\":\"" << mime << "\"}," << "\"requestId\":" << i_requestId++ << "}"; - free(psz_mime); - pushMediaPlayerMessage( ss ); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
