一、问题描述
接上usb摄像头,插上喇叭,重启设备,有时候有声音,有时候没有
二、问题原因
原因:插上usb设卡后又两个声卡,而重启后哪个声卡的节点先生成不确定,而hal层中只是打开第一个节点,而usb声卡是没有播放功能的,所以节点中没有播放节点,所以没有声音
三、解决方案
修改HAL, 检测各个节点的播放声卡是否存在,如果存在则使用那个节点播放声音。
--- a/hal/platform.c
+++ b/hal/platform.c
@@ -1175,6 +1175,7 @@ int get_platform_snd_card_config(int *card, int *port,
struct pdev_profile *profile = NULL;
char dev_name[50];
unsigned int i;
+ char filePath[128]={0};
pdev2str(dev_name, platform_device);
@@ -1193,6 +1194,17 @@ int get_platform_snd_card_config(int *card, int *port,
return -1;
}
+ for(i=0;i<64;i++){
+ memset(filePath, 0, sizeof(filePath));
+ sprintf(filePath,"/dev/snd/pcmC%dD0p",i);
+ if(!access(filePath,0)){
+ break;
+ }
+ }
+ if(i != 64){
+ profile->frontend.card = i;
+ }
+
/* get snd_card_config */
*card = profile->frontend.card;
*port = profile->frontend.port;
首先声明了一个名为
filePath
的字符数组,用于存储文件路径。这个数组的大小是128字节。接下来,通过pdev2str
函数将platform_device
转换为一个字符串,保存在dev_name
数组中。然后,使用一个循环从0到63遍历,拼接出一个名为filePath
的文件路径字符串/dev/snd/pcmC%dD0p
,其中%d是循环变量i。然后,使用access
函数检查该路径下的文件是否存在。如果该路径下的文件存在,access
函数将返回0,并跳出循环。接下来,检查循环变量i是否等于64,如果不等于,说明在之前的循环中找到了一个存在的文件路径,将其赋值给profile->frontend.card
,即声卡的配置。最后,将profile->frontend.card
赋值给*card
,作为函数的返回值。