Linux ALSA 驱动程序使用通道数 3
Linux ALSA Driver using channel count 3
正在 运行 在 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 层
发现 aplay/arecord 对于 channel_count = 1 或 2 或 4
工作正常
在 aplay/arecord 期间,在驱动程序中检查 "runtime->channels" 值时,它反映了配置的 channel_count,这对我来说是正确的。
记录与播放的数据匹配,因为它是一个环回测试。
但是当我使用 channel_count = 3 时,aplay 或 arecord 报告
"Broken configuration for this PCM: no configurations available"!!对于带有 channel_count '3'
的波形文件
ex: Playing WAVE './xxx.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Channels 3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) 从 PCM 不可用
aplay:set_params:1204:此 PCM 的配置损坏:没有可用的配置
通过以下更改,我能够向前推进一点:
.......................
方法一:
提供驱动程序channel_count“3”作为通过模块参数的输入
修改驱动程序以填充 snd_pcm_hardware 结构作为回报->channels_min = 2 & 回放->channels_min = 3;捕获路径的相似值
aplay/arecord 报告为 'channel count not available',尽管正在使用的 wave 文件有 3 个通道
ex: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Playing WAVE './xxx.wav' : Signed 16 bit Little Endian, Rate 48000 Hz,频道 3
aplay:set_params:1239:频道数不可用
尝试 aplay/arecord 使用 plughw,aplay/arecord 向前推进
arecord -D plughw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav
aplay -D插件hw: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" 值时 returns 值 2!!!但是播放的 wavefile 有 ch count 3...
当检查记录文件中的数据时,它全部静音
.......................
方法二:
提供驱动程序channel_count“3”作为通过模块参数的输入
修改驱动程序以填充snd_pcm_hardware结构作为回放->channels_min = 3 &回放->channels_min = 4;捕获路径的相似值
aplay/arecord 报告为 'channel count not available',尽管正在使用的 wave 文件有 3 个通道
尝试 aplay/arecord 使用 plughw,aplay/arecord 向前推进
在 aplay/arecord 期间,在驱动程序中检查 "runtime->channels" 值时 returns 值 4!!!但是播放的 wavefile 有 ch count 3...
当检查记录文件中的数据时,它全部静音
.......................
所以根据上面的观察,运行time->channels 要么是 2 要么是 4,但是 alsa stack 从来没有使用过 3 个通道,尽管请求。使用 Plughw 时,alsa 在 2 或 4 通道下将数据转换为 运行。
任何人都可以帮助为什么我无法使用通道数 3。
如有需要,将提供更多信息。
提前致谢。
一个句点(和整个缓冲区)必须包含整数个帧,即不能有部分帧。
三个通道,一帧有六个字节。固定周期大小 (4096) 不能被 6 整除而没有余数。
感谢 CL。
对于这个通道数为 3 的特定测试用例,我使用了周期大小 4092,并且能够成功环回(不使用 plughw)。
最后一个问题,我之前用plughw的时候,runtime->channels不是2就是4,为什么记录的数据没有显示?
正在 运行 在 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 层
发现 aplay/arecord 对于 channel_count = 1 或 2 或 4
工作正常在 aplay/arecord 期间,在驱动程序中检查 "runtime->channels" 值时,它反映了配置的 channel_count,这对我来说是正确的。
记录与播放的数据匹配,因为它是一个环回测试。
但是当我使用 channel_count = 3 时,aplay 或 arecord 报告
"Broken configuration for this PCM: no configurations available"!!对于带有 channel_count '3'
的波形文件ex: Playing WAVE './xxx.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Channels 3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) 从 PCM 不可用
aplay:set_params:1204:此 PCM 的配置损坏:没有可用的配置
通过以下更改,我能够向前推进一点:
.......................
方法一:
提供驱动程序channel_count“3”作为通过模块参数的输入
修改驱动程序以填充 snd_pcm_hardware 结构作为回报->channels_min = 2 & 回放->channels_min = 3;捕获路径的相似值
aplay/arecord 报告为 'channel count not available',尽管正在使用的 wave 文件有 3 个通道
ex: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Playing WAVE './xxx.wav' : Signed 16 bit Little Endian, Rate 48000 Hz,频道 3
aplay:set_params:1239:频道数不可用
尝试 aplay/arecord 使用 plughw,aplay/arecord 向前推进
arecord -D plughw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav
aplay -D插件hw: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" 值时 returns 值 2!!!但是播放的 wavefile 有 ch count 3...
当检查记录文件中的数据时,它全部静音
.......................
方法二:
提供驱动程序channel_count“3”作为通过模块参数的输入
修改驱动程序以填充snd_pcm_hardware结构作为回放->channels_min = 3 &回放->channels_min = 4;捕获路径的相似值
aplay/arecord 报告为 'channel count not available',尽管正在使用的 wave 文件有 3 个通道
尝试 aplay/arecord 使用 plughw,aplay/arecord 向前推进
在 aplay/arecord 期间,在驱动程序中检查 "runtime->channels" 值时 returns 值 4!!!但是播放的 wavefile 有 ch count 3...
当检查记录文件中的数据时,它全部静音
.......................
所以根据上面的观察,运行time->channels 要么是 2 要么是 4,但是 alsa stack 从来没有使用过 3 个通道,尽管请求。使用 Plughw 时,alsa 在 2 或 4 通道下将数据转换为 运行。
任何人都可以帮助为什么我无法使用通道数 3。
如有需要,将提供更多信息。
提前致谢。
一个句点(和整个缓冲区)必须包含整数个帧,即不能有部分帧。
三个通道,一帧有六个字节。固定周期大小 (4096) 不能被 6 整除而没有余数。
感谢 CL。
对于这个通道数为 3 的特定测试用例,我使用了周期大小 4092,并且能够成功环回(不使用 plughw)。
最后一个问题,我之前用plughw的时候,runtime->channels不是2就是4,为什么记录的数据没有显示?