MediaPlayer_to_android.cpp revision f271eea20f9fff6c101213b34652399f457bcd50
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2010 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong * you may not use this file except in compliance with the License.
6608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
850c44c79d2d7dd6cd1485d9d939f67f80b8da1caGloria Wang *      http://www.apache.org/licenses/LICENSE-2.0
9760943b5e7a09b602aba04ec451e97662f48b0a4James Dong *
10608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * Unless required by applicable law or agreed to in writing, software
11608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * See the License for the specific language governing permissions and
14608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber * limitations under the License.
15608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber */
16608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber
179c075bca0b75093ca0514a3c8f74d73c8e9e83fdNipun Kwatra#include "sles_allinclusive.h"
18ad452ffadf0ced7449395585a55255c915734e17Nipun Kwatra#include "utils/RefBase.h"
19608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber#include "android_prompts.h"
20a9741a9232c81eaf59179acef91f5be46c42264eGloria Wang
21608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber
22608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber//-----------------------------------------------------------------------------
23856990b491d84b7ed4fefe337485c8997ba9dd02Glenn KastenXAresult android_Player_create(CMediaPlayer *mp) {
241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
25608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    XAresult result = XA_RESULT_SUCCESS;
26608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber
270da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    // FIXME verify data source
28608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
29608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    // FIXME verify audio data sink
30608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    const SLDataSink *pAudioSnk = &mp->mAudioSink.u.mSink;
31608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    // FIXME verify image data sink
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    const SLDataSink *pVideoSnk = &mp->mImageVideoSink.u.mSink;
33afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber
34608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
35608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    switch(sourceLocator) {
36608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    case XA_DATALOCATOR_ANDROIDBUFFERQUEUE:
37608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber        mp->mAndroidObjType = AV_PLR_TS_ABQ;
38608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber        break;
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    case XA_DATALOCATOR_URI: // intended fall-through
40608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    case XA_DATALOCATOR_ADDRESS: // intended fall-through
41608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    case SL_DATALOCATOR_ANDROIDFD: // intended fall-through
42608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    default:
43608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber        SL_LOGE("Unable to create MediaPlayer for data source locator 0x%lx", sourceLocator);
44608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber        result = XA_RESULT_PARAMETER_INVALID;
45608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber        break;
46608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber
471a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi    }
48608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber
49608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    mp->mAndroidObjState = ANDROID_UNINITIALIZED;
50608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    mp->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
51608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    mp->mSessionId = android::AudioSystem::newAudioSessionId();
524456da54bcd206ed1f518c69cc959ca65a179c83Andreas Huber
53608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas Huber    mp->mAndroidAudioLevels.mAmplFromVolLevel = 1.0f;
54b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    mp->mAndroidAudioLevels.mAmplFromStereoPos[0] = 1.0f;
554456da54bcd206ed1f518c69cc959ca65a179c83Andreas Huber    mp->mAndroidAudioLevels.mAmplFromStereoPos[1] = 1.0f;
5685f12e9b9062402d6110df3f7099707912040edbAndreas Huber    mp->mAndroidAudioLevels.mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mp->mAndroidAudioLevels.mAuxSendLevel = 0;
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mp->mDirectLevel = 0; // no attenuation
591b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
603254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang    return result;
616c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong}
626c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong
63afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber
64856990b491d84b7ed4fefe337485c8997ba9dd02Glenn Kasten//-----------------------------------------------------------------------------
6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
668cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas HuberXAresult android_Player_realize(CMediaPlayer *mp, SLboolean async) {
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SL_LOGI("android_Player_realize_l(%p)", mp);
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    XAresult result = XA_RESULT_SUCCESS;
6943b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block
70dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    const SLDataSource *pDataSrc = &mp->mDataSource.u.mSource;
71afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    const SLuint32 sourceLocator = *(SLuint32 *)pDataSrc->pLocator;
7243b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block
73afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    AudioPlayback_Parameters ap_params;
74afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    ap_params.sessionId = mp->mSessionId;
75afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    ap_params.streamType = mp->mStreamType;
76afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    ap_params.trackcb = NULL;
7743b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block    ap_params.trackcbUser = NULL;
7843b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block
79afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    switch(mp->mAndroidObjType) {
80afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    case AV_PLR_TS_ABQ: {
81afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        mp->mAVPlayer = new android::StreamPlayer(&ap_params);
82afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        mp->mAVPlayer->init();
83afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        }
84afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        break;
85afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    case INVALID_TYPE:
86afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber    default:
87afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        SL_LOGE("Unable to realize MediaPlayer, invalid internal Android object type");
88afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber        result = XA_RESULT_PARAMETER_INVALID;
8943b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block        break;
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
92f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
93c71f6e2392bf55cc85ee7c1a376441e9b9aae4c8James Dong    return result;
9429a84457aed4c45bc900998b5e11c03023264208James Dong}
9559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong
96093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
97965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang//-----------------------------------------------------------------------------
984d1265cd007b9754d0645bc4fb95701140a45648Andreas Huber/**
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * pre-condition: avp != NULL
100e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber */
101608d77b1cf4fb9f63dc861e4e1fa3e80a732f626Andreas HuberXAresult android_Player_setPlayState(android::AVPlayer *avp, SLuint32 playState,
102856990b491d84b7ed4fefe337485c8997ba9dd02Glenn Kasten        AndroidObject_state objState)
10343b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block{
10434fba6695fe1b55710baef561785caa0486654fbAndreas Huber    XAresult result = XA_RESULT_SUCCESS;
10543b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block
1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    switch (playState) {
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     case SL_PLAYSTATE_STOPPED: {
10843b1d8ad30bcd61c8cc62fce52fdc6d8381e5732Steve Block         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_STOPPED");
10934fba6695fe1b55710baef561785caa0486654fbAndreas Huber         avp->stop();
11034fba6695fe1b55710baef561785caa0486654fbAndreas Huber     } break;
111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber     case SL_PLAYSTATE_PAUSED: {
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PAUSED");
113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber         switch(objState) {
114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber         case(ANDROID_UNINITIALIZED):
1155e0067b486c3862316aa1f293cf9690c0cf54bdaJeff Brown             avp->prepare();
11672b56ef3d9f164159f58725781b01dd3b052b51aMarco Nelissen         break;
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         case(ANDROID_PREPARING):
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber             break;
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         case(ANDROID_READY):
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber             avp->pause();
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         break;
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         default:
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber             SL_LOGE("Android object in invalid state");
124             break;
125         }
126     } break;
127     case SL_PLAYSTATE_PLAYING: {
128         SL_LOGV("setting AVPlayer to SL_PLAYSTATE_PLAYING");
129         switch(objState) {
130         case(ANDROID_UNINITIALIZED):
131             // FIXME PRIORITY1 prepare should update the obj state
132             //  for the moment test app sets state to PAUSED to prepare, then to PLAYING
133             //avp->prepare();
134
135         // fall through
136         case(ANDROID_PREPARING):
137         case(ANDROID_READY):
138             avp->play();
139         break;
140         default:
141             SL_LOGE("Android object in invalid state");
142             break;
143         }
144     } break;
145
146     default:
147         // checked by caller, should not happen
148         break;
149     }
150
151    return result;
152}
153
154
155//-----------------------------------------------------------------------------
156// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
157void android_Player_androidBufferQueue_registerCallback_l(CMediaPlayer *mp) {
158    if (mp->mAVPlayer != 0) {
159        SL_LOGI("android_Player_androidBufferQueue_registerCallback_l");
160        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
161        splr->registerQueueCallback(mp->mAndroidBufferQueue.mCallback,
162                mp->mAndroidBufferQueue.mContext, (const void*)&(mp->mAndroidBufferQueue.mItf));
163    }
164}
165
166// FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
167void android_Player_androidBufferQueue_enqueue_l(CMediaPlayer *mp,
168        SLuint32 bufferId, SLuint32 length, SLAbufferQueueEvent event, void *pData) {
169    if (mp->mAVPlayer != 0) {
170        android::StreamPlayer* splr = (android::StreamPlayer*)(mp->mAVPlayer.get());
171        splr->appEnqueue(bufferId, length, event, pData);
172    }
173}
174
175
176
177