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

使用通道计数3的Linux ALSA驱动程序,linux,ubuntu,audio,alsa,Linux,Ubuntu,Audio,Alsa,我在Ubuntu 14.04、64位、3.16.0-30通用内核上运行我的ALSA驱动程序 硬件是专有硬件,因此不能给出太多细节 以下是现有的驱动程序实现: 驱动程序通过模块参数提供采样格式、采样率、通道计数作为输入。(由于需要通过模块参数提供输入) 播放路径的初始snd_pcm_硬件结构 #define DEFAULT_PERIOD_SIZE (4096) #define DEFAULT_NO_OF_PERIODS (1024) static struct snd_pcm_hardware x

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

硬件是专有硬件,因此不能给出太多细节

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

驱动程序通过模块参数提供采样格式、采样率、通道计数作为输入。(由于需要通过模块参数提供输入)

播放路径的初始snd_pcm_硬件结构

#define DEFAULT_PERIOD_SIZE (4096)
#define DEFAULT_NO_OF_PERIODS (1024)
static struct 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_硬件结构的类似值

请注意,根据当前音频测试配置,以下值在播放打开入口点中被替换: (用户通过模块参数向驱动程序输入音频格式、音频速率、信道计数,并在snd_pcm_硬件结构中重新填充)

类似地,在capture open入口点中为capture snd_pcm_硬件结构重新填充值

硬件配置为基于通道计数、格式、采样率和ALSA层的驱动器寄存器的时钟

发现通道计数为1或2或4时播放/录制工作正常

在播放/录制过程中,在驱动程序中,当选中“运行时->通道”值时,它反映了配置的通道计数,这听起来对我来说是正确的

记录数据与播放数据匹配,因为这是一个循环测试

但是当我使用channel_count=3时,aplay或arecord都会报告

“此PCM的配置已损坏:没有可用的配置”!!对于通道计数为“3”的波形文件

例如:播放波形“/xxx.wav”:有符号16位小端,速率48000 Hz,通道3

ALSA lib pcm_参数c:2162:(snd1_pcm_hw_refine_slave)从pcm不可用

aplay:set_params:1204:此PCM的配置已断开:没有可用的配置

通过以下改变,我得以向前迈进一步:

方法1:

通过模块参数将通道_计数“3”作为输入提供给驱动器

修改驱动程序,以填充snd_pcm_硬件结构,如回收->通道_min=2和播放->通道_min=3;捕获路径的类似值

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

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

aplay:设置参数:1239:通道计数不可用

使用插头HW尝试了aplay/arecord,aplay/arecord向前移动

arecord-D plughw:CARD=xxx,DEV=0-d3-fs16_LE-r48000-c3./xxx_rec0.wav

aplay-D plughw:CARD=xxx,DEV=0./xxx.wav

记录波“/xxx_rec0.wav”:有符号16位小端点,频率48000 Hz,通道3

播放波形“/xxx.wav”:有符号16位小端点,速率48000 Hz,通道3

测试结束

在播放/录制过程中,当在驱动程序中选中“运行时->频道”值时,它返回值2!!!但播放的波形有ch计数3

当检查记录文件中的数据时,其所有静音

方法2:

通过模块参数将通道_计数“3”作为输入提供给驱动器

修改驱动程序,将snd_pcm_硬件结构填充为回放->通道\u min=3&回放->通道\u min=4;捕获路径的类似值

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

使用插头HW尝试了aplay/arecord,aplay/arecord向前移动

在播放/录制过程中,当在驱动程序中选中“runtime->channels”值时,它返回值4!!!但播放的波形有ch计数3

当检查记录文件中的数据时,其所有静音

因此,根据以上观察,runtime->channels是2或4,但alsa堆栈从未使用过3个通道。使用Plughw时,alsa将数据转换为在2或4通道下运行

有人能帮我解释为什么我不能使用通道计数3吗

如果需要,将提供更多信息

提前感谢。

一个时段(以及整个缓冲区)必须包含整数帧,即不能有部分帧

对于三个通道,一个帧有六个字节。固定期间大小(4096)不能被6整除而没有余数。

谢谢CL

对于这个通道计数为3的特定测试用例,我使用了周期大小4092,并且能够成功地执行回圈(不使用plughw)

最后一个问题,当我之前使用plughw时,当runtime->channels为2或4时,为什么记录的数据没有显示出来

xxx_playback.formats = user_format_input
xxx_playback.rates = xxx_playback.rate_min, xxx_playback.rate_max = user_sample_rate_input
xxx_playback.channels_min = xxx_playback.channels_max = user_channel_input