[vlc-devel] [PATCH] chromecast_ctrl: send messages right away

Steve Lhomme robux4 at videolabs.io
Tue Jan 5 11:21:00 CET 2016


The Chromecast protocol is not a client server, all requests don't get an
answer and we can receive unexpected broadcasts.
---
 modules/stream_out/chromecast/cast.cpp            |  3 --
 modules/stream_out/chromecast/chromecast.h        |  7 +--
 modules/stream_out/chromecast/chromecast_ctrl.cpp | 65 ++++++-----------------
 3 files changed, 17 insertions(+), 58 deletions(-)

diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp
index 29b02bb..052b685 100644
--- a/modules/stream_out/chromecast/cast.cpp
+++ b/modules/stream_out/chromecast/cast.cpp
@@ -286,8 +286,6 @@ static void Close(vlc_object_t *p_this)
         // ft
     case CHROMECAST_AUTHENTICATED:
         p_sys->p_intf->msgReceiverClose(DEFAULT_CHOMECAST_RECEIVER);
-        // Send the just added close messages.
-        p_sys->p_intf->sendMessages();
         // ft
     default:
         break;
@@ -328,7 +326,6 @@ static void* chromecastThread(void* p_data)
     sout_stream_sys_t* p_sys = p_stream->p_sys;
 
     p_sys->p_intf->msgAuth();
-    p_sys->p_intf->sendMessages();
     vlc_restorecancel(canc);
 
     while (1)
diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h
index d5ef655..f39c7d2 100644
--- a/modules/stream_out/chromecast/chromecast.h
+++ b/modules/stream_out/chromecast/chromecast.h
@@ -34,8 +34,6 @@
 #include <vlc_sout.h>
 #include <vlc_tls.h>
 
-#include <queue>
-
 #include "cast_channel.pb.h"
 
 #define PACKET_HEADER_LEN 4
@@ -77,7 +75,6 @@ struct intf_sys_t
     void msgReceiverClose(std::string destinationId);
 
     void handleMessages();
-    int sendMessages();
 
     connection_status getConnectionStatus() const
     {
@@ -108,12 +105,10 @@ struct intf_sys_t
 
     void msgPlayerLoad();
 
-    std::queue<castchannel::CastMessage> messagesToSend;
-
     void processMessage(const castchannel::CastMessage &msg);
 
 private:
-    int sendMessage(castchannel::CastMessage &msg);
+    int sendMessage(const castchannel::CastMessage &msg);
 
     void buildMessage(const std::string & namespace_,
                       const std::string & payload,
diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp
index 6110cd0..89a7958 100644
--- a/modules/stream_out/chromecast/chromecast_ctrl.cpp
+++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
@@ -88,7 +88,7 @@ void intf_sys_t::buildMessage(const std::string & namespace_,
     else // CastMessage_PayloadType_BINARY
         msg.set_payload_binary(payload);
 
-    messagesToSend.push(msg);
+    sendMessage(msg);
 }
 
 intf_sys_t::intf_sys_t(sout_stream_t * const p_this)
@@ -529,46 +529,29 @@ void intf_sys_t::msgPlayerLoad()
 /**
  * @brief Send a message to the Chromecast
  * @param msg the CastMessage to send
- * @return the number of bytes sent or -1 on error
+ * @return vlc error code
  */
-int intf_sys_t::sendMessage(castchannel::CastMessage &msg)
+int intf_sys_t::sendMessage(const castchannel::CastMessage &msg)
 {
-    uint32_t i_size = msg.ByteSize();
-    uint32_t i_sizeNetwork = hton32(i_size);
-
-    char *p_data = new(std::nothrow) char[PACKET_HEADER_LEN + i_size];
+    int i_size = msg.ByteSize();
+    uint8_t *p_data = new(std::nothrow) uint8_t[PACKET_HEADER_LEN + i_size];
     if (p_data == NULL)
-        return -1;
+        return VLC_ENOMEM;
 
-    memcpy(p_data, &i_sizeNetwork, PACKET_HEADER_LEN);
-    msg.SerializeWithCachedSizesToArray((uint8_t *)(p_data + PACKET_HEADER_LEN));
+#ifndef NDEBUG
+    msg_Dbg(p_stream, "sendMessage: %s->%s %s", msg.namespace_().c_str(), msg.destination_id().c_str(), msg.payload_utf8().c_str());
+#endif
 
+    SetDWBE(p_data, i_size);
+    msg.SerializeWithCachedSizesToArray(p_data + PACKET_HEADER_LEN);
+
+    vlc_mutex_locker locker(&lock);
     int i_ret = tls_Send(p_tls, p_data, PACKET_HEADER_LEN + i_size);
     delete[] p_data;
+    if (i_ret == PACKET_HEADER_LEN + i_size)
+        return VLC_SUCCESS;
 
-    return i_ret;
-}
-
-
-/**
- * @brief Send all the messages in the pending queue to the Chromecast
- * @param msg the CastMessage to send
- * @return the number of bytes sent or -1 on error
- */
-int intf_sys_t::sendMessages()
-{
-    int i_ret = 0;
-    while (!messagesToSend.empty())
-    {
-        unsigned i_retSend = sendMessage(messagesToSend.front());
-        if (i_retSend <= 0)
-            return i_retSend;
-
-        messagesToSend.pop();
-        i_ret += i_retSend;
-    }
-
-    return i_ret;
+    return VLC_EGENERIC;
 }
 
 void intf_sys_t::handleMessages()
@@ -615,21 +598,5 @@ void intf_sys_t::handleMessages()
         processMessage(msg);
     }
 
-    // Send the answer messages if there is any.
-    if (!messagesToSend.empty())
-    {
-        i_ret = sendMessages();
-#if defined(_WIN32)
-        if ((i_ret < 0 && WSAGetLastError() != WSAEWOULDBLOCK) || (i_ret == 0))
-#else
-        if ((i_ret < 0 && errno != EAGAIN) || i_ret == 0)
-#endif
-        {
-            msg_Err(p_stream, "The connection to the Chromecast died (sending).");
-            vlc_mutex_locker locker(&lock);
-            setConnectionStatus(CHROMECAST_CONNECTION_DEAD);
-        }
-    }
-
     vlc_restorecancel(canc);
 }
-- 
2.6.0.windows.1



More information about the vlc-devel mailing list