Звуковое программирование в 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 байта на кадр.

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