Драйвер Linux ALSA, использующий количество каналов 3

Драйвер Linux ALSA, использующий количество каналов 3

Я использую драйвер ALSA на Ubuntu 14.04, 64 бит, ядро ​​3.16.0-30-generic.

Оборудование является собственностью компании, поэтому не можем предоставить подробную информацию.

Ниже представлена ​​существующая реализация драйвера:

  1. Драйверу предоставляется channel_count в качестве входных данных через параметр модуля. (В связи с требованиями необходимо предоставить ch count через параметр модуля)
  2. Драйвер заполняет структуру alsa snd_pcm_hardware следующим образом: playback->channels_min = channel_count и playback->channels_max = channel_count; Те же значения для стороны захвата.
  3. Аппаратное обеспечение настроено для работы часов на основе channel_count, и драйвер успешно регистрируется на уровне ALSA.
  4. aplay/arecord отлично работает для channel_count = 1/2/4
  5. Во время 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:

  1. Драйверу предоставляется channel_count '3' в качестве входного параметра через модуль
  2. Измененный драйвер для заполнения структуры snd_pcm_hardware как payback->channels_min = 2 и playback->channels_min = 3; Аналогичные значения для пути захвата
  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: Количество каналов недоступно

  1. Попробовал 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

Конец теста

  1. Во время воспроизведения/записи в драйвере при проверке значения "runtime->channels" возвращается значение 2!!! Но воспроизводимый волновой файл имеет количество каналов 3...

  2. При проверке данных в записанном файле тишина.


Метод2:

  1. Драйверу предоставляется channel_count '3' в качестве входного параметра через модуль

  2. Измененный драйвер для заполнения структуры snd_pcm_hardware следующим образом: playback->channels_min = 3 и playback->channels_min = 4; аналогичные значения для пути захвата

  3. aplay/arecord сообщает, что «количество каналов недоступно», хотя используемый файл Wave имеет 3 канала

  4. Попробовал aplay/arecord с plughw, и aplay/arecord продвинулся вперед

  5. Во время воспроизведения/записи в драйвере при проверке значения "runtime->channels" возвращается значение 4!!! Но воспроизводимый волновой файл имеет количество каналов 3...

  6. При проверке данных в записанном файле тишина.

Итак, из приведенных выше наблюдений 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 на стороне захвата)

Связанный контент