[vlc-devel] [PATCH 5/5] wasapi: add an option to handle exclusive mode

Rémi Denis-Courmont remi at remlab.net
Fri Oct 25 12:47:33 CEST 2019


...which does not apply to a media player that is bound by the packet size.

Le 25 octobre 2019 13:38:04 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>
>https://docs.microsoft.com/en-us/windows/win32/coreaudio/exclusive-mode-streams
>
>"Applications that use exclusive-mode streams often do so because they
>require low latencies in the data paths between the audio endpoint
>devices and the application threads that access the endpoint buffers."
>
>
>On Fri, Oct 25, 2019, at 12:18, Rémi Denis-Courmont wrote:
>> I don't see how it reduces latency, no. Audio latency is largely
>bound by the packet/period size, not by exclusive mode.
>> 
>> Le 25 octobre 2019 10:17:21 GMT+03:00, Thomas Guillem
><thomas at gllm.fr> a écrit :
>>> 
>>> 
>>> On Thu, Oct 24, 2019, at 20:55, Rémi Denis-Courmont wrote:
>>>> Le torstaina 24. lokakuuta 2019, 15.37.13 EEST Thomas Guillem a
>écrit :
>>>>> cf. WASAPI_EXCLUSIVE_LONGTEXT modules/audio_output/wasapi.c | 174
>+++++++++++++++++++++++++++++++++-
>>>>>  1 file changed, 170 insertions(+), 4 deletions(-)
>>>>> 
>>>>> diff --git a/modules/audio_output/wasapi.c
>b/modules/audio_output/wasapi.c
>>>>> index daa946f8afc..91defb250fb 100644
>>>>> --- a/modules/audio_output/wasapi.c
>>>>> +++ b/modules/audio_output/wasapi.c
>>>>> @@ -588,6 +588,154 @@ static void Stop(aout_stream_t *s)
>>>>>      free(sys);
>>>>>  }
>>>>> 
>>>>> +/*
>>>>> + * This function will try to find the closest PCM format that is
>accepted
>>>>> by + * the sound card. Exclusive here means a direct access to the
>sound
>>>>> card. The + * format arguments and the return code of this
>function behave
>>>>> exactly like + * IAudioClient_IsFormatSupported().
>>>>> + */
>>>>> +static HRESULT GetExclusivePCMFormat(IAudioClient *c, const
>WAVEFORMATEX
>>>>> *pwf, +                                     WAVEFORMATEX
>**ppwf_closest) +{
>>>>> +    HRESULT hr;
>>>>> +    const AUDCLNT_SHAREMODE exclusive =
>AUDCLNT_SHAREMODE_EXCLUSIVE;
>>>>> +
>>>>> +    *ppwf_closest = NULL;
>>>>> +
>>>>> +    /* First try the input format */
>>>>> +    hr = IAudioClient_IsFormatSupported(c, exclusive, pwf, NULL);
>>>>> +
>>>>> +    if (hr != AUDCLNT_E_UNSUPPORTED_FORMAT)
>>>>> +    {
>>>>> +        assert(hr != S_FALSE); /* S_FALSE reserved for shared
>mode */
>>>>> +        return hr;
>>>>> +    }
>>>>> +
>>>>> +    /* This format come from vlc_ToWave() */
>>>>> +    assert(pwf->wFormatTag == WAVE_FORMAT_EXTENSIBLE);
>>>>> +    const WAVEFORMATEXTENSIBLE *pwfe = (void *) pwf;
>>>>> +    assert(IsEqualIID(&pwfe->SubFormat,
>&KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)
>>>>> +        || IsEqualIID(&pwfe->SubFormat,
>&KSDATAFORMAT_SUBTYPE_PCM));
>>>>> +
>>>>> +    /* Allocate the output closest format */
>>>>> +    WAVEFORMATEXTENSIBLE *pwfe_closest =
>>>>> +        CoTaskMemAlloc(sizeof(WAVEFORMATEXTENSIBLE));
>>>>> +    if (!pwfe_closest)
>>>>> +        return E_FAIL;
>>>>> +    WAVEFORMATEX *pwf_closest = &pwfe_closest->Format;
>>>>> +
>>>>> +    /* Setup the fallback arrays. There are 3 properties to
>check: the
>>>>> format, +     * the samplerate and the channels. There are maximum
>of 4
>>>>> formats to +     * check, 3 samplerates, and 2 channels
>configuration. So,
>>>>> that is a +     * maximum of 4x3x2=24 checks */
>>>>> +
>>>>> +    /* The format fallback order is dependent of the input
>format. We don't
>>>>> +     * want to use a high quality format when it's not needed but
>we
>>>>> prefer to +     * use a high quality format instead of a lower one
>*/
>>>>> +    static const uint16_t bits_pcm8_fallback[] =  {  8, 16, 24,
>32 };
>>>>> +    static const uint16_t bits_pcm16_fallback[] = { 16, 24, 32, 8
> };
>>>>> +    static const uint16_t bits_pcm24_fallback[] = { 24, 32, 16, 8
> };
>>>>> +    static const uint16_t bits_pcm32_fallback[] = { 32, 24, 16, 8
> };
>>>>> +
>>>>> +    static const size_t bits_fallback_size =
>>>>> ARRAY_SIZE(bits_pcm8_fallback); +
>>>>> +    const uint16_t *bits_fallback;
>>>>> +    switch (pwf->wBitsPerSample)
>>>>> +    {
>>>>> +        case 64: /* fall through */
>>>>> +        case 32: bits_fallback = bits_pcm32_fallback; break;
>>>>> +        case 24: bits_fallback = bits_pcm24_fallback; break;
>>>>> +        case 16: bits_fallback = bits_pcm16_fallback; break;
>>>>> +        case 8:  bits_fallback = bits_pcm8_fallback;  break;
>>>>> +        default: vlc_assert_unreachable();
>>>>> +    }
>>>>> +
>>>>> +    /* Check the input samplerate, then 48kHz and 44.1khz */
>>>>> +    const uint32_t samplerate_fallback[] = {
>>>>> +        pwf->nSamplesPerSec,
>>>>> +        pwf->nSamplesPerSec == 48000 ? 0 : 48000,
>>>>> +        pwf->nSamplesPerSec == 44100 ? 0 : 44100,
>>>>> +    };
>>>>> +    const size_t samplerate_fallback_size =
>>>>> ARRAY_SIZE(samplerate_fallback); +
>>>>> +    /* Check the input number of channels, then stereo */
>>>>> +    const uint16_t channels_fallback[] = {
>>>>> +        pwf->nChannels,
>>>>> +        pwf->nChannels == 2 ? 0 : 2,
>>>>> +    };
>>>>> +    const size_t channels_fallback_size =
>ARRAY_SIZE(channels_fallback);
>>>> Really the only point in exclusive mode is bit exact. If you need
>to convert, 
>>>> there is really no point, especially if the sample rate and/or the
>channel 
>>>> mappings differ. This is waaaaay needlessly complicated.
>>> 
>>> An other point of exclusive is to reduce the audio latency.
>>> 
>>> > 
>>>> -- 
>>>> レミ・デニ-クールモン
>>>> http://www.remlab.net/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
>> 
>> -- 
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>excuser ma brièveté. 
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20191025/0f4eb6e3/attachment.html>


More information about the vlc-devel mailing list