正在Ubuntu 14.04、64位,3.16.0-30通用内核上运行我的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结构的相似值。
请注意,根据当前的音频测试配置,以下打开播放入口点中的值将被替换:(用户通过模块参数将音频格式,音频速率,声道数作为驱动程序的输入,并以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结构重新填充值。
硬件成功配置为基于channel_count,格式,sample_rate和驱动程序寄存器的时钟,并已在ALSA层成功配置
找到一个play / arecord对于channel_count = 1或2或4正常工作>]
在播放/录制期间,在驱动程序中选中“运行时->频道”值时,它反映了配置的channel_count,这对我来说是正确的。
记录数据与播放的匹配,因为它是回送测试。
但是当我使用channel_count = 3时,无论是播放还是记录报告
“此PCM的配置已损坏:无可用配置!!!!对于channel_count为'3'的wave文件
例如:正在播放WAVE'./xxx.wav':有符号16位Little Endian,速率48000 Hz,通道3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave)从属PCM无法使用
播放:set_params:1204:此PCM的配置损坏:无可用的配置
通过以下更改,我可以继续前进:
...................................
方法1:
通过模块参数将驱动程序提供的channel_count'3'作为输入
修改后的驱动程序,将snd_pcm_hardware结构填充为payback-> channels_min = 2&playback-> channels_min = 3;捕获路径的相似值
尽管播放/录制中报告的'通道数不可用',但使用的wave文件有3个通道
ex:aplay -D hw:CARD = xxx,DEV = 0 ./xxx.wav播放WAVE'./xxx.wav':有符号16位Little Endian,速率48000 Hz,通道3
播放:set_params:1239:频道数不可用
使用plughw尝试播放/记录,并且播放/记录向前移动
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位小字节序,速率48000 Hz,通道3
正在播放WAVE'./xxx.wav':有符号16位Little Endian,速率48000 Hz,通道3
测试结束
在播放/录制期间,在驱动程序中,当检查“运行时->频道”值时,它将返回值2!但是播放的波形文件具有ch计数3 ...
当检查记录文件中的数据时,全部静音
...................................
方法2:
通过模块参数将驱动程序提供的channel_count'3'作为输入
修改后的驱动程序,将snd_pcm_hardware结构填充为播放-> channels_min = 3&播放-> channels_min = 4;捕获路径的相似值
尽管播放/录制中报告的'通道数不可用',但使用的wave文件有3个通道
使用plughw尝试播放/记录,并且播放/记录向前移动
在播放/录制期间,在驱动程序中,当检查“运行时->频道”值时,它将返回值4!但是播放的波形文件具有ch计数3 ...
当检查记录文件中的数据时,全部静音
...................................
因此,从上面的观察中可以看出,runtime->通道为2或4,但是alsa堆栈从未使用过3个通道,尽管它们是被请求的。当使用Plughw时,alsa会将数据转换为在2或4通道下运行。
谁能帮忙为什么不能使用频道计数3。
如果需要,将提供更多信息。
预先感谢。
正在Ubuntu 14.04、64位,3.16.0-30通用内核上运行我的ALSA驱动程序。硬件是专有硬件,因此无法提供太多细节。以下是现有的驱动程序实现:驱动程序...
一个时间段(和整个缓冲区)必须包含整数个帧,即,不能有部分帧。
[具有三个通道,一帧具有六个字节。固定周期大小(4096)不能被六整除。
感谢CL。