Linux ALSA 驱动程序使用通道数 3

Linux ALSA 驱动程序使用通道数 3

我在 Ubuntu 14.04、64 位、3.16.0-30-generic 内核上运行我的 ALSA 驱动程序。

硬件是专有的,因此无法提供太多细节。

以下是现有的驱动程序实现:

  1. 驱动程序通过模块参数提供 channel_count 作为输入。(由于要求需要通过模块参数提供 ch 计数)
  2. 驱动程序填充 alsa snd_pcm_hardware 结构为 playing->channels_min = channel_count & for playing->channels_max = channel_count; 对于捕获端,值相同。
  3. 根据 channel_count 配置硬件时钟,并且驱动程序成功向 ALSA 层注册
  4. aplay/arecord 在 channel_count = 1/2/4 时工作正常
  5. 在播放/录制过程中,在驱动程序中检查“runtime->channels”值时,它反映了配置的 channel_count,这听起来是正确的。录制数据与播放的数据相匹配,因为它是回环测试。

但是当我使用 channel_count = 3 时,对于 channel_count 为 '3' 的波形文件,aplay 或 arecord 都会报告“此 PCM 的配置损坏:没有可用的配置”!!

例如:播放 WAVE './xxx.wav' :有符号 16 位 Little Endian,速率 48000 Hz,通道 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 & playing->channels_min = 3;捕获路径的值类似
  3. aplay/arecord 报告为“通道数不可用”,尽管正在使用的波形文件有 3 个通道

例如:aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav 播放 WAVE './xxx.wav' : 有符号 16 位小端,速率 48000 Hz,通道 3

aplay:set_params:1239:频道数量不可用

  1. 尝试使用 plughw 进行 aplay/arecord,并且 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 Hz,通道 3

播放 WAVE './xxx.wav' :有符号 16 位 Little Endian,速率 48000 Hz,通道 3

测试结束

  1. 在播放/录制期间,在驱动程序中检查“运行时->通道”值时,它返回值 2!!! 但播放的波形文件的通道数为 3...

  2. 当检查录制文件中的数据时,一切都静默


方法2:

  1. 驱动程序通过模块参数提供 channel_count '3' 作为输入

  2. 修改驱动程序以填充 snd_pcm_hardware 结构,因为 playing->channels_min = 3 & playing->channels_min = 4;捕获路径的值类似

  3. aplay/arecord 报告为“通道数不可用”,尽管正在使用的波形文件有 3 个通道

  4. 尝试使用 plughw 进行 aplay/arecord,并且 aplay/arecord 取得了进展

  5. 在播放/录制期间,在驱动程序中检查“运行时->通道”值时,它返回值 4!!! 但播放的波形文件的通道数为 3...

  6. 当检查录制文件中的数据时,一切都静默

因此,从上面的观察来看,runtime->channels 要么是 2,要么是 4,但 alsa 堆栈从未使用过 3 个通道(尽管请求过)。使用 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_playback.格式,

xxx_playback.rates,

xxx_playback.rate_min,xxx_playback.rate_max,

xxx_playback.channels_min,xxx_playback.channels_max

(类似地,捕获端的 snd_pcm_hardware 结构中的值被替换)

相关内容