在Ubuntu 14.04,64bit,3.16.0-30-generic Kernel上运行我的ALSA驱动程序。
硬件是专有硬件,因此无法提供更多细节。
以下是现有的驱动程序实现:
驱动程序通过模块参数提供样本格式,采样率,channel_count作为输入。 (由于需求需要通过模块参数提供输入)
播放路径的初始snd_pcm_hardware结构。
#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_hardware结构的类似值。
请注意,根据当前音频测试配置,在播放打开入口点中替换以下值: (用户通过模块参数提供音频格式,音频速率,ch计数作为驱动程序的输入,并在snd_pcm_hardware结构中重新填充)
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
同样,在捕获开放入口点捕获snd_pcm_hardware结构时会重新填充值。
使用ALSA层成功配置基于channel_count,format,sample_rate和驱动程序寄存器的时钟的硬件
发现aplay / arecord在channel_count = 1或2或4
时工作正常在aplay / arecord期间,在" runtime-> channel"检查值,它反映了配置的channel_count,这听起来对我来说是正确的。
记录数据与播放匹配,因为它是循环测试。
但是当我使用channel_count = 3时,aplay或arecord报告
"此PCM的配置损坏:无可用配置" !!使用channel_count' 3'
的wave文件ex:播放WAVE' ./ xxx.wav' :签名16位Little Endian,速率48000 Hz,频道3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave)Slave PCM无法使用
aplay:set_params:1204:此PCM的配置损坏:无可用配置
随着以下变化,我能够向前迈进一步:
.........................
方法一:
驱动程序提供了channel_count' 3'作为模块参数输入
修改驱动程序以将snd_pcm_hardware结构填充为回报 - > channels_min = 2& playback-> channels_min = 3;捕获路径的类似值
aplay / arecord报告“'频道数不可用'”,但正在使用的wave文件有3个频道
例如:aplay -D hw:CARD = xxx,DEV = 0 ./xxx.wav播放WAVE' ./ xxx.wav' :签名16位Little Endian,速率48000 Hz,频道3
aplay:set_params:1239:频道数不可用
尝试用plughw播放aplay / arecord,aplay / arecord向前移动
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
测试结束
在aplay / arecord期间,在" runtime-> channels"值被检查它返回值2 !!!但播放的wavefile有ch计数3 ...
当检查录制文件中的数据时,其全部静音
.........................
方法2:
驱动程序提供了channel_count' 3'作为模块参数输入
修改驱动程序以将snd_pcm_hardware结构填充为回放 - > channels_min = 3& playback-> channels_min = 4;捕获路径的类似值
aplay / arecord报告“'频道数不可用'”,但正在使用的wave文件有3个频道
尝试用plughw播放aplay / arecord,aplay / arecord向前移动
在aplay / arecord期间,在" runtime-> channels"值被检查它返回值4 !!!但播放的wavefile有ch计数3 ...
当检查录制文件中的数据时,其全部静音
.........................
因此,从上面的观察结果来看,运行时 - >通道是2或4,但alsa堆栈虽然请求,但从未使用过3个通道。当使用Plughw时,alsa将数据转换为在2或4通道下运行。
任何人都可以帮助我们无法使用频道数3.
如果需要,将提供更多信息。
先谢谢。
答案 0 :(得分:0)
句号(和整个缓冲区)必须包含整数帧,即你不能有部分帧。
有三个通道,一个帧有六个字节。固定周期大小(4096)不能被6整除,没有余数。
答案 1 :(得分:0)
非常感谢CL,这帮助了..
对于通道数为3的特定测试用例,我使用了周期大小4092,并且能够成功进行环回(不使用plughw)。
还有一个疑问,当我早些时候使用plughw时,当运行时 - >通道是2或4时,为什么录制的数据会保持沉默?