Звуковое программирование в Linux. Как определить размер буфера в кадрах?
Я экспериментировал с ALSA и встретился со следующим параметром конфигурации в этом руководстве, раздел 2:
Единица размера буфера зависит от функции. Иногда это дается в байтах, иногда должно быть указано количество кадров. Один кадр является вектором выборочных данных для всех каналов. Для 16-битных стереофонических данных один кадр имеет длину четыре байта.
/* Set buffer size (in frames). The resulting latency is given by */
/* latency = periodsize * periods / (rate * bytes_per_frame) */
if (snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, (periodsize * periods)>>2) < 0) {
fprintf(stderr, "Error setting buffersize.\n");
return(-1);
}
Я не понимаю, что для 16-битных стерео данных, один кадр имеет длину четыре байта
Почему четыре? Следует ли по количеству каналов: 2? Я имею в виду ранее, они настроили это следующим образом:
/* Set number of channels */
if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 2) < 0) {
fprintf(stderr, "Error setting channels.\n");
return(-1);
}
Как насчет того, если моя акустическая система содержит 4 выхода? Или 6? Означает ли это, что я должен настроить его на 16 бит * 4 и 16 бит * 6 соответственно?
1 ответ
Почему четыре? Следует ли по количеству каналов: 2?
Да, согласно упомянутому ранее:
Один кадр является вектором выборочных данных для всех каналов.
Таким образом, для стереофонических 16-битных данных есть два (левый и правый) каналы по 16 бит (=2 байта) каждый, так что в сумме получается 4 байта на кадр.