使用通道计数3的Linux ALSA驱动程序
我在Ubuntu 14.04、64位、3.16.0-30通用内核上运行我的ALSA驱动程序 硬件是专有硬件,因此不能给出太多细节 以下是现有的驱动程序实现: 驱动程序通过模块参数提供采样格式、采样率、通道计数作为输入。(由于需要通过模块参数提供输入) 播放路径的初始snd_pcm_硬件结构使用通道计数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
#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