最近,我正在尝试为Linux开发一个alsa驱动程序(实际上是Android TV)。我遇到了关于alsa(alsa指的是高级Linux声音架构)设备处理的问题
实际上,我已经研究了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 /设备/三星/克雷斯波/ 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
此外,如果您能与我分享一些源代码以获取更多信息(例如,其他驱动程序......),我将非常感激。
非常感谢你。
答案 0 :(得分: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
在我使用的平台上,除了USB之外的所有音频设备都位于卡0上。我并不是说硬编码卡和设备号码是个好主意 - 只是它在实践中通常不会成为一个真正的问题。直到你开始添加更多卡..
在这些平台上,USB音频配件的ALSA卡/设备编号将由WiredAccessoryManager
(或主机模式附件中的UsbDeviceManager)选取(此处为Android的Java层)。因此,如果您想避免将音频HAL硬编码为USB音频配件的卡/设备编号,那么这些信息是可用的(但我怀疑有些实现只是假设卡1用于USB音频配件)。
Here's a link到CodeAurora论坛的音频HAL实施,它作为许多高通平台的参考实现。 here's the driver用于主机模式USB音频配件(Android Open Accessory)。