android_GenericMediaPlayer.cpp revision 2b06e20ae32388f6e1dfd088d9773c34e6b1cb45
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#include "android_GenericMediaPlayer.h"
24
25namespace android {
26
27//--------------------------------------------------------------------------------------------------
28MediaPlayerNotificationClient::MediaPlayerNotificationClient(GenericMediaPlayer* gmp) :
29    mGenericMediaPlayer(gmp),
30    mPlayerPrepared(false)
31{
32
33}
34
35MediaPlayerNotificationClient::~MediaPlayerNotificationClient() {
36
37}
38
39//--------------------------------------------------
40// IMediaPlayerClient implementation
41void MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2) {
42    SL_LOGI("MediaPlayerNotificationClient::notify(msg=%d, ext1=%d, ext2=%d)", msg, ext1, ext2);
43
44    switch (msg) {
45      case MEDIA_PREPARED:
46        mPlayerPrepared = true;
47        mPlayerPreparedCondition.signal();
48        break;
49
50      case MEDIA_SET_VIDEO_SIZE:
51        mGenericMediaPlayer->notify(PLAYEREVENT_VIDEO_SIZE_UPDATE,
52                (int32_t)ext1, (int32_t)ext2, true /*async*/);
53        break;
54
55      default: { }
56    }
57}
58
59//--------------------------------------------------
60void MediaPlayerNotificationClient::blockUntilPlayerPrepared() {
61    Mutex::Autolock _l(mLock);
62    while (!mPlayerPrepared) {
63        mPlayerPreparedCondition.wait(mLock);
64    }
65}
66
67//--------------------------------------------------------------------------------------------------
68GenericMediaPlayer::GenericMediaPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
69    GenericPlayer(params),
70    mHasVideo(hasVideo),
71    mVideoSurface(0),
72    mVideoSurfaceTexture(0),
73    mPlayer(0),
74    mPlayerClient(0)
75{
76    SL_LOGD("GenericMediaPlayer::GenericMediaPlayer()");
77
78    mServiceManager = defaultServiceManager();
79    mBinder = mServiceManager->getService(String16("media.player"));
80    mMediaPlayerService = interface_cast<IMediaPlayerService>(mBinder);
81
82    CHECK(mMediaPlayerService.get() != NULL);
83
84    mPlayerClient = new MediaPlayerNotificationClient(this);
85}
86
87GenericMediaPlayer::~GenericMediaPlayer() {
88    SL_LOGD("GenericMediaPlayer::~GenericMediaPlayer()");
89
90}
91
92//--------------------------------------------------
93void GenericMediaPlayer::setVideoSurface(const sp<Surface> &surface) {
94    mVideoSurface = surface;
95}
96
97void GenericMediaPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
98    mVideoSurfaceTexture = surfaceTexture;
99}
100
101
102//--------------------------------------------------
103// Event handlers
104void GenericMediaPlayer::onPrepare() {
105    SL_LOGD("GenericMediaPlayer::onPrepare()");
106    if (!(mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
107        if (mHasVideo) {
108            if (mVideoSurface != 0) {
109                mPlayer->setVideoSurface(mVideoSurface);
110            } else if (mVideoSurfaceTexture != 0) {
111                mPlayer->setVideoSurfaceTexture(mVideoSurfaceTexture);
112            }
113        }
114        mPlayer->setAudioStreamType(mPlaybackParams.streamType);
115        mPlayer->prepareAsync();
116        mPlayerClient->blockUntilPlayerPrepared();
117        GenericPlayer::onPrepare();
118    }
119    SL_LOGD("GenericMediaPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags);
120}
121
122void GenericMediaPlayer::onPlay() {
123    SL_LOGD("GenericMediaPlayer::onPlay()");
124    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
125        SL_LOGD("starting player");
126        mPlayer->start();
127        mStateFlags |= kFlagPlaying;
128    } else {
129        SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags);
130    }
131}
132
133void GenericMediaPlayer::onPause() {
134    SL_LOGD("GenericMediaPlayer::onPause()");
135    if ((mStateFlags & kFlagPrepared) && (mPlayer != 0)) {
136        mPlayer->pause();
137        mStateFlags &= ~kFlagPlaying;
138    }
139}
140
141
142void GenericMediaPlayer::onVolumeUpdate() {
143    // use settings lock to read the volume settings
144    Mutex::Autolock _l(mSettingsLock);
145    if (this->mAndroidAudioLevels.mMute) {
146        mPlayer->setVolume(0.0f, 0.0f);
147    } else {
148        mPlayer->setVolume(mAndroidAudioLevels.mFinalVolume[0],
149                mAndroidAudioLevels.mFinalVolume[1]);
150    }
151
152}
153
154} // namespace android
155