1

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

Аппаратное обеспечение является проприетарным, поэтому не может дать много подробностей.

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

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

  1. Драйвер предоставлен channel_count '3' в качестве входа через параметр модуля
  2. Модифицированный драйвер для заполнения структуры snd_pcm_hardware в виде окупаемости-> channel_min = 2 & воспроизведения-> channel_min = 3; Аналогичные значения для пути захвата
  3. aplay/arecord сообщает как «число каналов недоступно», хотя используемый волновой файл имеет 3 канала

например: aplay -D hw: CARD = xxx, DEV = 0 ./xxx.wav Воспроизведение WAVE './xxx.wav': 16-разрядный бит с прямым порядком байтов, скорость 48000 Гц, каналы 3

aplay: set_params: 1239: количество каналов недоступно

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

Конец теста

  1. Во время aplay/arecord, в драйвере, когда проверяется значение «runtime-> channel», возвращается значение 2 !!! Но проигранный волновой файл имеет количество ч 3 ...

  2. Когда данные в записанном файле проверены, вся тишина


Method2:

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

  2. Модифицированный драйвер для заполнения структуры snd_pcm_hardware: воспроизведение-> channel_min = 3 и воспроизведение-> channel_min = 4; Аналогичные значения для пути захвата

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

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

  5. Во время aplay/arecord, в драйвере, когда проверяется значение «runtime-> channel», возвращается значение 4 !!! Но проигранный волновой файл имеет количество ч 3 ...

  6. Когда данные в записанном файле проверены, вся тишина

Итак, из вышеприведенных наблюдений, runtime-> channel равно 2 или 4, но никогда не использовалось 3 канала стеком alsa, хотя и запрашивалось. Когда используется Plughw, alsa преобразует данные для запуска по 2 или 4 каналам.

Может кто-нибудь помочь, почему я не могу использовать количество каналов 3. Предоставит больше информации, если это необходимо. Заранее спасибо.

1 ответ1

0

Спасибо за ваш ответ.

Поместит вопрос в 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_playback.formats,

xxx_playback.rates,

xxx_playback.rate_min, xxx_playback.rate_max,

xxx_playback.channels_min, xxx_playback.channels_max

(Аналогичным образом значения заменяются в структуре snd_pcm_hardware на стороне захвата)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .