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"
20fb8035480852914d326eb4c2074060df32382926Andreas Huber
21fb8035480852914d326eb4c2074060df32382926Andreas Huber#include <media/IMediaHTTPService.h>
2297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi#include <media/IMediaPlayerService.h>
23fb8035480852914d326eb4c2074060df32382926Andreas Huber
242b06e20ae32388f6e1dfd088d9773c34e6b1cb45Jean-Michel Trivi#include "android_LocAVPlayer.h"
2597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
26fb8035480852914d326eb4c2074060df32382926Andreas Huber#include "HTTPHelper.h"
2797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
2897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivinamespace android {
2997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//--------------------------------------------------------------------------------------------------
31167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn KastenLocAVPlayer::LocAVPlayer(const AudioPlayback_Parameters* params, bool hasVideo) :
3268d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi        GenericMediaPlayer(params, hasVideo)
3397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi{
34e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::LocAVPlayer()");
3597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
3797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3897876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
3997876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel TriviLocAVPlayer::~LocAVPlayer() {
40e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::~LocAVPlayer()");
4197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
4297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
4397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
4497876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
4597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi//--------------------------------------------------
4697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi// Event handlers
4797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivivoid LocAVPlayer::onPrepare() {
48e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::onPrepare()");
4985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    sp<IMediaPlayerService> mediaPlayerService(getMediaPlayerService());
5085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    if (mediaPlayerService != NULL) {
5185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        switch (mDataLocatorType) {
5285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorUri:
533376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten            mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/,
54e52e877354b1477d5cb34d24c70417820b013521Dave Burke                    mPlaybackParams.sessionId);
5585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            if (mPlayer == NULL) {
5685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                SL_LOGE("media player service failed to create player by URI");
57001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan            } else {
58001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                sp <IMediaHTTPService> mediaHTTPService;
59001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan#ifndef __BRILLO__
60001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                // As Brillo doesn't have a Java layer, we don't have to call this
61001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                // function since it would return NULL anyways. Not having this
62001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                // function call allows us to significantly reduce the size of the
63001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                // Brillo checkout.
64001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                mediaHTTPService = CreateHTTPServiceInCurrentJavaContext();
65001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan#endif
66001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                status_t status =  mPlayer->setDataSource(
67001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                    mediaHTTPService, mDataLocator.uriRef, NULL /*headers*/);
68001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                if (status != NO_ERROR) {
69001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                    SL_LOGE("setDataSource failed");
70001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                    mPlayer.clear();
71001c3b5d8e62f459c6253bef164a874e63374ca2Ralph Nathan                }
7285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            }
7385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
7485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorFd:
753376429dfe306b9bfebf3a50941e2ccf44984495Glenn Kasten            mPlayer = mediaPlayerService->create(mPlayerClient /*IMediaPlayerClient*/,
7685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                    mPlaybackParams.sessionId);
7785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            if (mPlayer == NULL) {
7885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten                SL_LOGE("media player service failed to create player by FD");
79e52e877354b1477d5cb34d24c70417820b013521Dave Burke            } else if (mPlayer->setDataSource(mDataLocator.fdi.fd, mDataLocator.fdi.offset,
80e52e877354b1477d5cb34d24c70417820b013521Dave Burke                    mDataLocator.fdi.length) != NO_ERROR) {
81e52e877354b1477d5cb34d24c70417820b013521Dave Burke                SL_LOGE("setDataSource failed");
82e52e877354b1477d5cb34d24c70417820b013521Dave Burke                mPlayer.clear();
8385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            }
84833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            // Binder dups the fd for use by mediaserver, so if we own the fd then OK to close now
85833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            if (mDataLocator.fdi.mCloseAfterUse) {
86833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                (void) ::close(mDataLocator.fdi.fd);
87833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                mDataLocator.fdi.fd = -1;
88833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten                mDataLocator.fdi.mCloseAfterUse = false;
89833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten            }
9085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
9185edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        case kDataLocatorNone:
9285edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            SL_LOGE("no data locator for MediaPlayer object");
9385edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
9485edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        default:
9585edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType);
9685edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten            break;
9785edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        }
9885edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    }
9985edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten    if (mPlayer == NULL) {
10085edd878a30caa535b0267d8d6e61b4ccc0d5fd0Glenn Kasten        mStateFlags |= kFlagPreparedUnsuccessfully;
10197876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    }
10297876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi    // blocks until mPlayer is prepared
10368d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi    GenericMediaPlayer::onPrepare();
104e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi    SL_LOGD("LocAVPlayer::onPrepare() done");
10597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}
10697876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi
10797876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi} // namespace android
108