[vlc-devel] [PATCH 03/33] chromecast: move the message sending in a separate class

Steve Lhomme robux4 at gmail.com
Wed Dec 23 21:25:24 CET 2015


On Wed, Dec 23, 2015 at 4:25 PM, Hugo Beauzée-Luyssen <hugo at beauzee.fr> wrote:
> On 12/23/2015 12:58 PM, Steve Lhomme wrote:
>>
>> --
>> this class will handle all the Chromecast lifecycle in the future
>> ---
>>   modules/stream_out/Makefile.am                    |   1 +
>>   modules/stream_out/chromecast/cast.cpp            | 222
>> +++-------------------
>>   modules/stream_out/chromecast/chromecast.h        |  24 +++
>>   modules/stream_out/chromecast/chromecast_ctrl.cpp | 185
>> ++++++++++++++++++
>>   4 files changed, 241 insertions(+), 191 deletions(-)
>>   create mode 100644 modules/stream_out/chromecast/chromecast_ctrl.cpp
>>
>> diff --git a/modules/stream_out/Makefile.am
>> b/modules/stream_out/Makefile.am
>> index ee3ed3c..3661be6 100644
>> --- a/modules/stream_out/Makefile.am
>> +++ b/modules/stream_out/Makefile.am
>> @@ -81,6 +81,7 @@ SUFFIXES += .proto .pb.cc
>>         $(PROTOC) --cpp_out=. -I$(srcdir) $<
>>
>>   libstream_out_chromecast_plugin_la_SOURCES =
>> stream_out/chromecast/cast_channel.proto stream_out/chromecast/cast.cpp \
>> +                                stream_out/chromecast/chromecast_ctrl.cpp
>> \
>>                                   misc/webservices/json.h
>> misc/webservices/json.c
>>   nodist_libstream_out_chromecast_plugin_la_SOURCES =
>> stream_out/chromecast/cast_channel.pb.cc
>>   libstream_out_chromecast_plugin_la_CPPFLAGS = $(AM_CPPFLAGS)
>> -Istream_out/chromecast $(CHROMECAST_CFLAGS)
>> diff --git a/modules/stream_out/chromecast/cast.cpp
>> b/modules/stream_out/chromecast/cast.cpp
>> index 3879091..52b0325 100644
>> --- a/modules/stream_out/chromecast/cast.cpp
>> +++ b/modules/stream_out/chromecast/cast.cpp
>> @@ -42,9 +42,6 @@
>>
>>   #include <cerrno>
>>
>> -#include <sstream>
>> -#include <queue>
>> -
>>   #include <google/protobuf/io/zero_copy_stream_impl.h>
>>   #include <google/protobuf/io/coded_stream.h>
>>
>> @@ -55,30 +52,25 @@
>>
>>   struct sout_stream_sys_t
>>   {
>> -    sout_stream_sys_t()
>> -        : p_tls(NULL), i_requestId(0),
>> +    sout_stream_sys_t(intf_sys_t *intf)
>> +        : p_tls(NULL),
>>             i_status(CHROMECAST_DISCONNECTED), p_out(NULL)
>> +        ,p_intf(intf)
>>       {
>>       }
>>
>> -    std::string serverIP;
>> -
>>       int i_sock_fd;
>>       vlc_tls_creds_t *p_creds;
>>       vlc_tls_t *p_tls;
>>
>>       vlc_thread_t chromecastThread;
>>
>> -    unsigned i_requestId;
>> -    std::string appTransportId;
>> -
>> -    std::queue<castchannel::CastMessage> messagesToSend;
>> -
>>       int i_status;
>>       vlc_mutex_t lock;
>>       vlc_cond_t loadCommandCond;
>>
>>       sout_stream_t *p_out;
>> +    intf_sys_t * const p_intf;
>>   };
>>
>>   // Media player Chromecast app id
>> @@ -106,15 +98,6 @@ static int connectChromecast(sout_stream_t *p_stream,
>> char *psz_ipChromecast);
>>   static void disconnectChromecast(sout_stream_t *p_stream);
>>   static int sendMessages(sout_stream_t *p_stream);
>>
>> -static void msgAuth(sout_stream_t *p_stream);
>> -static void msgPing(sout_stream_t *p_stream);
>> -static void msgPong(sout_stream_t *p_stream);
>> -static void msgConnect(sout_stream_t *p_stream, std::string
>> destinationId);
>> -static void msgClose(sout_stream_t *p_stream, std::string destinationId);
>> -static void msgLaunch(sout_stream_t *p_stream);
>> -static void msgLoad(sout_stream_t *p_stream);
>> -static void msgStatus(sout_stream_t *p_stream);
>> -
>>   static void *chromecastThread(void *data);
>>
>>   static const char *const ppsz_sout_options[] = {
>> @@ -201,9 +184,15 @@ static int Open(vlc_object_t *p_this)
>>   {
>>       sout_stream_t *p_stream = reinterpret_cast<sout_stream_t*>(p_this);
>>       sout_stream_sys_t *p_sys;
>> -    p_sys = new(std::nothrow) sout_stream_sys_t;
>> +    intf_sys_t *p_intf = new(std::nothrow) intf_sys_t(p_stream);
>> +    if (p_intf == NULL)
>> +        return VLC_ENOMEM;
>> +    p_sys = new(std::nothrow) sout_stream_sys_t(p_intf);
>>       if (p_sys == NULL)
>> +    {
>> +        delete p_intf;
>>           return VLC_ENOMEM;
>> +    }
>>       p_stream->p_sys = p_sys;
>>
>>       config_ChainParse(p_stream, SOUT_CFG_PREFIX, ppsz_sout_options,
>> p_stream->p_cfg);
>> @@ -233,7 +222,7 @@ static int Open(vlc_object_t *p_this)
>>           Clean(p_stream);
>>           return VLC_EGENERIC;
>>       }
>> -    p_sys->serverIP = psz_localIP;
>> +    p_intf->serverIP = psz_localIP;
>
>
> Couldn't you pass it to the constructor? It would allow the field to be
> const & private

No because in the future the IP address will be dynamic.

>>
>>       char *psz_mux = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX
>> "mux");
>>       if (psz_mux == NULL)
>> @@ -325,10 +314,10 @@ static void Close(vlc_object_t *p_this)
>>       case CHROMECAST_MEDIA_LOAD_SENT:
>>       case CHROMECAST_APP_STARTED:
>>           // Generate the close messages.
>> -        msgClose(p_stream, p_sys->appTransportId);
>> +        p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
>>           // ft
>>       case CHROMECAST_AUTHENTICATED:
>> -        msgClose(p_stream, "receiver-0");
>> +        p_sys->p_intf->msgClose("receiver-0");
>>           // Send the just added close messages.
>>           sendMessages(p_stream);
>>           // ft
>> @@ -447,13 +436,13 @@ static int sendMessages(sout_stream_t *p_stream)
>>       sout_stream_sys_t *p_sys = p_stream->p_sys;
>>
>>       int i_ret = 0;
>> -    while (!p_sys->messagesToSend.empty())
>> +    while (!p_sys->p_intf->messagesToSend.empty())
>>       {
>> -        unsigned i_retSend = sendMessage(p_stream,
>> p_sys->messagesToSend.front());
>> +        unsigned i_retSend = sendMessage(p_stream,
>> p_sys->p_intf->messagesToSend.front());
>>           if (i_retSend <= 0)
>>               return i_retSend;
>>
>> -        p_sys->messagesToSend.pop();
>> +        p_sys->p_intf->messagesToSend.pop();
>>           i_ret += i_retSend;
>>       }
>>
>> @@ -607,8 +596,8 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>           {
>>               vlc_mutex_locker locker(&p_sys->lock);
>>               p_sys->i_status = CHROMECAST_AUTHENTICATED;
>> -            msgConnect(p_stream, "receiver-0");
>> -            msgLaunch(p_stream);
>> +            p_sys->p_intf->msgConnect("receiver-0");
>> +            p_sys->p_intf->msgLaunch();
>>           }
>>       }
>>       else if (namespace_ == "urn:x-cast:com.google.cast.tp.heartbeat")
>> @@ -619,7 +608,7 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>           if (type == "PING")
>>           {
>>               msg_Dbg(p_stream, "PING received from the Chromecast");
>> -            msgPong(p_stream);
>> +            p_sys->p_intf->msgPong();
>>           }
>>           else if (type == "PONG")
>>           {
>> @@ -649,8 +638,8 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>                   {
>>                       p_app = &applications[i];
>>                       vlc_mutex_lock(&p_sys->lock);
>> -                    if (p_sys->appTransportId.empty())
>> -                        p_sys->appTransportId =
>> std::string(applications[i]["transportId"]);
>> +                    if (p_sys->p_intf->appTransportId.empty())
>> +                        p_sys->p_intf->appTransportId =
>> std::string(applications[i]["transportId"]);
>>                       vlc_mutex_unlock(&p_sys->lock);
>>                       break;
>>                   }
>> @@ -659,12 +648,12 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>               vlc_mutex_lock(&p_sys->lock);
>>               if ( p_app )
>>               {
>> -                if (!p_sys->appTransportId.empty()
>> +                if (!p_sys->p_intf->appTransportId.empty()
>>                           && p_sys->i_status == CHROMECAST_AUTHENTICATED)
>>                   {
>>                       p_sys->i_status = CHROMECAST_APP_STARTED;
>> -                    msgConnect(p_stream, p_sys->appTransportId);
>> -                    msgLoad(p_stream);
>> +
>> p_sys->p_intf->msgConnect(p_sys->p_intf->appTransportId);
>> +                    p_sys->p_intf->msgLoad();
>>                       p_sys->i_status = CHROMECAST_MEDIA_LOAD_SENT;
>>                       vlc_cond_signal(&p_sys->loadCommandCond);
>>                   }
>> @@ -677,7 +666,7 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>                   case CHROMECAST_APP_STARTED:
>>                   case CHROMECAST_MEDIA_LOAD_SENT:
>>                       msg_Warn(p_stream, "app is no longer present.
>> closing");
>> -                    msgClose(p_stream, p_sys->appTransportId);
>> +
>> p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
>>                       p_sys->i_status = CHROMECAST_CONNECTION_DEAD;
>>                       // ft
>>                   default:
>> @@ -710,7 +699,7 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>           else if (type == "LOAD_FAILED")
>>           {
>>               msg_Err(p_stream, "Media load failed");
>> -            msgClose(p_stream, p_sys->appTransportId);
>> +            p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
>>               vlc_mutex_lock(&p_sys->lock);
>>               p_sys->i_status = CHROMECAST_CONNECTION_DEAD;
>>               vlc_mutex_unlock(&p_sys->lock);
>> @@ -754,155 +743,6 @@ static int processMessage(sout_stream_t *p_stream,
>> const castchannel::CastMessag
>>   }
>>
>>
>> -/**
>> - * @brief Build a CastMessage to send to the Chromecast
>> - * @param namespace_ the message namespace
>> - * @param payloadType the payload type (CastMessage_PayloadType_STRING or
>> - * CastMessage_PayloadType_BINARY
>> - * @param payload the payload
>> - * @param destinationId the destination idenifier
>> - * @return the generated CastMessage
>> - */
>> -static castchannel::CastMessage buildMessage(std::string namespace_,
>> -                                castchannel::CastMessage_PayloadType
>> payloadType,
>> -                                std::string payload, std::string
>> destinationId = "receiver-0")
>> -{
>> -    castchannel::CastMessage msg;
>> -
>> -
>> msg.set_protocol_version(castchannel::CastMessage_ProtocolVersion_CASTV2_1_0);
>> -    msg.set_namespace_(namespace_);
>> -    msg.set_payload_type(payloadType);
>> -    msg.set_source_id("sender-vlc");
>> -    msg.set_destination_id(destinationId);
>> -    if (payloadType == castchannel::CastMessage_PayloadType_STRING)
>> -        msg.set_payload_utf8(payload);
>> -    else // CastMessage_PayloadType_BINARY
>> -        msg.set_payload_binary(payload);
>> -
>> -    return msg;
>> -}
>> -
>> -
>>
>> -/*****************************************************************************
>> - * Message preparation
>> -
>> *****************************************************************************/
>> -static void msgAuth(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    castchannel::DeviceAuthMessage authMessage;
>> -    authMessage.mutable_challenge();
>> -    std::string authMessageString;
>> -    authMessage.SerializeToString(&authMessageString);
>> -
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.deviceauth",
>> -        castchannel::CastMessage_PayloadType_BINARY, authMessageString);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -
>> -static void msgPing(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::string s("{\"type\":\"PING\"}");
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
>> -        castchannel::CastMessage_PayloadType_STRING, s);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -
>> -static void msgPong(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::string s("{\"type\":\"PONG\"}");
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
>> -        castchannel::CastMessage_PayloadType_STRING, s);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -
>> -static void msgConnect(sout_stream_t *p_stream, std::string
>> destinationId)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::string s("{\"type\":\"CONNECT\"}");
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.connection",
>> -        castchannel::CastMessage_PayloadType_STRING, s, destinationId);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -
>> -static void msgClose(sout_stream_t *p_stream, std::string destinationId)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::string s("{\"type\":\"CLOSE\"}");
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.connection",
>> -        castchannel::CastMessage_PayloadType_STRING, s, destinationId);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -static void msgStatus(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::stringstream ss;
>> -    ss << "{\"type\":\"GET_STATUS\"}";
>> -
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.receiver",
>> -        castchannel::CastMessage_PayloadType_STRING, ss.str());
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -static void msgLaunch(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    std::stringstream ss;
>> -    ss << "{\"type\":\"LAUNCH\","
>> -       <<  "\"appId\":\"" << APP_ID << "\","
>> -       <<  "\"requestId\":" << p_stream->p_sys->i_requestId++ << "}";
>
>
> Nitpicking (and not related to your patch at all) but I'd find it more
> readable to have the requestId modification out of the payload construction.

Yes but it's at the same level as the other JSON data. That would mean
passing parts of JSON data without the {} around. That's also ugly.

>> -
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.receiver",
>> -        castchannel::CastMessage_PayloadType_STRING, ss.str());
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>> -
>> -static void msgLoad(sout_stream_t *p_stream)
>> -{
>> -    sout_stream_sys_t *p_sys = p_stream->p_sys;
>> -
>> -    char *psz_mime = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX
>> "mime");
>> -    if (psz_mime == NULL)
>> -        return;
>> -
>> -    std::stringstream ss;
>> -    ss << "{\"type\":\"LOAD\","
>> -       <<  "\"media\":{\"contentId\":\"http://" << p_sys->serverIP << ":"
>> -           << var_InheritInteger(p_stream, SOUT_CFG_PREFIX"http-port")
>> -           << "/stream\","
>> -       <<             "\"streamType\":\"LIVE\","
>> -       <<             "\"contentType\":\"" << std::string(psz_mime) <<
>> "\"},"
>> -       <<  "\"requestId\":" << p_stream->p_sys->i_requestId++ << "}";
>> -
>> -    free(psz_mime);
>> -
>> -    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.media",
>> -        castchannel::CastMessage_PayloadType_STRING, ss.str(),
>> p_sys->appTransportId);
>> -
>> -    p_sys->messagesToSend.push(msg);
>> -}
>> -
>>
>>
>> /*****************************************************************************
>>    * Chromecast thread
>> @@ -921,7 +761,7 @@ static void* chromecastThread(void* p_data)
>>       int i_waitdelay = PING_WAIT_TIME;
>>       int i_retries = PING_WAIT_RETRIES;
>>
>> -    msgAuth(p_stream);
>> +    p_sys->p_intf->msgAuth();
>>       sendMessages(p_stream);
>>       vlc_restorecancel(canc);
>>
>> @@ -950,8 +790,8 @@ static void* chromecastThread(void* p_data)
>>
>>           if (b_pingTimeout)
>>           {
>> -            msgPing(p_stream);
>> -            msgStatus(p_stream);
>> +            p_sys->p_intf->msgPing();
>> +            p_sys->p_intf->msgStatus();
>>           }
>>
>>           if (b_msgReceived)
>> @@ -962,7 +802,7 @@ static void* chromecastThread(void* p_data)
>>           }
>>
>>           // Send the answer messages if there is any.
>> -        if (!p_sys->messagesToSend.empty())
>> +        if (!p_sys->p_intf->messagesToSend.empty())
>>           {
>>               i_ret = sendMessages(p_stream);
>>   #if defined(_WIN32)
>> diff --git a/modules/stream_out/chromecast/chromecast.h
>> b/modules/stream_out/chromecast/chromecast.h
>> index f1d0a66..aaf8497 100644
>> --- a/modules/stream_out/chromecast/chromecast.h
>> +++ b/modules/stream_out/chromecast/chromecast.h
>> @@ -32,6 +32,8 @@
>>   #include <vlc_common.h>
>>   #include <vlc_plugin.h>
>>
>> +#include <queue>
>> +
>>   #include "cast_channel.pb.h"
>>
>>   // Status
>> @@ -45,4 +47,26 @@ enum
>>       CHROMECAST_CONNECTION_DEAD,
>>   };
>>
>> +struct intf_sys_t
>
>
> I'm not sure _sys_t is the best name for a class with logic.

It will become an interface and thus stored in such a type. It would
be weird to have to cast all the time. But I agree this is not very
clean.

> Also, I'd try to make more fields private to clarify the expected usage

That's done in the future. When all the logic is gone from the sout.

>> +{
>> +    intf_sys_t(sout_stream_t * const p_stream);
>> +    ~intf_sys_t();
>> +
>> +    sout_stream_t  * const p_stream;
>> +    std::string    serverIP;
>> +    std::string appTransportId;
>> +
>> +    void msgAuth();
>> +    void msgClose(std::string destinationId);
>> +    void msgPing();
>> +    void msgPong();
>> +    void msgConnect(std::string destinationId);
>> +    void msgLaunch();
>> +    void msgLoad();
>> +    void msgStatus();
>> +
>> +    std::queue<castchannel::CastMessage> messagesToSend;
>> +    unsigned i_requestId;
>> +};
>> +
>>   #endif /* VLC_CHROMECAST_H */
>> diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> b/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> new file mode 100644
>> index 0000000..5c7e3d9
>> --- /dev/null
>> +++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> @@ -0,0 +1,185 @@
>>
>> +/*****************************************************************************
>> + * chromecast_ctrl.cpp: Chromecast module for vlc
>> +
>> *****************************************************************************
>> + * Copyright © 2014-2015 VideoLAN
>> + *
>> + * Authors: Adrien Maglo <magsoft at videolan.org>
>> + *          Jean-Baptiste Kempf <jb at videolan.org>
>> + *          Steve Lhomme <robux4 at videolabs.io>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> it
>> + * under the terms of the GNU Lesser General Public License as published
>> by
>> + * the Free Software Foundation; either version 2.1 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> License
>> + * along with this program; if not, write to the Free Software
>> Foundation,
>> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
>> +
>> *****************************************************************************/
>> +
>>
>> +/*****************************************************************************
>> + * Preamble
>> +
>> *****************************************************************************/
>> +
>> +#ifdef HAVE_CONFIG_H
>> +# include "config.h"
>> +#endif
>> +
>> +#include "chromecast.h"
>> +
>> +#include <vlc_sout.h>
>> +
>> +#include <sstream>
>> +
>> +// Media player Chromecast app id
>> +#define APP_ID "CC1AD845" // Default media player
>> +
>> +#define SOUT_CFG_PREFIX "sout-chromecast-"
>> +
>> +/**
>> + * @brief Build a CastMessage to send to the Chromecast
>> + * @param namespace_ the message namespace
>> + * @param payloadType the payload type (CastMessage_PayloadType_STRING or
>> + * CastMessage_PayloadType_BINARY
>> + * @param payload the payload
>> + * @param destinationId the destination idenifier
>> + * @return the generated CastMessage
>> + */
>> +static castchannel::CastMessage buildMessage(std::string namespace_,
>> +                                castchannel::CastMessage_PayloadType
>> payloadType,
>> +                                std::string payload, std::string
>> destinationId = "receiver-0")
>> +{
>> +    castchannel::CastMessage msg;
>> +
>> +
>> msg.set_protocol_version(castchannel::CastMessage_ProtocolVersion_CASTV2_1_0);
>> +    msg.set_namespace_(namespace_);
>> +    msg.set_payload_type(payloadType);
>> +    msg.set_source_id("sender-vlc");
>> +    msg.set_destination_id(destinationId);
>> +    if (payloadType == castchannel::CastMessage_PayloadType_STRING)
>> +        msg.set_payload_utf8(payload);
>> +    else // CastMessage_PayloadType_BINARY
>> +        msg.set_payload_binary(payload);
>> +
>> +    return msg;
>> +}
>> +
>> +intf_sys_t::intf_sys_t(sout_stream_t * const p_this)
>> + :p_stream(p_this)
>> + ,i_requestId(0)
>> +{
>> +}
>> +
>> +intf_sys_t::~intf_sys_t()
>> +{
>> +}
>
>
> You could omit the destructor if it's empty

True at this stage.

>> +
>>
>> +/*****************************************************************************
>> + * Message preparation
>> +
>> *****************************************************************************/
>> +void intf_sys_t::msgAuth()
>> +{
>> +    castchannel::DeviceAuthMessage authMessage;
>> +    authMessage.mutable_challenge();
>> +    std::string authMessageString;
>> +    authMessage.SerializeToString(&authMessageString);
>> +
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.deviceauth",
>> +        castchannel::CastMessage_PayloadType_BINARY, authMessageString);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +
>> +void intf_sys_t::msgPing()
>> +{
>> +    std::string s("{\"type\":\"PING\"}");
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
>> +        castchannel::CastMessage_PayloadType_STRING, s);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +
>> +void intf_sys_t::msgPong()
>> +{
>> +    std::string s("{\"type\":\"PONG\"}");
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
>> +        castchannel::CastMessage_PayloadType_STRING, s);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +
>> +void intf_sys_t::msgConnect(std::string destinationId)
>> +{
>> +    std::string s("{\"type\":\"CONNECT\"}");
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.connection",
>> +        castchannel::CastMessage_PayloadType_STRING, s, destinationId);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +
>> +void intf_sys_t::msgClose(std::string destinationId)
>> +{
>> +    std::string s("{\"type\":\"CLOSE\"}");
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.tp.connection",
>> +        castchannel::CastMessage_PayloadType_STRING, s, destinationId);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +void intf_sys_t::msgStatus()
>> +{
>> +    std::stringstream ss;
>> +    ss << "{\"type\":\"GET_STATUS\"}";
>> +
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.receiver",
>> +        castchannel::CastMessage_PayloadType_STRING, ss.str());
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +void intf_sys_t::msgLaunch()
>> +{
>> +    std::stringstream ss;
>> +    ss << "{\"type\":\"LAUNCH\","
>> +       <<  "\"appId\":\"" << APP_ID << "\","
>> +       <<  "\"requestId\":" << i_requestId++ << "}";
>> +
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.receiver",
>> +        castchannel::CastMessage_PayloadType_STRING, ss.str());
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>> +
>> +void intf_sys_t::msgLoad()
>> +{
>> +    char *psz_mime = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX
>> "mime");
>> +    if (psz_mime == NULL)
>> +        return;
>> +
>> +    std::stringstream ss;
>> +    ss << "{\"type\":\"LOAD\","
>> +       <<  "\"media\":{\"contentId\":\"http://" << serverIP << ":"
>> +           << var_InheritInteger(p_stream, SOUT_CFG_PREFIX"http-port")
>> +           << "/stream\","
>> +       <<             "\"streamType\":\"LIVE\","
>> +       <<             "\"contentType\":\"" << std::string(psz_mime) <<
>> "\"},"
>> +       <<  "\"requestId\":" << i_requestId++ << "}";
>> +
>> +    free(psz_mime);
>> +
>> +    castchannel::CastMessage msg =
>> buildMessage("urn:x-cast:com.google.cast.media",
>> +        castchannel::CastMessage_PayloadType_STRING, ss.str(),
>> appTransportId);
>> +
>> +    messagesToSend.push(msg);
>> +}
>> +
>>
>
> Regards,
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list