ALSA с использованием pcm_s24le

Использование Linux Mint 17.1 и ALSA. У меня есть два wav-файла, создающих идентичный звук: один использует pcm_s16le, а другой - pcm_s24le. Каждый из них корректно воспроизводится с помощью Totem/videos. Мой код для установки аппаратных параметров и воспроизведения с помощью pcm_s16le работает нормально. Тем не менее, когда я пытаюсь настроить эти параметры для размещения pcm_s24le следующим образом:

snd_pcm_hw_params_set_format(audioHandle, audioParams, SND_PCM_FORMAT_S24_LE);

[Я просто заменил "SND_PCM_FORMAT_S24LE" на "SND_PCM_FORMAT_S16_LE"]. Вызов snd_pcm_writei

snd_pcm_writei(m_audioHandle, *m_pAudioFrameData, *m_pAudioFrameSize / (m_nChannels * m_bitsPerSample / 8);

Я получаю в основном звук мусора (шипение, прерывистость) с намеком на правильный звук.

По сути, мой вопрос: как мне преобразовать код, который работает для SND_PCM_FORMAT_S16_LE, в работу для SND_PCM_FORMAT_S24_LE?

1 ответ

Существует три возможных способа хранения 24-битных семплов в памяти:

          LSB MSB
          1-й байт 2-й байт 3-й байт Выравнивание 4-го байта
S32_LE:   00000000  xxxxxxxx  xxxxxxxx  xxxxxxxx   32 бита
S24_LE:   xxxxxxxx  xxxxxxxx  xxxxxxxx  00000000   32 бита
S24_3LE:  xxxxxxxx  xxxxxxxx  xxxxxxxx             24 бита

Большая часть оборудования использует S32_LE, за исключением USB, который использует S24_3LE. Нет оборудования, которое использует S24_LE.

ALSA может автоматически преобразовывать формат образца, но вы должны правильно описать свой собственный формат образца.

Другие вопросы по тегам