MediaPlayer_to_android.cpp revision b2aeb0f1009555181dabb944fe05901cb6e6f632
1/*
2 * Copyright (C) 2010 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#include "sles_allinclusive.h"
18#include "utils/RefBase.h"
19#include "android_prompts.h"
20
21//-----------------------------------------------------------------------------
22static void player_handleMediaPlayerEventNotifications(const int event, const int data1, void* user)
23{
24    if (NULL == user) {
25        return;
26    }
27
28    CMediaPlayer* mp = (CMediaPlayer*) user;
29    //SL_LOGV("received event %d, data %d from AVPlayer", event, data1);
30
31    switch(event) {
32
33    case android::AVPlayer::kEventPrepared: {
34        if (PLAYER_SUCCESS == data1) {
35            object_lock_exclusive(&mp->mObject);
36            SL_LOGV("Received AVPlayer::kEventPrepared from AVPlayer for CMediaPlayer %p", mp);
37            mp->mAndroidObjState = ANDROID_READY;
38            object_unlock_exclusive(&mp->mObject);
39        }
40        }
41        break;
42
43    default:
44        SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
45        break;
46    }
47}
48
49
50//-----------------------------------------------------------------------------
51XAresult android_Player_create(CMediaPlayer *mp) {
52
53    XAresult result = XA_RESULT_SUCCESS;
54
55    // FIXME verify data source
56    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
57    // FIXME verify audio data sink
58    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
59    // FIXME verify image data sink
60    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
61
62    XAuint32 sourceLocator = *(XAuint32 *)pDataSrc->pLocator;
63    switch(sourceLocator) {
64    // FIXME support Android simple buffer queue as well
65    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
66        mp->mAndroidObjType = AV_PLR_TS_ABQ;
67        break;
68    case XA_DATALOCATOR_URI: // intended fall-through
69    case SL_DATALOCATOR_ANDROIDFD:
70        mp->mAndroidObjType = AV_PLR_URIFD;
71        break;
72    case XA_DATALOCATOR_ADDRESS: // intended fall-through
73    default:
74        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
75        result = XA_RESULT_PARAMETER_INVALID;
76        break;
77    }
78
79    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
80    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
81    mp->mSessionId = android::AudioSystem::newAudioSessionId();
82
83    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
84    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
85    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
86    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
87    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
88    mp->mDirectLevel = 0; // no attenuation
89
90    return result;
91}
92
93
94//-----------------------------------------------------------------------------
95// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
96XAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
97    SL_LOGI("android_Player_realize_l(%p)", mp);
98    XAresult result = XA_RESULT_SUCCESS;
99
100    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
101    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
102
103    AudioPlayback_Parameters ap_params;
104    ap_params.sessionId = mp->mSessionId;
105    ap_params.streamType = mp->mStreamType;
106    ap_params.trackcb = NULL;
107    ap_params.trackcbUser = NULL;
108
109    switch(mp->mAndroidObjType) {
110    case AV_PLR_TS_ABQ: {
111        mp->mAVPlayer = new android::StreamPlayer(&ap_params);
112        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
113        }
114        break;
115    case AV_PLR_URIFD: {
116        mp->mAVPlayer = new android::LocAVPlayer(&ap_params);
117        mp->mAVPlayer->init(player_handleMediaPlayerEventNotifications, (void*)mp);
118        switch (mp->mDataSource.mLocator.mLocatorType) {
119        case XA_DATALOCATOR_URI:
120            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
121                    (const char*)mp->mDataSource.mLocator.mURI.URI);
122            break;
123        case XA_DATALOCATOR_ANDROIDFD: {
124            int64_t offset = (int64_t)mp->mDataSource.mLocator.mFD.offset;
125            ((android::LocAVPlayer*)mp->mAVPlayer.get())->setDataSource(
126                    (int)mp->mDataSource.mLocator.mFD.fd,
127                    offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
128                            (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
129                    (int64_t)mp->mDataSource.mLocator.mFD.length);
130            }
131            break;
132        default:
133            SL_LOGE("Invalid or unsupported data locator type %lu for data source",
134                    mp->mDataSource.mLocator.mLocatorType);
135            result = XA_RESULT_PARAMETER_INVALID;
136        }
137        }
138        break;
139    case INVALID_TYPE: // intended fall-through
140    default:
141        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
142        result = XA_RESULT_PARAMETER_INVALID;
143        break;
144    }
145
146    return result;
147}
148
149//-----------------------------------------------------------------------------
150XAresult android_Player_destroy(CMediaPlayer *mp) {
151    SL_LOGI("android_Player_destroy(%p)", mp);
152    XAresult result = XA_RESULT_SUCCESS;
153
154    if (mp->mAVPlayer != 0) {
155        mp->mAVPlayer.clear();
156    }
157
158    return result;
159}
160
161//-----------------------------------------------------------------------------
162/**
163 * pre-conditions: avp != NULL, surface != NULL
164 */
165XAresult android_Player_setVideoSurface(android::AVPlayer *avp, void* surface) {
166    XAresult result = XA_RESULT_SUCCESS;
167
168    avp->setVideoSurface(surface);
169
170    return result;
171}
172
173
174//-----------------------------------------------------------------------------
175/**
176 * pre-condition: avp != NULL
177 */
178XAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
179        AndroidObject_state* pObjState)
180{
181    XAresult result = XA_RESULT_SUCCESS;
182    AndroidObject_state objState = *pObjState;
183
184    switch (playState) {
185     case SL_PLAYSTATE_STOPPED: {
186         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
187         avp->stop();
188         }
189         break;
190     case SL_PLAYSTATE_PAUSED: {
191         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
192         switch(objState) {
193         case(ANDROID_UNINITIALIZED):
194             *pObjState = ANDROID_PREPARING;
195             avp->prepare();
196             break;
197         case(ANDROID_PREPARING):
198             break;
199         case(ANDROID_READY):
200             avp->pause();
201             break;
202         default:
203             SL_LOGE("Android object in invalid state");
204             break;
205         }
206         }
207         break;
208     case SL_PLAYSTATE_PLAYING: {
209         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
210         switch(objState) {
211         case(ANDROID_UNINITIALIZED):
212             *pObjState = ANDROID_PREPARING;
213             avp->prepare();
214             // intended fall through
215         case(ANDROID_PREPARING):
216             // intended fall through
217         case(ANDROID_READY):
218             avp->play();
219             break;
220         default:
221             SL_LOGE("Android object in invalid state");
222             break;
223         }
224         }
225         break;
226     default:
227         // checked by caller, should not happen
228         break;
229     }
230
231    return result;
232}
233
234
235//-----------------------------------------------------------------------------
236// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
237void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
238    if (mp->mAVPlayer != 0) {
239        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
240        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
241        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
242                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
243    }
244}
245
246// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
247void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
248        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
249    if (mp->mAVPlayer != 0) {
250        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
251        splr->appEnqueue(bufferId, length, event, pData);
252    }
253}
254
255
256
257