Я использую драйвер ALSA на Ubuntu 14.04, 64 бит, ядро 3.16.0-30-generic.
Оборудование является собственностью компании, поэтому не можем предоставить подробную информацию.
Ниже представлена существующая реализация драйвера:
- Драйверу предоставляется channel_count в качестве входных данных через параметр модуля. (В связи с требованиями необходимо предоставить ch count через параметр модуля)
- Драйвер заполняет структуру alsa snd_pcm_hardware следующим образом: playback->channels_min = channel_count и playback->channels_max = channel_count; Те же значения для стороны захвата.
- Аппаратное обеспечение настроено для работы часов на основе channel_count, и драйвер успешно регистрируется на уровне ALSA.
- aplay/arecord отлично работает для channel_count = 1/2/4
- Во время aplay/arecord, в драйвере, когда проверяется значение "runtime->channels", оно отражает настроенное 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) Подчиненный PCM не может использоваться
aplay: set_params:1204: Неверная конфигурация для этого PCM: нет доступных конфигураций
Благодаря следующим изменениям мне удалось немного продвинуться вперед:
Метод1:
- Драйверу предоставляется channel_count '3' в качестве входного параметра через модуль
- Измененный драйвер для заполнения структуры snd_pcm_hardware как payback->channels_min = 2 и playback->channels_min = 3; Аналогичные значения для пути захвата
- aplay/arecord сообщает, что «количество каналов недоступно», хотя используемый файл Wave имеет 3 канала
например: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Воспроизведение WAVE './xxx.wav': со знаком 16 бит Little Endian, частота 48000 Гц, каналы 3
aplay: set_params:1239: Количество каналов недоступно
- Попробовал aplay/arecord с plughw, и aplay/arecord продвинулся вперед
modprobe my_driver.ko Канал=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
Конец теста
Во время воспроизведения/записи в драйвере при проверке значения "runtime->channels" возвращается значение 2!!! Но воспроизводимый волновой файл имеет количество каналов 3...
При проверке данных в записанном файле тишина.
Метод2:
Драйверу предоставляется channel_count '3' в качестве входного параметра через модуль
Измененный драйвер для заполнения структуры snd_pcm_hardware следующим образом: playback->channels_min = 3 и playback->channels_min = 4; аналогичные значения для пути захвата
aplay/arecord сообщает, что «количество каналов недоступно», хотя используемый файл Wave имеет 3 канала
Попробовал aplay/arecord с plughw, и aplay/arecord продвинулся вперед
Во время воспроизведения/записи в драйвере при проверке значения "runtime->channels" возвращается значение 4!!! Но воспроизводимый волновой файл имеет количество каналов 3...
При проверке данных в записанном файле тишина.
Итак, из приведенных выше наблюдений runtime->channels равно 2 или 4, но никогда 3 канала не использовались стеком ALSA, хотя запрашивалось. При использовании Plughw ALSA преобразует данные для запуска в 2 или 4 каналах.
Может кто-нибудь помочь, почему я не могу использовать количество каналов 3? Предоставлю больше информации, если нужно. Спасибо заранее.
решение1
Спасибо за ваш ответ.
Размещу вопрос в stackoverflow.
Если вы можете помочь дальше, вот то, что вы просили.
определить DEFAULT_PERIOD_SIZE (4096)
определить DEFAULT_NO_OF_PERIODS (1024)
статическая структура snd_pcm_hardware xxx_playback =
{
.info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_SYNC_START,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.rates = (SNDRV_PCM_RATE_8000 | \
SNDRV_PCM_RATE_16000 | \
SNDRV_PCM_RATE_48000 | \
SNDRV_PCM_RATE_96000),
.rate_min = 8000,
.rate_max = 96000,
.channels_min = 1,
.channels_max = 1,
.buffer_bytes_max = (DEFAULT_PERIOD_SIZE * DEFAULT_NO_OF_PERIODS),
.period_bytes_min = DEFAULT_PERIOD_SIZE,
.period_bytes_max = DEFAULT_PERIOD_SIZE,
.periods_min = DEFAULT_NO_OF_PERIODS,
.periods_max = DEFAULT_NO_OF_PERIODS,
};
Аналогичные значения для структуры snd_pcm_hardware на стороне захвата.
Обратите внимание, что следующие значения будут заменены в точке входа открытия воспроизведения на основе текущей конфигурации аудиотеста: (пользователь указывает формат аудио, скорость аудио, количество каналов через параметры модуля в качестве входных данных для драйвера, которые повторно заполняются в структуре snd_pcm_hardware)
xxx_воспроизведение.форматы,
xxx_playback.ставки,
xxx_воспроизведение.скорость_мин, xxx_воспроизведение.скорость_макс,
xxx_воспроизведение.каналы_мин, xxx_воспроизведение.каналы_макс
(Аналогично значения заменяются в структуре snd_pcm_hardware на стороне захвата)