android mediaplayer service,Android MediaPlayerService解析

frameworks/av/media/libmediaplayerservice/MediaPlayerService.h

MediaPlayerService 类的继承关系如下:

54d201bb0aa59db9cbcc070bd55540b5.png

Client 和 AudioOutput 是 MediaPlayerService的内部类

IMediaPlayerService是对为提供的接口类, 定义如下:

frameworks/av/include/media/IMediaPlayerService.h

43class IMediaPlayerService: public IInterface

44{

45public:

46 DECLARE_META_INTERFACE(MediaPlayerService);

47

48 virtual spcreateMediaRecorder(const String16 &opPackageName) = 0;

49 virtual spcreateMetadataRetriever() = 0;

50 virtual spcreate(const sp& client,

51 audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE) = 0;

52 virtual spgetOMX() = 0;

53 virtual spmakeHDCP(bool createEncryptionModule) = 0;

54 virtual spgetCodecList() const = 0;

55

56 // Connects to a remote display.

57 // 'iface' specifies the address of the local interface on which to listen for

58 // a connection from the remote display as an ip address and port number

59 // of the form "x.x.x.x:y". The media server should call back into the provided remote

60 // display client when display connection, disconnection or errors occur.

61 // The assumption is that at most one remote display will be connected to the

62 // provided interface at a time.

63 virtual splistenForRemoteDisplay(const String16 &opPackageName,

64 const sp& client, const String8& iface) = 0;

65

66 // codecs and audio devices usage tracking for the battery app

67 enum BatteryDataBits {

68 // tracking audio codec

69 kBatteryDataTrackAudio = 0x1,

70 // tracking video codec

71 kBatteryDataTrackVideo = 0x2,

72 // codec is started, otherwise codec is paused

73 kBatteryDataCodecStarted = 0x4,

74 // tracking decoder (for media player),

75 // otherwise tracking encoder (for media recorder)

76 kBatteryDataTrackDecoder = 0x8,

77 // start to play an audio on an audio device

78 kBatteryDataAudioFlingerStart = 0x10,

79 // stop/pause the audio playback

80 kBatteryDataAudioFlingerStop = 0x20,

81 // audio is rounted to speaker

82 kBatteryDataSpeakerOn = 0x40,

83 // audio is rounted to devices other than speaker

84 kBatteryDataOtherAudioDeviceOn = 0x80,

85 };

86

87 virtual void addBatteryData(uint32_t params) = 0;

88 virtual status_t pullBatteryData(Parcel* reply) = 0;

89};

MediaPlayerService 是native系统服务, 通过ServiceManager注册到系统中

frameworks/av/media/mediaserver/main_mediaserver.cpp

.....

38 sp proc(ProcessState::self());

39 sp sm(defaultServiceManager());

40 ALOGI("ServiceManager: %p", sm.get());

41 InitializeIcuOrDie();

42 MediaPlayerService::instantiate();

instantiate() 创建MediaPlayerService并注册到系统服务中

frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

267void MediaPlayerService::instantiate() {

268 defaultServiceManager()->addService(

269 String16("media.player"), new MediaPlayerService());

270}

MediaPlayerService构造函数如下:

272MediaPlayerService::MediaPlayerService()

273{

274 ALOGV("MediaPlayerService created");

275 mNextConnId = 1;

276

277 mBatteryAudio.refCount = 0;

278 for (int i = 0; i < NUM_AUDIO_DEVICES; i++) {

279 mBatteryAudio.deviceOn[i] = 0;

280 mBatteryAudio.lastTime[i] = 0;

281 mBatteryAudio.totalTime[i] = 0;

282 }

283 // speaker is on by default

284 mBatteryAudio.deviceOn[SPEAKER] = 1;

285

286 // reset battery stats

287 // if the mediaserver has crashed, battery stats could be left

288 // in bad state, reset the state upon service start.

289 BatteryNotifier::getInstance().noteResetVideo();

290 //register built-in player

291 MediaPlayerFactory::registerBuiltinFactories();

292}

registerBuiltinFactories() register the NU_PLAYER and TEST_PLAYER

243void MediaPlayerFactory::registerBuiltinFactories() {

244 Mutex::Autolock lock_(&sLock);

245

246 if (sInitComplete)

247 return;

248

249 registerFactory_l(new NuPlayerFactory(), NU_PLAYER);

250 registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);

251

252 sInitComplete = true;

253}

createMediaRecorder() 创建Recorder用于录音

299spMediaPlayerService::createMediaRecorder(const String16 &opPackageName)

300{

301 pid_t pid = IPCThreadState::self()->getCallingPid();

302 sprecorder = new MediaRecorderClient(this, pid, opPackageName);

303 wpw = recorder;

304 Mutex::Autolock lock(mLock);

305 mMediaRecorderClients.add(w);

306 ALOGV("Create new media recorder client from pid %d", pid);

307 return recorder;

308}

创建Client主要用于播放

325spMediaPlayerService::create(const sp& client,

326 audio_session_t audioSessionId)

327{

328 pid_t pid = IPCThreadState::self()->getCallingPid();

329 int32_t connId = android_atomic_inc(&mNextConnId);

330

331 spc = new Client(

332 this, pid, connId, client, audioSessionId,

333 IPCThreadState::self()->getCallingUid());

334

335 ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,

336 IPCThreadState::self()->getCallingUid());

337

338 wpw = c;

339 {

340 Mutex::Autolock lock(mLock);

341 mClients.add(w);

342 }

343 return c;

344}

567MediaPlayerService::Client::Client(

568 const sp& service, pid_t pid,

569 int32_t connId, const sp& client,

570 audio_session_t audioSessionId, uid_t uid)

571{

572 ALOGV("Client(%d) constructor", connId);

573 mPid = pid;

574 mConnId = connId;

575 mService = service;

576 mClient = client;

577 mLoop = false;

578 mStatus = NO_INIT;

579 mAudioSessionId = audioSessionId;

580 mUID = uid;

581 mRetransmitEndpointValid = false;

582 mAudioAttributes = NULL;

583

584#if CALLBACK_ANTAGONIZER

585 ALOGD("create Antagonizer");

586 mAntagonizer = new Antagonizer(notify, this);

587#endif

588}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值