[vlc-devel] [PATCH 4/5] wasapi: add 24bits support
Thomas Guillem
thomas at gllm.fr
Fri Oct 25 09:16:28 CEST 2019
On Thu, Oct 24, 2019, at 18:29, Rémi Denis-Courmont wrote:
> So what? Some cards don't support PCM at all, or only some really weird formats. That's why we use the OS-provided HAL.
In that case, we can also add support for such format.
Yes, we must use the OS-provided HAL by default. But we can still add an advanced option to enable exclusive mode. I know a lot of audiophile would like to play their 24bit 96khz directly. Even if I know that 16bit 48khz cover fully the hearing range.
>
> I don't think this belongs in VLC. We already decided to drop 24-bits PCM earlier.
Who ? when ? Do you have a trace ?
>
> Le 24 octobre 2019 15:37:12 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>> But don't use VLC_CODEC_S24N as this fourcc is not handled by any audio
>> filters. Instead, request VLC_CODEC_S32N to VLC and do the conversion
>> internally.
>>
>> This commit is needed by the next commit since some sound cards only support
>> 24bits. modules/audio_output/wasapi.c | 30 +++++++++++++++++++++++++++---
>> 1 file changed, 27 insertions(+), 3 deletions(-)
>>
>> diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
>> index d6105169b8e..daa946f8afc 100644
>> --- a/modules/audio_output/wasapi.c
>> +++ b/modules/audio_output/wasapi.c
>> @@ -106,6 +106,7 @@ typedef struct aout_stream_sys
>> unsigned block_align;
>> UINT64 written; /**< Frames written to the buffer */
>> UINT32 frames; /**< Total buffer size (frames) */
>> + bool s24s32; /**< Output configured as S24N, but input as S32N */
>> } aout_stream_sys_t;
>>
>> static void ResetTimer(aout_stream_t *s)
>> @@ -268,7 +269,28 @@ static HRESULT Play(aout_stream_t *s, block_t *block, vlc_tick_t date)
>>
>> const size_t copy = frames * sys->block_align;
>>
>> - memcpy(dst, block->p_buffer, copy);
>> + if (!sys->s24s32)
>> + {
>> + memcpy(dst, block->p_buffer, copy);
>> + block->p_buffer += copy;
>> + block->i_buffer -= copy;
>> + }
>> + else
>> + {
>> + /* Convert back S32L to S24L. The following is doing the opposite
>> + * of S24LDecode() from codec/araw.c */
>> + BYTE *end = dst + copy;
>> + while (dst < end)
>> + {
>> + dst[0] = block->p_buffer[1];
>> + dst[1] = block->p_buffer[2];
>> + dst[2] = block->p_buffer[3];
>> + dst += 3;
>> + block->p_buffer += 4;
>> + block->i_buffer -= 4;
>> + }
>> +
>> + }
>> hr = IAudioRenderClient_ReleaseBuffer(render, frames, 0);
>> if (FAILED(hr))
>> {
>> @@ -276,8 +298,6 @@ static HRESULT Play(aout_stream_t *s, block_t *block, vlc_tick_t date)
>> break;
>> }
>>
>> - block->p_buffer += copy;
>> - block->i_buffer -= copy;
>> block->i_nb_samples -= frames;
>> sys->written += frames;
>> if (block->i_nb_samples == 0)
>> @@ -512,6 +532,7 @@ static int vlc_FromWave(const WAVEFORMATEX *restrict wf,
>> switch (wf->wBitsPerSample)
>> {
>> case 32:
>> + case 24:
>> audio->i_format = VLC_CODEC_S32N;
>> break;
>> case 16:
>> @@ -679,6 +700,9 @@ static HRESULT Start(aout_stream_t *s, audio_sample_format_t *restrict pfmt,
>> sys->format = fmt.i_format;
>> sys->block_align = pwf->nBlockAlign;
>> sys->rate = pwf->nSamplesPerSec;
>> + sys->s24s32 = pwf->wBitsPerSample == 24 && fmt.i_format == VLC_CODEC_S32N;
>> + if (sys->s24s32)
>> + msg_Dbg(s, "audio device configured as s24");
>>
>> hr = IAudioClient_Initialize(sys->client, shared_mode, 0, buffer_duration,
>> 0, pwf, sid);
>
> --
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20191025/54d74d99/attachment.html>
More information about the vlc-devel
mailing list