Я пытаюсь воспроизвести аудио-CD с помощью cd_paranoia
(из пакета cdio
) и передать считанные данные на звуковой выход ALSA. Буферизован, конечно. Моя проблема теперь заключается в следующем: Как указано в этой программе примера , вызов paranoia_read ()
возвращает int16_t*
, содержащий один сектор (2352 байта) аудиоданных, которые затем могут быть преобразованы в char*
.
Метод ALSA snd_pcm_writei ()
, с другой стороны, нуждается в фрагменте аудиоданных в char*
, длина которого должна быть определена с помощью метода snd_pcm_hw_params_get_period_size ()
, который в основном возвращает количество байтов, отправленных в звуковое устройство, пока не сработает прерывание. Продайте также этот пример исходного кода .
Два метода почти наверняка вернут разные значения, потому что кадр ALSA имеет другой размер, чем сектор CD. Это означало бы, что мне придется как-то разделить данные, которые cd-paranoia
доставляет мне, чтобы они вписывались в структуру кадра ALSA. Или было бы достаточно просто передать аудиоданные с компакт-диска в большой байтовый массив (std::queue<char>
), а затем, шаг за шагом, прочитать как можно больше байтов из этого массива, чтобы я получил полный «кадр» ALSA?
Есть намеки? Спасибо.