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 может автоматически преобразовывать формат образца, но вы должны правильно описать свой собственный формат образца.