[vlc-devel] [PATCH 2/3] chromecast: send a STOP message when we have no ES to send

Steve Lhomme robux4 at gmail.com
Mon May 9 21:22:56 CEST 2016


On Mon, May 9, 2016 at 7:07 PM, Rémi Denis-Courmont <remi at remlab.net> wrote:
> On Monday 09 May 2016 18:56:37 Steve Lhomme wrote:
>> ---
>>  modules/stream_out/chromecast/cast.cpp            |  2 ++
>>  modules/stream_out/chromecast/chromecast.h        |  4 ++++
>>  modules/stream_out/chromecast/chromecast_ctrl.cpp | 19 ++++++++++++++++++-
>>  3 files changed, 24 insertions(+), 1 deletion(-)
>>
>> diff --git a/modules/stream_out/chromecast/cast.cpp
>> b/modules/stream_out/chromecast/cast.cpp index 94808f5..bc4c462 100644
>> --- a/modules/stream_out/chromecast/cast.cpp
>> +++ b/modules/stream_out/chromecast/cast.cpp
>> @@ -187,6 +187,8 @@ static void Del(sout_stream_t *p_stream,
>> sout_stream_id_sys_t *id)
>>
>>      if ( p_sys->streams.empty() )
>>      {
>> +        p_sys->p_intf->requestPlayerStop();
>> +
>>          sout_StreamChainDelete( p_sys->p_out, p_sys->p_out );
>>          p_sys->p_out = NULL;
>>          p_sys->sout = "";
>> diff --git a/modules/stream_out/chromecast/chromecast.h
>> b/modules/stream_out/chromecast/chromecast.h index fd26d6a..1cd55db 100644
>> --- a/modules/stream_out/chromecast/chromecast.h
>> +++ b/modules/stream_out/chromecast/chromecast.h
>> @@ -34,6 +34,7 @@
>>  #include <vlc_tls.h>
>>  #include <vlc_interrupt.h>
>>
>> +#include <atomic>
>>  #include <sstream>
>>
>>  #include "cast_channel.pb.h"
>> @@ -88,6 +89,8 @@ struct intf_sys_t
>>
>>      void setHasInput( bool has_input, const std::string mime_type = "");
>>
>> +    void requestPlayerStop();
>> +
>>  private:
>>      vlc_object_t  * const p_module;
>>      const int      i_port;
>> @@ -147,6 +150,7 @@ private:
>>      void processMessage(const castchannel::CastMessage &msg);
>>
>>      void notifySendRequest();
>> +    std::atomic_bool requested_stop;
>>
>>      int sendMessage(const castchannel::CastMessage &msg);
>>
>> diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> b/modules/stream_out/chromecast/chromecast_ctrl.cpp index 22461b4..1dbba93
>> 100644
>> --- a/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> +++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
>> @@ -100,6 +100,7 @@ intf_sys_t::intf_sys_t(vlc_object_t * const p_this, int
>> port, std::string device , i_sock_fd(-1)
>>   , p_creds(NULL)
>>   , p_tls(NULL)
>> + , requested_stop(false)
>>   , conn_status(CHROMECAST_DISCONNECTED)
>>   , cmd_status(NO_CMD_PENDING)
>>   , i_receiver_requestId(0)
>> @@ -882,11 +883,21 @@ bool intf_sys_t::handleMessages()
>>      bool b_msgReceived = false;
>>      uint32_t i_payloadSize = 0;
>>
>> +    int canc = vlc_savecancel();
>> +    // Not cancellation-safe part.
>> +
>> +    if ( requested_stop.exchange(false) && !mediaSessionId.empty() )
>> +    {
>> +        msgPlayerStop();
>> +    }
>> +
>> +    vlc_restorecancel(canc);
>
> Just remove the vlc_cancel() call. Cancelling a C++ thread is not portably
> defined.

I think that's why Adrien originally put the "extern "C" " on the
recvPacket function. Now that I have a clean interrupt the end the
thread I suppose I can do without.

>> +
>>      int i_ret = recvPacket( p_module, b_msgReceived, i_payloadSize,
>> i_sock_fd, p_tls, &i_received, p_packet, &b_pingTimeout, &i_waitdelay,
>> &i_retries);
>>
>> -    int canc = vlc_savecancel();
>> +    canc = vlc_savecancel();
>>      // Not cancellation-safe part.
>>
>>  #if defined(_WIN32)
>> @@ -922,3 +933,9 @@ void intf_sys_t::notifySendRequest()
>>  {
>>      vlc_interrupt_raise( p_ctl_thread_interrupt );
>>  }
>> +
>> +void intf_sys_t::requestPlayerStop()
>> +{
>> +    requested_stop = true;
>> +    notifySendRequest();
>> +}
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
>
> _______________________________________________
> 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