Настройка аппаратных параметров Alsa Lib

Я пытаюсь записать звук на моем встроенном устройстве linux (debian) с библиотекой alsa. Это мое встроенное оборудование, это [1], и в соответствии с его таблицей данных [33],

Аналоговые аудиосигналы представлены встроенным аудиокодеком TLV320AIC3106.

и таблицу данных этого аудиокодека Texas Instruments [3],

Поддерживает частоты от 8 кГц до 96 кГц

Я использую пример кода приложения для alsa lib, для первоначальной работы я не менял код. В примере кода частота дискретизации была установлена ​​на 44100 Гц. Я успешно записал звук и играл после. На данный момент, я думаю, я могу записывать звук с помощью alsa-lib с частотой дискретизации 8000 Гц на основе таблиц данных. Я установил частоту дискретизации на 8000 Гц, но в то время как конфигурация alsa, она меняется на 16000 Гц. Я установил частоту дискретизации до 8000 Гц;

snd_pcm_hw_params_set_rate_near(handle, params, &(record_params->rate), &dir);
snd_pcm_hw_params_set_channels(handle, params, record_params->channel);
rc = snd_pcm_hw_params(handle, params);

Но после вызова этого метода;

snd_pcm_hw_params_get_period_time(params, &(record_params->rate), &dir);

он изменяется на 16000. Между вышеупомянутыми нет вызова другого метода. Мои настройки неверны или кодек не поддерживает 8 кГц?

ОБНОВЛЕНИЕ: Когда я устанавливаю скорость в 16000, она меняется на 8000. Я действительно запутался больше.

[1] = http://www.variscite.com/products/system-on-module-som/cortex-a9/dart-mx6-cpu-freescale-imx6

[2] = http://www.variscite.com/images/stories/DataSheets/DART-MX6/DART-MX6_v1_2_datasheet_v2_1.pdf

[3] = http://www.ti.com/lit/ds/symlink/tlv320aic3106.pdf

1 ответ

Период времени и скорость это две разные вещи.

Период PCM - это в основном количество кадров, которые передаются между прерываниями устройства. Это сделано так, потому что передача данных на устройство кадр за кадром была бы крайне неэффективной.

Библиотека ALSA позволяет задавать размер периода в микросекундах (используя snd_pcm_get_period_time) или по количеству кадров (используя snd_pcm_get_period_size).

Если вы пытаетесь вычислить, какой размер буфера выделить для чтения или записи в PCM, использовать его будет более интуитивно понятным snd_pcm_get_period_size (который возвращает количество кадров за период), а затем вызвать snd_pcm_frames_to_bytes, который преобразует количество кадров PCM в число байтов.

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