[vlc-devel] [PATCH 3/4] aout: winstore: fix C++ compilation

Steve Lhomme robux4 at ycbcr.xyz
Thu Jun 25 10:38:24 CEST 2020


On 2020-06-25 10:35, Thomas Guillem wrote:
> 
> 
> On Thu, Jun 25, 2020, at 10:32, Steve Lhomme wrote:
>> On 2020-06-25 10:24, Thomas Guillem wrote:
>>> So, the patch 2/4 has a functional change: it breaks the build.
>>
>> It works when building from scratch.
> 
> So, this commit title is not correct? Fix the build, means it was broken before.

Ah that, yes it wouldn't build.
I think a pure rename patch helps showing the changes needed after. But 
since it breaks bisect, that's not good.

> It was weird to me to have a break and fix commit in the same patch set.
> 
>>
>> Anyway, I did it in C.
>>
>>> I think you should merge 2 and 3 then.
>>>
>>> On Wed, Jun 24, 2020, at 14:26, Steve Lhomme wrote:
>>>> And make better use of C++ features.
>>>>
>>>> Use WRL::ComPtr smart pointer to handle COM.
>>>> ---
>>>>    modules/audio_output/winstore.cpp | 107 +++++++++++++++---------------
>>>>    1 file changed, 53 insertions(+), 54 deletions(-)
>>>>
>>>> diff --git a/modules/audio_output/winstore.cpp
>>>> b/modules/audio_output/winstore.cpp
>>>> index 6482bd41726..66ce3721dfb 100644
>>>> --- a/modules/audio_output/winstore.cpp
>>>> +++ b/modules/audio_output/winstore.cpp
>>>> @@ -1,5 +1,5 @@
>>>>    
>>>> /*****************************************************************************
>>>> - * mmdevice.c : Windows Multimedia Device API audio output plugin for
>>>> VLC
>>>> + * winstore.cpp : Windows Multimedia Device API audio output plugin
>>>> for VLC
>>>>     
>>>> *****************************************************************************
>>>>     * Copyright (C) 2012 RĂ©mi Denis-Courmont
>>>>     *
>>>> @@ -23,10 +23,8 @@
>>>>    #endif
>>>>    
>>>>    #define INITGUID
>>>> -#define COBJMACROS
>>>>    
>>>> -#include <stdlib.h>
>>>> -#include <assert.h>
>>>> +#include <cassert>
>>>>    #include <audiopolicy.h>
>>>>    
>>>>    #include <vlc_common.h>
>>>> @@ -35,12 +33,16 @@
>>>>    #include <vlc_modules.h>
>>>>    #include "audio_output/mmdevice.h"
>>>>    
>>>> +#include <wrl.h>
>>>> +#include <wrl/client.h>
>>>> +using namespace Microsoft::WRL;
>>>> +
>>>>    DEFINE_GUID (GUID_VLC_AUD_OUT, 0x4533f59d, 0x59ee, 0x00c6,
>>>>       0xad, 0xb2, 0xc6, 0x8b, 0x50, 0x1a, 0x66, 0x55);
>>>>    
>>>>    static void EnterMTA(void)
>>>>    {
>>>> -    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
>>>> +    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
>>>>        if (unlikely(FAILED(hr)))
>>>>            abort();
>>>>    }
>>>> @@ -63,18 +65,18 @@ static void ResetInvalidated(audio_output_t *aout,
>>>> HRESULT hr)
>>>>        if (unlikely(hr == AUDCLNT_E_DEVICE_INVALIDATED ||
>>>>                     hr == AUDCLNT_E_RESOURCES_INVALIDATED))
>>>>        {
>>>> -        aout_sys_t* sys = aout->sys;
>>>> -        sys->client = NULL;
>>>> +        aout_sys_t* sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +        sys->client = nullptr;
>>>>        }
>>>>    }
>>>>    
>>>>    static int VolumeSet(audio_output_t *aout, float vol)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return VLC_EGENERIC;
>>>>        HRESULT hr;
>>>> -    ISimpleAudioVolume *pc_AudioVolume = NULL;
>>>> +    ComPtr<ISimpleAudioVolume> pc_AudioVolume;
>>>>        float gain = 1.f;
>>>>    
>>>>        vol = vol * vol * vol; /* ISimpleAudioVolume is tapered linearly. */
>>>> @@ -87,14 +89,14 @@ static int VolumeSet(audio_output_t *aout, float vol)
>>>>    
>>>>        aout_GainRequest(aout, gain);
>>>>    
>>>> -    hr = IAudioClient_GetService(sys->client, &IID_ISimpleAudioVolume,
>>>> (void**)&pc_AudioVolume);
>>>> +    hr = sys->client->GetService(IID_ISimpleAudioVolume,
>>>> (void**)pc_AudioVolume.GetAddressOf() );
>>>>        if (FAILED(hr))
>>>>        {
>>>>            msg_Err(aout, "cannot get volume service (error 0x%lX)", hr);
>>>>            goto done;
>>>>        }
>>>>    
>>>> -    hr = ISimpleAudioVolume_SetMasterVolume(pc_AudioVolume, vol, NULL);
>>>> +    hr = pc_AudioVolume->SetMasterVolume(vol, nullptr);
>>>>        if (FAILED(hr))
>>>>        {
>>>>            msg_Err(aout, "cannot set volume (error 0x%lX)", hr);
>>>> @@ -102,27 +104,26 @@ static int VolumeSet(audio_output_t *aout, float vol)
>>>>        }
>>>>    
>>>>    done:
>>>> -    ISimpleAudioVolume_Release(pc_AudioVolume);
>>>>    
>>>>        return SUCCEEDED(hr) ? 0 : -1;
>>>>    }
>>>>    
>>>>    static int MuteSet(audio_output_t *aout, bool mute)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return VLC_EGENERIC;
>>>>        HRESULT hr;
>>>> -    ISimpleAudioVolume *pc_AudioVolume = NULL;
>>>> +    ComPtr<ISimpleAudioVolume> pc_AudioVolume;
>>>>    
>>>> -    hr = IAudioClient_GetService(sys->client, &IID_ISimpleAudioVolume,
>>>> (void**)&pc_AudioVolume);
>>>> +    hr = sys->client->GetService(IID_ISimpleAudioVolume,
>>>> (void**)pc_AudioVolume.GetAddressOf() );
>>>>        if (FAILED(hr))
>>>>        {
>>>>            msg_Err(aout, "cannot get volume service (error 0x%lX)", hr);
>>>>            goto done;
>>>>        }
>>>>    
>>>> -    hr = ISimpleAudioVolume_SetMute(pc_AudioVolume, mute, NULL);
>>>> +    hr = pc_AudioVolume->SetMute(mute, nullptr);
>>>>        if (FAILED(hr))
>>>>        {
>>>>            msg_Err(aout, "cannot set mute (error 0x%lX)", hr);
>>>> @@ -130,15 +131,14 @@ static int MuteSet(audio_output_t *aout, bool mute)
>>>>        }
>>>>    
>>>>    done:
>>>> -    ISimpleAudioVolume_Release(pc_AudioVolume);
>>>>    
>>>>        return SUCCEEDED(hr) ? 0 : -1;
>>>>    }
>>>>    
>>>>    static int TimeGet(audio_output_t *aout, vlc_tick_t *restrict delay)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return VLC_EGENERIC;
>>>>        HRESULT hr;
>>>>    
>>>> @@ -151,8 +151,8 @@ static int TimeGet(audio_output_t *aout, vlc_tick_t
>>>> *restrict delay)
>>>>    
>>>>    static void Play(audio_output_t *aout, block_t *block, vlc_tick_t date)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return;
>>>>    
>>>>        EnterMTA();
>>>> @@ -165,8 +165,8 @@ static void Play(audio_output_t *aout, block_t
>>>> *block, vlc_tick_t date)
>>>>    
>>>>    static void Pause(audio_output_t *aout, bool paused, vlc_tick_t date)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return;
>>>>    
>>>>        EnterMTA();
>>>> @@ -179,8 +179,8 @@ static void Pause(audio_output_t *aout, bool
>>>> paused, vlc_tick_t date)
>>>>    
>>>>    static void Flush(audio_output_t *aout)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> -    if( unlikely( sys->client == NULL ) )
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>> +    if( unlikely( sys->client == nullptr ) )
>>>>            return;
>>>>    
>>>>        EnterMTA();
>>>> @@ -193,14 +193,13 @@ static void Flush(audio_output_t *aout)
>>>>    static HRESULT ActivateDevice(void *opaque, REFIID iid, PROPVARIANT *actparms,
>>>>                                  void **restrict pv)
>>>>    {
>>>> -    IAudioClient *client = opaque;
>>>> +    IAudioClient *client = reinterpret_cast<IAudioClient*>(opaque);
>>>>    
>>>> -    if (!IsEqualIID(iid, &IID_IAudioClient))
>>>> +    if (iid != IID_IAudioClient)
>>>>            return E_NOINTERFACE;
>>>> -    if (actparms != NULL || client == NULL )
>>>> +    if (actparms != nullptr || client == nullptr )
>>>>            return E_INVALIDARG;
>>>> -
>>>> -    IAudioClient_AddRef(client);
>>>> +    client->AddRef();
>>>>        *pv = opaque;
>>>>    
>>>>        return S_OK;
>>>> @@ -208,7 +207,7 @@ static HRESULT ActivateDevice(void *opaque, REFIID
>>>> iid, PROPVARIANT *actparms,
>>>>    
>>>>    static int aout_stream_Start(void *func, bool forced, va_list ap)
>>>>    {
>>>> -    aout_stream_start_t start = func;
>>>> +    aout_stream_start_t start = (aout_stream_start_t)func;
>>>>        aout_stream_t *s = va_arg(ap, aout_stream_t *);
>>>>        audio_sample_format_t *fmt = va_arg(ap, audio_sample_format_t *);
>>>>        HRESULT *hr = va_arg(ap, HRESULT *);
>>>> @@ -220,58 +219,58 @@ static int aout_stream_Start(void *func, bool
>>>> forced, va_list ap)
>>>>    
>>>>    static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>>        HRESULT hr;
>>>>    
>>>> -    aout_stream_t *s = vlc_object_create(aout, sizeof (*s));
>>>> -    if (unlikely(s == NULL))
>>>> +    aout_stream_t *s = (aout_stream_t*)vlc_object_create(aout, sizeof (*s));
>>>> +    if (unlikely(s == nullptr))
>>>>            return -1;
>>>>    
>>>>        s->owner.device = sys->client;
>>>>        s->owner.activate = ActivateDevice;
>>>>    
>>>>        EnterMTA();
>>>> -    sys->module = vlc_module_load(s, "aout stream", NULL, false,
>>>> +    sys->module = vlc_module_load(vlc_object_logger(&s->obj), "aout
>>>> stream", nullptr, false,
>>>>                                      aout_stream_Start, s, fmt, &hr);
>>>>        LeaveMTA();
>>>>    
>>>> -    if (sys->module == NULL)
>>>> +    if (sys->module == nullptr)
>>>>        {
>>>> -        vlc_object_delete(s);
>>>> +        vlc_object_delete(&s->obj);
>>>>            return -1;
>>>>        }
>>>>    
>>>> -    assert (sys->stream == NULL);
>>>> +    assert (sys->stream == nullptr);
>>>>        sys->stream = s;
>>>>        return 0;
>>>>    }
>>>>    
>>>>    static void Stop(audio_output_t *aout)
>>>>    {
>>>> -    aout_sys_t *sys = aout->sys;
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>>    
>>>> -    assert (sys->stream != NULL);
>>>> +    assert (sys->stream != nullptr);
>>>>    
>>>>        EnterMTA();
>>>>        aout_stream_Stop(sys->stream);
>>>>        LeaveMTA();
>>>>    
>>>> -    vlc_object_delete(sys->stream);
>>>> -    sys->stream = NULL;
>>>> +    vlc_object_delete(&sys->stream->obj);
>>>> +    sys->stream = nullptr;
>>>>    }
>>>>    
>>>>    static int DeviceSelect(audio_output_t *aout, const char* psz_device)
>>>>    {
>>>> -    if( psz_device == NULL )
>>>> +    if( psz_device == nullptr )
>>>>            return VLC_EGENERIC;
>>>>        char* psz_end;
>>>> -    aout_sys_t* sys = aout->sys;
>>>> +    aout_sys_t* sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>>        intptr_t ptr = strtoll( psz_device, &psz_end, 16 );
>>>>        if ( *psz_end != 0 )
>>>>            return VLC_EGENERIC;
>>>> -    if (sys->client == (IAudioClient*)ptr)
>>>> +    if (sys->client == reinterpret_cast<IAudioClient*>(ptr))
>>>>            return VLC_SUCCESS;
>>>> -    sys->client = (IAudioClient*)ptr;
>>>> +    sys->client = reinterpret_cast<IAudioClient*>(ptr);
>>>>        var_SetAddress( vlc_object_parent(aout), "winstore-client", sys->client );
>>>>        aout_RestartRequest( aout, AOUT_RESTART_OUTPUT );
>>>>        return VLC_SUCCESS;
>>>> @@ -281,14 +280,14 @@ static int Open(vlc_object_t *obj)
>>>>    {
>>>>        audio_output_t *aout = (audio_output_t *)obj;
>>>>    
>>>> -    aout_sys_t *sys = malloc(sizeof (*sys));
>>>> -    if (unlikely(sys == NULL))
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(malloc(sizeof (*sys)));
>>>> +    if (unlikely(sys == nullptr))
>>>>            return VLC_ENOMEM;
>>>>    
>>>>        aout->sys = sys;
>>>> -    sys->stream = NULL;
>>>> -    sys->client = var_CreateGetAddress( vlc_object_parent(aout),
>>>> "winstore-client" );
>>>> -    if (sys->client != NULL)
>>>> +    sys->stream = nullptr;
>>>> +    sys->client =
>>>> reinterpret_cast<IAudioClient*>(var_CreateGetAddress(
>>>> vlc_object_parent(aout), "winstore-client" ));
>>>> +    if (sys->client != nullptr)
>>>>            msg_Dbg( aout, "Reusing previous client: %p", sys->client );
>>>>        aout->start = Start;
>>>>        aout->stop = Stop;
>>>> @@ -305,7 +304,7 @@ static int Open(vlc_object_t *obj)
>>>>    static void Close(vlc_object_t *obj)
>>>>    {
>>>>        audio_output_t *aout = (audio_output_t *)obj;
>>>> -    aout_sys_t *sys = aout->sys;
>>>> +    aout_sys_t *sys = reinterpret_cast<aout_sys_t*>(aout->sys);
>>>>    
>>>>        free(sys);
>>>>    }
>>>> -- 
>>>> 2.26.2
>>>>
>>>> _______________________________________________
>>>> vlc-devel mailing list
>>>> To unsubscribe or modify your subscription options:
>>>> https://mailman.videolan.org/listinfo/vlc-devel
>>> _______________________________________________
>>> vlc-devel mailing list
>>> To unsubscribe or modify your subscription options:
>>> https://mailman.videolan.org/listinfo/vlc-devel
>>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> 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