[Linux ALSA驱动程序,使用通道数3

问题描述 投票:2回答:2

正在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驱动程序。硬件是专有硬件,因此无法提供太多细节。以下是现有的驱动程序实现:驱动程序...

linux ubuntu audio alsa
2个回答
1
投票

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

[具有三个通道,一帧具有六个字节。固定周期大小(4096)不能被六整除。


1
投票

感谢CL。

© www.soinside.com 2019 - 2024. All rights reserved.