[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