最近在调试RK3288 Android4.4.4,该方案默认配置上SPDIF时HDMI就没声音,但客户需求是同时要有声音的,于是驱动配置上后,呈现两个声卡状态,此时需要通过修改HAL层来处理(RK3288 Android4.4.4对应的HAL层源码为hardware/rk29/audio目录),修改如下:
1.修改AudioHardware.cpp文件,在AudioHardware::AudioHardware() 构造函数头部的mPcm(NULL),一句后面添加mPcm1(NULL),一句,然后在AudioHardware::~AudioHardware()析构函数体内的TRACE_DRIVER_IN(DRV_MIXER_CLOSE)一句前添加如下内容:
if (mPcm1) {
route_pcm1_close();
}
接下来在struct pcm *AudioHardware::openPcmOut_l()函数体内的return mPcm;前一个}括号符前添加如下内容:
mPcm1 = route_pcm1_open(2, flags); //其中2为声卡2(除默认外的第2张声卡,可查看/proc/asound/cards获得该序号)
接下来在void AudioHardware::closePcmOut_l()函数体内的mPcm = NULL;后面添加如下内容:
route_pcm1_close();
mPcm1 = NULL;
接下来在ssize_t AudioHardware::AudioStreamOutALSA::write函数体内的ret = pcm_write(mHardware->getPcm(),(void*) p, bytes);一句后面添加ret = pcm_write(mHardware->getPcm1(),(void*) p, bytes);一句。
2.修改AudioHardware.h文件,在struct pcm *getPcm() { return mPcm; };后面添加struct pcm *getPcm1() { return mPcm1; };一句,在
android::SortedVector mInputs;
android::MutexmLock;
struct pcm*mPcm;
后面添加struct pcm*mPcm1;一句。
3.修改alsa_audio.h文件,添加如下内容:
struct pcm *route_pcm1_open(int card, unsigned int flags);
int route_pcm1_close(void);
4.修改alsa_route.c文件,在struct pcm* mPcm[PCM_MAX + 1];后面添加struct pcm* mPcm1;一句,在文件尾部添加如下内容:
struct pcm *route_pcm1_open(int card, unsigned flags)
{
ALOGD("lxt route_pcm1_open()");
flags &= ~PCM_CARD_MASK;
switch(card) {
case 1:
flags |= PCM_CARD1;
break;
case 2:
flags |= PCM_CARD2;
break;
default:
flags |= PCM_CARD1;
break;
}
flags &= ~PCM_DEVICE_MASK;
flags |= PCM_DEVICE0;
mPcm1 = pcm_open(flags);
return mPcm1;
}
int route_pcm1_close(void)
{
ALOGD("lxt route_pcm1_close()");
pcm_close(mPcm1);
return 0;
}
至此,相关代码修改完成,调试过程主要是修改上面的函数参数值2来验证。
网友评论