Я использую мой драйвер ALSA в Ubuntu 14.04, 64-битная версия, ядро 3.16.0-30.
Аппаратное обеспечение является проприетарным, поэтому не может дать много подробностей.
Ниже приведена реализация существующего драйвера:
- Драйвер предоставляется channel_count в качестве входа через параметр модуля. (В связи с требованиями необходимо указать количество каналов через параметр модуля)
- Драйвер заполняет структуру alsa snd_pcm_hardware как воспроизведение-> channel_min = channel_count & для воспроизведения-> channel_max = channel_count; Те же значения для стороны захвата.
- Аппаратное обеспечение настроено на тактирование на основе channel_count, и драйвер успешно регистрируется на уровне ALSA.
- aplay/arecord отлично работает для channel_count = 1/2/4
- Во время aplay/arecord, в драйвере, когда проверено значение «runtime-> channel», оно отражает настроенное значение channel_count, что мне кажется правильным. Запись данных совпадает с воспроизведенным, так как это тест с обратной связью.
Но когда я использую channel_count = 3, оба aplay или arecord сообщают "Сломанная конфигурация для этого PCM: конфигурации недоступны" !! для волнового файла с channel_count '3'
Например: Воспроизведение WAVE './xxx.wav': 16-битный Little Endian со знаком, частота 48000 Гц, каналы 3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM не используется
aplay: set_params: 1204: сломанная конфигурация для этого PCM: конфигурации недоступны
Благодаря следующим изменениям я смог немного продвинуться вперед:
Method1:
- Драйвер предоставлен channel_count '3' в качестве входа через параметр модуля
- Модифицированный драйвер для заполнения структуры snd_pcm_hardware в виде окупаемости-> channel_min = 2 & воспроизведения-> channel_min = 3; Аналогичные значения для пути захвата
- aplay/arecord сообщает как «число каналов недоступно», хотя используемый волновой файл имеет 3 канала
например: aplay -D hw: CARD = xxx, DEV = 0 ./xxx.wav Воспроизведение WAVE './xxx.wav': 16-разрядный бит с прямым порядком байтов, скорость 48000 Гц, каналы 3
aplay: set_params: 1239: количество каналов недоступно
- Пробовал aplay/arecord с plughw, и aplay/arecord продвигался вперед
modprobe my_driver.ko Channel = 3
arecord -D plughw:CARD = xxx, DEV = 0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav
aplay -D plughw:CARD = xxx, DEV = 0 ./xxx.wav
Запись WAVE './xxx_rec0.wav': 16-разрядный со знаком Little Endian, частота 48000 Гц, каналы 3
Воспроизведение WAVE './xxx.wav': 16-разрядный Little Endian со знаком, частота 48000 Гц, каналы 3
Конец теста
Во время aplay/arecord, в драйвере, когда проверяется значение «runtime-> channel», возвращается значение 2 !!! Но проигранный волновой файл имеет количество ч 3 ...
Когда данные в записанном файле проверены, вся тишина
Method2:
Драйвер предоставлен channel_count '3' в качестве входа через параметр модуля
Модифицированный драйвер для заполнения структуры snd_pcm_hardware: воспроизведение-> channel_min = 3 и воспроизведение-> channel_min = 4; Аналогичные значения для пути захвата
aplay/arecord сообщает как «число каналов недоступно», хотя используемый волновой файл имеет 3 канала
Пробовал aplay/arecord с plughw, и aplay/arecord продвигался вперед
Во время aplay/arecord, в драйвере, когда проверяется значение «runtime-> channel», возвращается значение 4 !!! Но проигранный волновой файл имеет количество ч 3 ...
Когда данные в записанном файле проверены, вся тишина
Итак, из вышеприведенных наблюдений, runtime-> channel равно 2 или 4, но никогда не использовалось 3 канала стеком alsa, хотя и запрашивалось. Когда используется Plughw, alsa преобразует данные для запуска по 2 или 4 каналам.
Может кто-нибудь помочь, почему я не могу использовать количество каналов 3. Предоставит больше информации, если это необходимо. Заранее спасибо.