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

Alexandre Janniaux ajanni at videolabs.io
Fri Oct 25 20:04:03 CEST 2019


Hi,

Isn't it applicable in the case of libvlc then?

Regards,
--
Alexandre Janniaux
Videolabs

On Fri, Oct 25, 2019 at 02:15:11PM +0300, Rémi Denis-Courmont wrote:
> It's negligible, and most likely hidden by the rounding up to the next period.
>
> This kind of low latency is for user interaction reaction time, e.g.  DJ applying live effects.
>
> Le 25 octobre 2019 14:05:49 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
> >On 2019-10-25 12:47, Rémi Denis-Courmont wrote:
> >> ...which does not apply to a media player that is bound by the packet
> >size.
> >
> >Even though our app feeds a certain packet size, if at the lower level
> >the OS has to mix with other sources (even with the same packet size)
> >it
> >still needs an extra step to mix the various sources, probably adding
> >some latency.
> >
> >> 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é.
> >>
> >> _______________________________________________
> >> 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



More information about the vlc-devel mailing list