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

Don*_*guo 1 audio android alsa linux-device-driver

最近,我正在尝试为Linux开发一个alsa驱动程序(实际上是Android TV).我遇到了一个关于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
Run Code Online (Sandbox Code Playgroud)

但是,如果有多个设备(例如,当我插入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
Run Code Online (Sandbox Code Playgroud)

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

三星司机让我很困惑.==> Linux的3.5.4 /设备/三星/克雷斯波/ 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
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你.

Mic*_*ael 5

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
Run Code Online (Sandbox Code Playgroud)

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

在这些平台上,USB音频附件的ALSA卡/设备编号将被WiredAccessoryManager(或主机模式附件中的UsbDeviceManager)拾取(这在Android的Java层中).因此,如果您想避免让音频HAL硬编码USB音频配件的卡/设备编号,那么这些信息是可用的(但我怀疑有些实现只是假设卡1用于USB音频配件).

这是 CodeAurora论坛上音频HAL实现的链接,它是许多高通平台的一种参考实现.这是主机模式USB音频配件(Android Open Accessory)的驱动程序.