2017-02-17 27 views
0

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

Аналоговых звуковые сигналы, которые описаны с помощью звукового кодека на SOM-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 кГц?

UPDATE: Когда я установил ставку до 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

+0

Вы всегда должны проверить коды ошибок. Почему вы просите время? И каковы значения 'rate' и' dir' до и после вызова? –

+0

'dir' равно 0, а' rate' - 8000, как я хотел, когда я устанавливал. Как я уже сказал, после запроса периода он изменяется до 16000. Причина, по которой я прошу период, - это определить размер буфера. Я проверю коды ошибок моих вызовов и обновит сообщение, если что-то не так –

+0

Являются ли эти значения * до * вызова или * после * вызова или обоих? И почему вы предполагаете, что ставка связана с периодом времени? –

ответ

0

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

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

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

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

+0

Я смущен о терминологии библиотеки alsa, особенно о кадре и периоде. Я хочу записать звук с параметрами (1 канал [моно], 8 бит PCM и скоростью 8000 Гц). С этими параметрами мой буфер должен быть 1 (канал) * 8 (бит на выборку) * 8000 (скорость) = 64000 бит, 8000 байт в течение одной секунды, не должно быть? Я точно не понимаю параметры кадра и периода. –

+0

@BlackGlix Ваш расчет размера буфера будет правильным. В ALSA кадр для двухканального звукового буфера представляет собой два выборки, для трехканального звукового буфера это три канала. Размер периода - это размер звукового буфера, который передается между компьютером и аудиоустройством. – tay10r