android_GenericMediaPlayer.cpp revision 37dc2fccf3f122b79ebd554de209d0a3c94ae161
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define USE_LOG SLAndroidLogLevel_Verbose
18
19#include "sles_allinclusive.h"
20#include <media/IMediaPlayerService.h>
21#include <surfaceflinger/ISurfaceComposer.h>
22#include <surfaceflinger/SurfaceComposerClient.h>
23
24namespace android {
25
26//--------------------------------------------------------------------------------------------------
27MediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
28    mGenericMediaPlayer(gmp),
29    mPlayerPrepared(false)
30{
31
32}
33
34MediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
35
36}
37
38//--------------------------------------------------
39// IMediaPlayerClient implementation
40void MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) {
41    SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
42
43    switch (msg) {
44      case MEDIA_PREPARED:
45        mPlayerPrepared = true;
46        mPlayerPreparedCondition.signal();
47        break;
48
49      case MEDIA_SET_VIDEO_SIZE:
50        mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
51                (int32_t)ext1, (int32_t)ext2, true /*async*/);
52        break;
53
54      default: { }
55    }
56}
57
58//--------------------------------------------------
59void MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
60    Mutex::Autolock _l(mLock);
61    while (!mPlayerPrepared) {
62        mPlayerPreparedCondition.wait(mLock);
63    }
64}
65
66//--------------------------------------------------------------------------------------------------
67GenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
68    GenericPlayer(params),
69    mHasVideo(hasVideo),
70    mVideoSurface(0),
71    mVideoSurfaceTexture(0),
72    mPlayer(0),
73    mPlayerClient(0)
74{
75    SL_LOGI("GenericMediaPlayer::GenericMediaPlayer()");
76
77    mServiceManager = defaultServiceManager();
78    mBinder = mServiceManager->getService(String16("media.player"));
79    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
80
81    CHECK(mMediaPlayerService.get() != NULL);
82
83    mPlayerClient = new MediaPlayerNotificationClient(this);
84}
85
86GenericMediaPlayer::~GenericMediaPlayer() {
87    SL_LOGI("GenericMediaPlayer::~GenericMediaPlayer()");
88
89}
90
91//--------------------------------------------------
92void GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
93    mVideoSurface = surface;
94}
95
96void GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
97    mVideoSurfaceTexture = surfaceTexture;
98}
99
100
101//--------------------------------------------------
102// Event handlers
103void GenericMediaPlayer::onPrepare() {
104    SL_LOGI("GenericMediaPlayer::onPrepare()");
105    if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
106        if (mHasVideo) {
107            if (mVideoSurface != 0) {
108                mPlayer->setVideoSurface(mVideoSurface);
109            } else if (mVideoSurfaceTexture != 0) {
110                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
111            }
112        }
113        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
114        mPlayer->prepareAsync();
115        mPlayerClient->blockUntilPlayerPrepared();
116        GenericPlayer::onPrepare();
117    }
118    SL_LOGI("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
119}
120
121void GenericMediaPlayer::onPlay() {
122    SL_LOGI("GenericMediaPlayer::onPlay()");
123    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
124        SL_LOGI("starting player");
125        mPlayer->start();
126        mStateFlags |= kFlagPlaying;
127    } else {
128        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
129    }
130}
131
132void GenericMediaPlayer::onPause() {
133    SL_LOGI("GenericMediaPlayer::onPause()");
134    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
135        mPlayer->pause();
136        mStateFlags &= ~kFlagPlaying;
137    }
138}
139
140
141void GenericMediaPlayer::onVolumeUpdate() {
142    // use settings lock to read the volume settings
143    Mutex::Autolock _l(mSettingsLock);
144    if (this->mAndroidAudioLevels.mMute) {
145        mPlayer->setVolume(0.0f, 0.0f);
146    } else {
147        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
148                mAndroidAudioLevels.mFinalVolume[1]);
149    }
150
151}
152
153} // namespace android
154