微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > mt6735 如何在Framework层互斥两个通过MediaPlayer 播放的 音...

mt6735 如何在Framework层互斥两个通过MediaPlayer 播放的 音...

时间:10-02 整理:3721RD 点击:
[Audio php?mod=tag&id=6090" target="_blank" class="relatedlink">Framework]如何在Framework层互斥两个通过MediaPlayer播放的音乐播放器
[DESCRIPTION]
市面上有些播放器是通过 MediaPlayer 这个类来实现音乐播放的
但是它们在播放音乐的时候, 没有去做 requestAudioFocus 的动作
导致有可能出现两个播放器在同时发声播放音乐
如果想做到同一个时间某两个播放器只能有一个发声
即 A 播放时, 再播放 B, 此时 A 会自动暂停, 反之亦然
可以参考如下改法:
注意, 此改法只针对使用 MediaPlayer 类播放音乐的播放器才有效
像 Kugou, 天天动听之类的播放器并非使用 MediaPlayer 类播放音乐, 修改无效
[SOLUTION]
MediaPlayerService.h中, 在下面这行
void removeCLIent(wp<Client> client);
之后, 加入下面这行:
SortedVector< wp<Client> > getClients(){return mClients;};
在下面这行
int getAudioSessionId() { return mAudioSessionId; }
之前,加入下面这行:
char* getProcessName(int pid);
MediaPlayerService.cpp 中加入定义:
const char* process1="com.google.android.music"; //对应播放器1的包名, 请按需更改
const char* process2="com.estrongs.android.pop"; //对应播放器2的包名, 请按需更改
MediaPlayerService.cpp 中加入方法:(加在 MediaPlayerService::Client::start 方法前面即可
)
char* MediaPlayerService::Client::getProcessName(int pid){
char process_name[40] = {0};
char filename[20] = {0};
FILE *f = NULL;
snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid);
f = fopen(filename, "r");
if (NULL == f)
{
*process_name = '\0';
}
if (!fgets(process_name, sizeof(process_name), f))
{
*process_name = '\0';
}
if(NULL != f)
fclose(f);
return process_name;
}
MediaPlayerService.cpp 将 MediaPlayerService::Client::start 方法改为如下
status_t MediaPlayerService::Client::start()
{
ALOGV("[%d] start", mConnId);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
p->setLooping(mLoop);
MM_LOGI("[%d] start", mConnId);
//add begin
#if 1 //customize code
char* process_name = getProcessName(IPCThreADState::self()->getCallingPid());
//todo: should lock mService first.
SortedVector< wp<Client> > mcs = mService->getClients();
ALOGD("current play process %s",process_name);
if(!strncasecmp(process_name, process1, sizeof(process1))){
int count = mcs.size();
for(int i=0; i< count; i++){
sp<Client> c = mcs.pROMote();
char * process_name2 = getProcessName(c->pid());
ALOGD("process_name1=%s, pid=%d",process_name2, c->pid());
if(!strncasecmp(process_name2, process2, sizeof(process2))){
bool state=false;
c->isPlaying(&state);
if(state){
ALOGD("pause ");
c->pause();
c->mClient->notify(7,0,0,0);
}
}
}
}else if(!strncasecmp(process_name, process2, sizeof(process2))){
int count = mcs.size();
for(int i=0; i< count; i++){
sp<Client> c = mcs.promote();
char * process_name2 = getProcessName(c->pid());
ALOGD("process_name2=%s, pid=%d",process_name2, c->pid());
if(!strncasecmp(process_name2, process1, sizeof(process1))){
bool state=false;
c->isPlaying(&state);
if(state){
ALOGD("pause ");
c->pause();
c->mClient->notify(7,0,0,0);
}
}
}
}
#endif
//add end
return p->start();
}

学习了,谢谢。

暂时还没这需求,先收藏了。感谢小编的分享!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top