1331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi/* 2331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 3331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * 4331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * you may not use this file except in compliance with the License. 6331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * You may obtain a copy of the License at 7331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * 8331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * 10331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * See the License for the specific language governing permissions and 14331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi * limitations under the License. 15331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi */ 16331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 17331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 18331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 19331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi#include "sles_allinclusive.h" 20331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi#include <media/IMediaPlayerService.h> 21d004feb25e830dd92a8d6e6af0d363e4d11721a2Jean-Michel Trivi#include "android_LocAVPlayer.h" 22331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 23331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 24331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivinamespace android { 25331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 26331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi//-------------------------------------------------------------------------------------------------- 27e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel TriviLocAVPlayer::LocAVPlayer(AudioPlayback_Parameters* params, bool hasVideo) : 28e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi GenericMediaPlayer(params, hasVideo) 29331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi{ 3030ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("LocAVPlayer::LocAVPlayer()"); 31331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 32331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi} 33331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 34331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 35331e70b5c675222bbd122f7ae515dbda631040feJean-Michel TriviLocAVPlayer::~LocAVPlayer() { 3630ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("LocAVPlayer::~LocAVPlayer()"); 37331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 38331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi} 39331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 40331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 41331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi//-------------------------------------------------- 42331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi// Event handlers 43331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivivoid LocAVPlayer::onPrepare() { 4430ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare()"); 456bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten sp<IMediaPlayerService> mediaPlayerService(getMediaPlayerService()); 466bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten if (mediaPlayerService != NULL) { 476bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten switch (mDataLocatorType) { 486bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten case kDataLocatorUri: 496bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten mPlayer = mediaPlayerService->create(getpid(), mPlayerClient /*IMediaPlayerClient*/, 50ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke mPlaybackParams.sessionId); 516bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten if (mPlayer == NULL) { 526bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten SL_LOGE("media player service failed to create player by URI"); 53ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke } else if (mPlayer->setDataSource(mDataLocator.uriRef, NULL /*headers*/) != NO_ERROR) { 54ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke SL_LOGE("setDataSource failed"); 55ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke mPlayer.clear(); 566bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten } 576bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten break; 586bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten case kDataLocatorFd: 596bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten mPlayer = mediaPlayerService->create(getpid(), mPlayerClient /*IMediaPlayerClient*/, 606bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten mPlaybackParams.sessionId); 616bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten if (mPlayer == NULL) { 626bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten SL_LOGE("media player service failed to create player by FD"); 63ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke } else if (mPlayer->setDataSource(mDataLocator.fdi.fd, mDataLocator.fdi.offset, 64ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke mDataLocator.fdi.length) != NO_ERROR) { 65ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke SL_LOGE("setDataSource failed"); 66ff01e346bc5b8fb5cb1dd9a9192d980842a2e14dDave Burke mPlayer.clear(); 676bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten } 68d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten // Binder dups the fd for use by mediaserver, so if we own the fd then OK to close now 69d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten if (mDataLocator.fdi.mCloseAfterUse) { 70d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten (void) ::close(mDataLocator.fdi.fd); 71d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten mDataLocator.fdi.fd = -1; 72d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten mDataLocator.fdi.mCloseAfterUse = false; 73d62f504ebe6a3f9b15c6115f9add1c4fed87d847Glenn Kasten } 746bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten break; 756bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten case kDataLocatorNone: 766bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten SL_LOGE("no data locator for MediaPlayer object"); 776bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten break; 786bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten default: 796bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten SL_LOGE("unsupported data locator %d for MediaPlayer object", mDataLocatorType); 806bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten break; 816bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten } 826bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten } 836bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten if (mPlayer == NULL) { 846bd00f9169990c3b9e84b03ef1c5c27ed50a37d1Glenn Kasten mStateFlags |= kFlagPreparedUnsuccessfully; 85331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi } 86331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi // blocks until mPlayer is prepared 87e8af8705a6eb3b8ebd239c379d9143dc69c363d4Jean-Michel Trivi GenericMediaPlayer::onPrepare(); 8830ebe675beff91283cc72d4ee5e94e56ab7e107fJean-Michel Trivi SL_LOGD("LocAVPlayer::onPrepare() done"); 89331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi} 90331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi 91331e70b5c675222bbd122f7ae515dbda631040feJean-Michel Trivi} // namespace android 92