使用 channel 数 3 的 Linux ALSA 驱动程序

标签 linux ubuntu audio alsa

我在 Ubuntu 14.04、64 位、3.16.0-30-generic 内核上运行我的 ALSA 驱动程序。

硬件是专有硬件,因此不能提供太多细节。

以下是现有的驱动程序实现:

驱动程序通过模块参数提供采样格式、采样率、 channel 计数作为输入。 (由于需求需要通过模块参数提供输入)

播放路径的初始 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 结构的类似值。

请注意,根据当前音频测试配置,以下值在播放打开入口点中被替换:
(用户通过模块参数提供音频格式、音频速率、 channel 数作为驱动程序的输入,在 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 计数、格式、采样率和驱动寄存器成功地使用 ALSA 层为时钟配置硬件

发现 channel_count = 1 或 2 或 4 的 aplay/arecord 工作正常

在 aplay/arecord 期间,在驱动程序中检查“runtime->channels”值时,它反射(reflect)了配置的 channel_count,这对我来说听起来是正确的。

记录数据与播放匹配,因为它是一个环回测试。

但是当我使用 channel_count = 3 时,aplay 或 arecord 报告

“此 PCM 的配置损坏:无可用配置”!!对于具有 channel_count '3' 的波形文件

例如:播放 WAVE './xxx.wav':有符号 16 位 Little Endian,速率 48000 Hz, channel 3

ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) 从属 PCM 不可用

aplay: set_params:1204: 此 PCM 的配置损坏:没有可用的配置

通过以下更改,我能够前进一点:

…………………………………………………………………………………………………………

方法1:

通过模块参数为驱动程序提供 channel_count '3' 作为输入

修改驱动以填充 snd_pcm_hardware 结构为 payback->channels_min = 2 &playback->channels_min = 3;捕获路径的相似值

aplay/arecord 报告为“ channel 计数不可用”,尽管正在使用的波形文件有 3 个 channel

例如:aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Playing WAVE './xxx.wav' : 有符号 16 位 Little Endian,速率 48000 Hz, channel 3

aplay: set_params:1239: channel 数不可用

用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, channel 3

播放 WAVE './xxx.wav' :有符号 16 位 Little Endian,速率 48000 Hz, channel 3

测试结束

在 aplay/arecord 期间,在驱动程序中,当检查“runtime->channels”值时,它返回值 2!!!但是播放的波形文件有 ch count 3 ......

当检查记录文件中的数据时,它的所有静音

…………………………………………………………………………………………………………

方法2:

通过模块参数为驱动程序提供 channel_count '3' 作为输入

修改驱动程序以填充 snd_pcm_hardware 结构为播放-> channel _min = 3 &播放-> channel _min = 4;捕获路径的相似值

aplay/arecord 报告为“ channel 计数不可用”,尽管正在使用的波形文件有 3 个 channel

用plughw尝试了aplay/arecord,aplay/arecord继续前进

在 aplay/arecord 期间,在驱动程序中,当检查“runtime->channels”值时,它返回值 4!!!但是播放的波形文件有 ch count 3 ......

当检查记录文件中的数据时,它的所有静音

…………………………………………………………………………………………………………

因此,从上面的观察来看,runtime->channels 是 2 或 4,但尽管请求,但 alsa 堆栈从未使用 3 个 channel 。使用 Plughw 时,alsa 将数据转换为在 2 或 4 channel 下运行。

谁能帮助我为什么无法使用 channel 计数 3。

如果需要,将提供更多信息。

提前致谢。

最佳答案

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

对于三个 channel ,一帧有六个字节。固定周期大小 (4096) 不能被 6 整除而没有余数。

关于使用 channel 数 3 的 Linux ALSA 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30304697/

相关文章:

linux - 如何在 Linux 中使用 SHA256 对 EXE 进行签名?

使用 .po 和 .mo 文件进行 PHP 语言翻译

java - 在 ubuntu 中安装 eclipse(eclipse-jee-helios-linux-gtk-x86_64) 时出错

delphi - 如何在delphi中调整麦克风输入电平?

linux - boost 静态链接

windows - 套接字 : Client was disconnected or not?

java - 如何使用进程 ID 获取有关 linux 进程的更多详细信息?

python - 如何在不编译任何东西的情况下在 Ubuntu 18.04 LTS 上安装 Python 3.5.x

java - 想要通过我的服务器将音频上传到声音云,我如何检查仅从外部存储目录上传歌曲

actionscript-3 - 外部mp3文件的错误调用