<html><head></head><body>Hi,<br><br>I suppose with audio callbacks, you could use VLC to decode the media, and then apply low latency filters. But then you're using amem, not MMdevice.<br><br><div class="gmail_quote">Le 25 octobre 2019 21:04:03 GMT+03:00, Alexandre Janniaux <ajanni@videolabs.io> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">Hi,<br><br>Isn't it applicable in the case of libvlc then?<br><br>Regards,<br>--<br>Alexandre Janniaux<br>Videolabs<br><br>On Fri, Oct 25, 2019 at 02:15:11PM +0300, Rémi Denis-Courmont wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> It's negligible, and most likely hidden by the rounding up to the next period.<br><br> This kind of low latency is for user interaction reaction time, e.g.  DJ applying live effects.<br><br> Le 25 octobre 2019 14:05:49 GMT+03:00, Steve Lhomme <robux4@ycbcr.xyz> a écrit :<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;">On 2019-10-25 12:47, Rémi Denis-Courmont wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;">...which does not apply to a media player that is bound by the packet<br></blockquote>size.<br><br>Even though our app feeds a certain packet size, if at the lower level<br>the OS has to mix with other sources (even with the same packet size)<br>it<br>still needs an extra step to mix the various sources, probably adding<br>some latency.<br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;">Le 25 octobre 2019 13:38:04 GMT+03:00, Thomas Guillem<br></blockquote><thomas@gllm.fr> a<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"> écrit :<br><br><br><br></blockquote><a href="https://docs.microsoft.com/en-us/windows/win32/coreaudio/exclusive-mode-streams">https://docs.microsoft.com/en-us/windows/win32/coreaudio/exclusive-mode-streams</a><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;">     "Applications that use exclusive-mode streams often do so because<br>     they require low latencies in the data paths between the audio<br>     endpoint devices and the application threads that access the<br>     endpoint buffers."<br><br><br>     On Fri, Oct 25, 2019, at 12:18, Rémi Denis-Courmont wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">     I don't see how it reduces latency, no. Audio latency is largely<br>     bound by the packet/period size, not by exclusive mode.<br><br>     Le 25 octobre 2019 10:17:21 GMT+03:00, Thomas Guillem<br>     <thomas@gllm.fr> a écrit :<br><br><br><br>         On Thu, Oct 24, 2019, at 20:55, Rémi Denis-Courmont wrote:<br><br>             Le torstaina 24. lokakuuta 2019, 15.37.13 EEST Thomas<br>             Guillem a écrit :<br><br>                 cf. WASAPI_EXCLUSIVE_LONGTEXT<br><br></blockquote></blockquote><hr><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">                 modules/audio_output/wasapi.c | 174<br>                 +++++++++++++++++++++++++++++++++-<br>                 1 file changed, 170 insertions(+), 4 deletions(-)<br><br>                 diff --git a/modules/audio_output/wasapi.c<br>                 b/modules/audio_output/wasapi.c<br>                 index daa946f8afc..91defb250fb 100644<br>                 --- a/modules/audio_output/wasapi.c<br>                 +++ b/modules/audio_output/wasapi.c<br>                 @@ -588,6 +588,154 @@ static void Stop(aout_stream_t<br></blockquote></blockquote>*s)<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">                 free(sys);<br>                 }<br><br>                 +/*<br>                 + * This function will try to find the closest PCM<br>                 format that is accepted<br>                 by + * the sound card. Exclusive here means a direct<br>                 access to the sound<br>                 card. The + * format arguments and the return code<br></blockquote></blockquote>of<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">this function behave<br>exactly like + * IAudioClient_IsFormatSupported().<br>+ */<br>+static HRESULT GetExclusivePCMFormat(IAudioClient<br></blockquote></blockquote>*c,<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">const WAVEFORMATEX<br>*pwf, + WAVEFORMATEX **ppwf_closest) +{<br>+ HRESULT hr;<br>+ const AUDCLNT_SHAREMODE exclusive =<br>AUDCLNT_SHAREMODE_EXCLUSIVE;<br>+<br>+ *ppwf_closest = NULL;<br>+<br>+ /* First try the input format */<br>+ hr = IAudioClient_IsFormatSupported(c, exclusive,<br>pwf, NULL);<br>+<br>+ if (hr != AUDCLNT_E_UNSUPPORTED_FORMAT)<br>+ {<br>+ assert(hr != S_FALSE); /* S_FALSE reserved for<br>shared mode */<br>+ return hr;<br>+ }<br>+<br>+ /* This format come from vlc_ToWave() */<br>+ assert(pwf->wFormatTag == WAVE_FORMAT_EXTENSIBLE);<br>+ const WAVEFORMATEXTENSIBLE *pwfe = (void *) pwf;<br>+ assert(IsEqualIID(&pwfe->SubFormat,<br>&KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)<br>+ || IsEqualIID(&pwfe->SubFormat,<br>&KSDATAFORMAT_SUBTYPE_PCM));<br>+<br>+ /* Allocate the output closest format */<br>+ WAVEFORMATEXTENSIBLE *pwfe_closest =<br>+ CoTaskMemAlloc(sizeof(WAVEFORMATEXTENSIBLE));<br>+ if (!pwfe_closest)<br>+ return E_FAIL;<br>+ WAVEFORMATEX *pwf_closest = &pwfe_closest->Format;<br>+<br>+ /* Setup the fallback arrays. There are 3<br></blockquote></blockquote>properties<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">to check: the<br>format, + * the samplerate and the channels. There<br></blockquote></blockquote>are<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">maximum of 4<br>formats to + * check, 3 samplerates, and 2 channels<br>configuration. So,<br>that is a + * maximum of 4x3x2=24 checks */<br>+<br>+ /* The format fallback order is dependent of the<br>input format. We don't<br>+ * want to use a high quality format when it's not<br>needed but we<br>prefer to + * use a high quality format instead of a<br>lower one */<br>+ static const uint16_t bits_pcm8_fallback[] = { 8,<br>16, 24, 32 };<br>+ static const uint16_t bits_pcm16_fallback[] = {<br></blockquote></blockquote>16,<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">24, 32, 8 };<br>+ static const uint16_t bits_pcm24_fallback[] = {<br></blockquote></blockquote>24,<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">32, 16, 8 };<br>+ static const uint16_t bits_pcm32_fallback[] = {<br></blockquote></blockquote>32,<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">24, 16, 8 };<br>+<br>+ static const size_t bits_fallback_size =<br>ARRAY_SIZE(bits_pcm8_fallback); +<br>+ const uint16_t *bits_fallback;<br>+ switch (pwf->wBitsPerSample)<br>+ {<br>+ case 64: /* fall through */<br>+ case 32: bits_fallback = bits_pcm32_fallback;<br></blockquote></blockquote>break;<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">+ case 24: bits_fallback = bits_pcm24_fallback;<br></blockquote></blockquote>break;<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">+ case 16: bits_fallback = bits_pcm16_fallback;<br></blockquote></blockquote>break;<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">+ case 8: bits_fallback = bits_pcm8_fallback; break;<br>+ default: vlc_assert_unreachable();<br>+ }<br>+<br>+ /* Check the input samplerate, then 48kHz and<br></blockquote></blockquote>44.1khz */<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">+ const uint32_t samplerate_fallback[] = {<br>+ pwf->nSamplesPerSec,<br>+ pwf->nSamplesPerSec == 48000 ? 0 : 48000,<br>+ pwf->nSamplesPerSec == 44100 ? 0 : 44100,<br>+ };<br>+ const size_t samplerate_fallback_size =<br>ARRAY_SIZE(samplerate_fallback); +<br>+ /* Check the input number of channels, then stereo<br></blockquote></blockquote>*/<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">                 + const uint16_t channels_fallback[] = {<br>                 + pwf->nChannels,<br>                 + pwf->nChannels == 2 ? 0 : 2,<br>                 + };<br>                 + const size_t channels_fallback_size =<br>                 ARRAY_SIZE(channels_fallback);<br><br>             Really the only point in exclusive mode is bit exact. If<br>             you need to convert,<br>             there is really no point, especially if the sample rate<br>             and/or the channel<br>             mappings differ. This is waaaaay needlessly complicated.<br><br><br>         An other point of exclusive is to reduce the audio latency.<br><br>             --<br>             レミ・デニ-クールモン<br>             <a href="http://www.remlab.net/">http://www.remlab.net/</a><br><br></blockquote></blockquote><hr><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">             vlc-devel mailing list<br>             To unsubscribe or modify your subscription options:<br>             <a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br><br><br></blockquote></blockquote><hr><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #fcaf3e; padding-left: 1ex;">         vlc-devel mailing list<br>         To unsubscribe or modify your subscription options:<br>         <a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br><br><br>     --<br>     Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez<br>     excuser ma brièveté.<hr>     vlc-devel mailing list<br>     To unsubscribe or modify your subscription options:<br>     <a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></blockquote><br> --<br> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez<br></blockquote>excuser<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #8ae234; padding-left: 1ex;"> ma brièveté.<hr> vlc-devel mailing list<br> To unsubscribe or modify your subscription options:<br> <a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br><br></blockquote><hr>vlc-devel mailing list<br>To unsubscribe or modify your subscription options:<br><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></blockquote>--<br>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.<br></blockquote><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"><hr>vlc-devel mailing list<br>To unsubscribe or modify your subscription options:<br><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></blockquote><hr>vlc-devel mailing list<br>To unsubscribe or modify your subscription options:<br><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a></pre></blockquote></div><br>-- <br>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.</body></html>