197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi/*
297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project
397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi *
497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * you may not use this file except in compliance with the License.
697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * You may obtain a copy of the License at
797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi *
897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi *
1097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * See the License for the specific language governing permissions and
1497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi * limitations under the License.
1597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi */
1697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
1797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose
1897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
1997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include "sles_allinclusive.h"
2097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include <media/IMediaPlayerService.h>
212b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android_LocAVPlayer.h"
2297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
2397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
2497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivinamespace android {
2597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
2697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
27167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenLocAVPlayer::LocAVPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
2868d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericMediaPlayer(params, hasVideo)
2997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi{
30e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::LocAVPlayer()");
3197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
3397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::~LocAVPlayer() {
36e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::~LocAVPlayer()");
3797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
3997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
4097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
4197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//--------------------------------------------------
4297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi// Event handlers
4397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::onPrepare() {
44e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::onPrepare()");
4585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    sp<IMediaPlayerService> mediaPlayerService(getMediaPlayerService());
4685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    if (mediaPlayerService != NULL) {
4785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        switch (mDataLocatorType) {
4885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorUri:
493376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten            mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/,
50e52e877354b1477d5cb34d24c70417820b013521Dave Burke                    mPlaybackParams.sessionId);
5185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            if (mPlayer == NULL) {
5285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                SL_LOGE("media player service failed to create player by URI");
53e52e877354b1477d5cb34d24c70417820b013521Dave Burke            } else if (mPlayer->setDataSource(mDataLocator.uriRef, NULL /*headers*/) != NO_ERROR) {
54e52e877354b1477d5cb34d24c70417820b013521Dave Burke                SL_LOGE("setDataSource failed");
55e52e877354b1477d5cb34d24c70417820b013521Dave Burke                mPlayer.clear();
5685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            }
5785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
5885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorFd:
593376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten            mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/,
6085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                    mPlaybackParams.sessionId);
6185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            if (mPlayer == NULL) {
6285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                SL_LOGE("media player service failed to create player by FD");
63e52e877354b1477d5cb34d24c70417820b013521Dave Burke            } else if (mPlayer->setDataSource(mDataLocator.fdi.fd, mDataLocator.fdi.offset,
64e52e877354b1477d5cb34d24c70417820b013521Dave Burke                    mDataLocator.fdi.length) != NO_ERROR) {
65e52e877354b1477d5cb34d24c70417820b013521Dave Burke                SL_LOGE("setDataSource failed");
66e52e877354b1477d5cb34d24c70417820b013521Dave Burke                mPlayer.clear();
6785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            }
68833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            // Binder dups the fd for use by mediaserver, so if we own the fd then OK to close now
69833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            if (mDataLocator.fdi.mCloseAfterUse) {
70833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                (void) ::close(mDataLocator.fdi.fd);
71833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                mDataLocator.fdi.fd = -1;
72833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                mDataLocator.fdi.mCloseAfterUse = false;
73833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            }
7485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
7585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorNone:
7685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            SL_LOGE("no data locator for MediaPlayer object");
7785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
7885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        default:
7985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType);
8085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
8185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        }
8285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    }
8385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    if (mPlayer == NULL) {
8485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        mStateFlags |= kFlagPreparedUnsuccessfully;
8597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    }
8697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    // blocks until mPlayer is prepared
8768d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericMediaPlayer::onPrepare();
88e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::onPrepare() done");
8997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
9097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
9197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} // namespace android
92