在audioFlinger内提高导航音的优先级

 


1 判断音频流来自于哪个程序,如果来源于导航,则将音频类型默认为导航音。

./framework/av/include/media/NaviInfo.h

#include <utils/String8.h>

namespace android {
class NaviInfo
{
public:
    NaviInfo();
    ~NaviInfo();
    bool isNaviCalling();

private:
    void getCallingProcessName(char *name);
	char *mProcName;
	bool isNaviProcess;
};

}

 

./framework/av/media/libmedia/NaviInfo.cpp

#define LOG_NDEBUG 0
#define LOG_TAG "NaviInfo"
#include <utils/Log.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#include <media/NaviInfo.h>


#include <binder/IPCThreadState.h>

namespace android {

static const char *naviPackageName[] = 
{	
	"com.navitel",						  
	"title.navi",						  
	"com.mapabc.android.activity",
	"cld.navi.mobile.mainframe",		  
	"cld.navi.c2335.mainframe",			  
	"cld.navi.c3198.mainframe",			  
	"cld.navi.c2739.mainframe",			  
	"cld.navi.c3347.mainframe",			  
	"cld.navi.c3440.mainframe",			  
	"cld.navi.c2920.mainframe",			  
	"cld.navi.c3380.mainframe",			  
	"cld.navi.c3567.mainframe",			  
	"cld.navi.c3525.mainframe",			  
	"com.nuro.r1.main",			  
	"com.autonavi.xm.navigation",
	"com.autonavi.xmgd.navigator",
	"com.mxnavi.mxnavi",			  
	"com.baidu.BaiduMap",
	"com.baidu.navi",
	"com.autonavi.cmccmap",
	"com.autonavi.minimap",
	"com.sogou.map.android.maps",
	"com.navngo.igo.javaclient",
	"com.basarsoft.igo.javaclient",
	"com.nng.igoprimoisr2013march24.javaclient",
	"ru.yandex.yandexnavi",
	"com.sygic.aura_pndindash",
	"com.mireo.dontpanic.mmi_pnd",
	"com.sogou.map.android.maps",
	"com.uu.uunavi",
	"com.tigerknows",
	"com.sogou.map.android.maps",
	"com.mapquest.android.ace",
	"cz.aponia.bor3",
	"com.kingwaytek",
	"com.waze",
	"com.google.android.apps.maps",
	"cld.navi.p3597.mainframe",
	"com.tencent.navsns",
	"com.tencent.map",
	"com.movon.fcw",
	"com.autonavi.amapauto",
	"com.sygic.aura"
};	

NaviInfo::NaviInfo()
{

}

NaviInfo::~NaviInfo()
{

}

void NaviInfo::getCallingProcessName(char *name)
{
    char proc_node[128];
    int pid = IPCThreadState::self()->getCallingPid();

    if (name == 0)
    {
        ALOGE("error in params");
        return;
    }

    memset(proc_node, 0, sizeof(proc_node));
    sprintf(proc_node, "/proc/%d/cmdline", pid);
    int fp = ::open(proc_node, O_RDONLY);
    if (fp > 0)
    {
        memset(name, 0, 128);
        ::read(fp, name, 128);
        ::close(fp);
        fp = 0;
        ALOGD("Calling process is: %s", name);
    }
    else
    {
        ALOGE("Obtain calling process failed");
    }
	ALOGD("NaviInfo::getCallingProcessName() pid = %d, name = %s", pid, name);
}

bool NaviInfo::isNaviCalling()
{
    char name[128];
    int i = 0;
    int count = sizeof(naviPackageName) / sizeof(naviPackageName[0]);
	
    memset(name, 0x00, 128);
    getCallingProcessName(name);
	
    for(i = 0; i < count; i++)
    {
        if(strcmp(name, naviPackageName[i]) == 0)
        {
            return true;
        }
    }
    return false;
}

}


由上可以看到,就是抓取访问的进程pid,再进一步获取应用包名,比对默认提供的导航包名。如果符合,则将音频类型默认为导航音。此导航音类型也是修改系统后增加,非原生的音频类型。


2  在上层将导航申请发声的音频流强制转化成导航音类型,下面AudioFlinger可以根据音频流类型,强制执行优先级策略。

./framework/av/media/libmedia/mediaplayer.cpp


status_t AudioTrack::set(...){

+    NaviInfo *info = new NaviInfo();
+    bool isNavi = info -> isNaviCalling();
+    if(isNavi) streamType = AUDIO_STREAM_NAVI;

}
./framework/av/media/libmedia/mediaplayer.cpp

status_t MediaPlayer::setAudioStreamType(audio_stream_type_t type){

+    NaviInfo *info = new NaviInfo();
+    bool isNavi = info -> isNaviCalling();
+    if(isNavi) streamType = AUDIO_STREAM_NAVI;

}

3 在AudioFlinger的混音线程内针对音频流类型做策略即可。

./framework/av/services/audioflinger/Threads.cpp

AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTracks_l(
        Vector< sp<Track> > *tracksToRemove)
{

+     naviMixer();

+     if(mIsNaviOn){
+		   if(track->streamType() != AUDIO_STREAM_NAVI)
+		   {
+			 	typeVolume *= 0.5;
+		   }
+     }

}

void AudioFlinger::MixerThread::naviMixer()
{
    size_t count = mActiveTracks.size();

    for (size_t i=0 ; i<count ; i++) {
        const sp<Track> t = mActiveTracks[i].promote();
        if (t == 0) {
            continue;
        }
    
 	// this const just means the local variable doesn't change
 	Track* const track = t.get();

        if(track->streamType() == AUDIO_STREAM_NAVI)
        {
            mIsNaviOn = true;
            return;
        }
    }
    mIsNaviOn = false;
    
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值