[vlc-devel] [PATCH 4/5] wasapi: add 24bits support

Thomas Guillem thomas at gllm.fr
Fri Oct 25 13:17:28 CEST 2019


On Fri, Oct 25, 2019, at 13:13, Rémi Denis-Courmont wrote:
> Hi,
> 
> Up-converting to 24-bits is not going to improve quality in any way. Down-converting from float or S32 to 24-bits works just as well in the HAL as it does in this patch.

Some sound card only support 24bit, so if exclusive mode is enabled, we will have to up convert to 24bit.

But the main use case is to be able to do 24bit to 24bit.

> 
> This patch does *not* add any perceived improvement for so-called pros, not even the loonies that think they can hear frequencies above 48 kHz or dynamic ranges beyond 16 bits.
> 
> Adding exclusive mode is fine. Adding conversion without any valid technical reasons is not. Nor is duplicating code that already exists in the raw audio encoder.
> 
> There are literally no reasons to add this. That's not what the so-called audiophiles want.
> 
> Le 25 octobre 2019 14:02:54 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>> 
>> On Fri, Oct 25, 2019, at 12:47, Rémi Denis-Courmont wrote:
>>> Here by people here in this decade.
>> 
>> Then, I hereby ask the VLC's community if this old decision should be kept. Maybe I should ask the VLC-TC ?
>> 
>> VLC will continue to be denigrated by pro users if we don't offer them some options for "high quality audio".
>> 
>> A lot of applications are offering exclusive 24bit support. By doing a quick research I found MPV and Qobuz.
>> 
>> Yes I know 24bit 96k is useless, cf. https://people.xiph.org/~xiphmont/demo/neil-young.html
>> 
>> This is not a reason to refuse this patch set, we should always offer a choice to pro users. Furthermore, this patch set doesn't affect the normal behavior,
>> 
>> 
>>> 
>>> Le 25 octobre 2019 13:35:36 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>>>> 
>>>> On Fri, Oct 25, 2019, at 12:17, Rémi Denis-Courmont wrote:
>>>>> I disagree and this contradicts earlier decisions here.
>>>> 
>>>> Yes that is what you said in the first reply and I asked you:
>>>> 
>>>> Who ? when ? Do you have a trace of this decision ?
>>>> 
>>>>> 
>>>>> Le 25 octobre 2019 10:16:28 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>>>>>> 
>>>>>> 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
>>>>>> 
>>>>> 
>>>>> -- 
>>>>> 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
>> 
> 
> -- 
> 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/744c8a51/attachment.html>


More information about the vlc-devel mailing list