关于 ALSA 驱动程序:如何正确处理音频设备

Posted

技术标签:

【中文标题】关于 ALSA 驱动程序:如何正确处理音频设备【英文标题】:About ALSA driver: How to handle Audio Devices correctly 【发布时间】:2013-06-16 04:42:51 【问题描述】:

最近,我正在尝试为Linux(实际上是android TV)开发一个alsa驱动程序。我遇到了一个关于alsa(alsa是指Advanced Linux Sound Architecture)设备处理的问题

实际上,我研究了alsa-lib-1.0.27.1和tinyalsa(适用于android设备)的部分源代码。我研究了三星设备的音频驱动程序。

用户空间应用程序使用 /dev/snd/pcmXXXXX 播放/捕获音频数据。 但是有一个问题,如果只有一个音频设备就可以了;

/dev/snd/
├── by-path
│   └── pci-0000:02:02.0 -> ../controlC0
├── controlC0
├── midiC0D0
├── pcmC0D0c
├── pcmC0D0p
├── pcmC0D1p
└── timer

但是,如果有多个设备(例如,当我插入 USB 音频设备时)。

/dev/snd/
├── by-path
│   └── pci-0000:02:02.0 -> ../controlC0
├── controlC0    
├── controlC1    //new Control channel
├── midiC0D0
├── pcmC0D0c
├── pcmC0D0p
├── pcmC0D1p
├── pcmC1D0c     //new card,new capture channel
├── pcmC1D0p     //new card,new playback channel
└── timer

用户应用程序如何正确处理这些设备。

我真的对三星驱动程序感到困惑。 ==>linux-3.5.4/device/samsung/crespo/libaudio/AudioHardware.cpp

status_t AudioHardware::AudiostreamInALSA::open_l()

//.....
    ALOGV("open pcm_in driver");
    TRACE_DRIVER_IN(DRV_PCM_OPEN)
    mPcm = pcm_open(0, 0, flags, &config); 
          //Why it always uses Card 0 and device 0.
          //does this mean it can not support multi-devices

此外,如果您能分享一段源代码以获取更多信息,我将不胜感激(例如,其他驱动程序...)

真的非常感谢。

【问题讨论】:

【参考方案1】:
mPcm = pcm_open(0, 0, flags, &config); 
      //Why it always uses Card 0 and device 0.
      //does this mean it can not support multi-devices

在我使用过的平台上,除了 USB 之外的所有音频设备都位于卡 0 上。我并不是说硬编码卡和设备编号是个好主意 - 只是它通常不会成为实际问题。直到您开始添加更多卡片..

在这些平台上,USB 音频附件的 ALSA 卡/设备号将由WiredAccessoryManager(或主机模式附件的UsbDeviceManager)获取(这是在安卓)。因此,如果您想避免音频 HAL 对 USB 音频附件的卡/设备号进行硬编码(但我怀疑有些实现只是假设卡 1 用于 USB 音频附件),则该信息是可用的。

Here's a link 致 CodeAurora 论坛上的音频 HAL 实现,它作为许多高通平台的参考实现。 here's the driver 用于主机模式 USB 音频配件(Android Open Accessory)。

【讨论】:

以上是关于关于 ALSA 驱动程序:如何正确处理音频设备的主要内容,如果未能解决你的问题,请参考以下文章

Linux音频驱动学习之:ASOC分析

Linux ALSA驱动之五:Linux ALSA驱动之Platform源码分析(基于Linux 5.18)

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

arm linux利用alsa驱动并使用usb音频设备

Linux ALSA驱动之Platform源码分析(wm8350.c)

Linux ALSA驱动之Platform源码分析(wm8350.c)