android_GenericPlayer.cpp revision 37dc2fccf3f122b79ebd554de209d0a3c94ae161
113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * you may not use this file except in compliance with the License. 613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * You may obtain a copy of the License at 713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 1013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * See the License for the specific language governing permissions and 1413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * limitations under the License. 1513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 1613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//#define USE_LOG SLAndroidLogLevel_Verbose 1813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include "sles_allinclusive.h" 2013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 2213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviGenericPlayer::GenericPlayer(const AudioPlayback_Parameters* params) : 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType(kDataLocatorNone), 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyClient(NULL), 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyUser(NULL), 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags(0), 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooperPriority(PRIORITY_DEFAULT), 3037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlaybackParams(*params), 3137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mChannelCount(1) 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 3313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::GenericPlayer()"); 3413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper = new android::ALooper(); 3613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 3737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mMute = false; 3837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[0] = 1.0f; 3937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1] = 1.0f; 4013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviGenericPlayer::~GenericPlayer() { 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::~GenericPlayer()"); 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->stop(); 4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->unregisterHandler(id()); 4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper.clear(); 4913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::init(const notif_cbf_t cbf, void* notifUser) { 5413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::init()"); 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyClient = cbf; 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyUser = notifUser; 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->registerHandler(this); 6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, mLooperPriority); 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::setDataSource(const char *uri) { 6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi resetDataLocator(); 6613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.uriRef = uri; 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorUri; 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 7313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 7413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi resetDataLocator(); 7513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 7613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.fd = fd; 7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 7813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi struct stat sb; 7913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int ret = fstat(fd, &sb); 8013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ret != 0) { 8113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("GenericPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 8213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 8313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 8513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (offset >= sb.st_size) { 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("SfPlayer::setDataSource: invalid offset"); 8713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.offset = offset; 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (PLAYER_FD_FIND_FILE_SIZE == length) { 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size; 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (offset + length > sb.st_size) { 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size - offset; 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = length; 9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorFd; 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::prepare() { 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::prepare()"); 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPrepare, id()); 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::play() { 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::play()"); 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPlay, id()); 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::pause() { 11837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi SL_LOGI("GenericPlayer::pause()"); 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPause, id()); 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::stop() { 12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::stop()"); 12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (new AMessage(kWhatPause, id()))->post(); 12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // after a stop, playback should resume from the start. 12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi seek(0); 13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::seek(int64_t timeMsec) { 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::seek %lld", timeMsec); 13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatSeek, id()); 13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt64(WHATPARAM_SEEK_SEEKTIME_MS, timeMsec); 13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::loop(bool loop) { 14213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatLoop, id()); 14313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt32(WHATPARAM_LOOP_LOOPING, (int32_t)loop); 14413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 14513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 14613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 14970c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivivoid GenericPlayer::getDurationMsec(int* msec) { 15070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi // unknown duration 15170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi *msec = -1; 15270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi} 15370c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 15437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi//-------------------------------------------------- 15537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericPlayer::updateVolume(bool mute, bool useStereoPos, 15637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi XApermille stereoPos, XAmillibel volume) { 15737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 15837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // compute amplification as the combination of volume level and stereo position 15937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi float leftVol = 1.0f, rightVol = 1.0f; 16037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from volume level 16137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= sles_to_android_amplification(volume); 16237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol = leftVol; 16337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 16437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf) 16537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // FIXME use calculation below when supporting effects 16637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi //leftVol *= mAndroidAudioLevels.mAmplFromDirectLevel; 16737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi //rightVol *= mAndroidAudioLevels.mAmplFromDirectLevel; 16837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 16937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from stereo position 17037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (useStereoPos) { 17137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // panning law depends on number of channels of content: stereo panning vs 2ch. balance 17237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (1 == mChannelCount) { 17337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // stereo panning 17437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi double theta = (1000 + stereoPos) * M_PI_4 / 1000.0f; // 0 <= theta <= Pi/2 17537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= cos(theta); 17637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= sin(theta); 17737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 17837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // stereo balance 17937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (stereoPos > 0) { 18037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= (1000 - stereoPos) / 1000.0f; 18137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= 1.0f; 18237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 18337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= 1.0f; 18437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= (1000 + stereoPos) / 1000.0f; 18537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 18637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 18737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 18837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 18937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi { 19037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 19137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mMute = mute; 19237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[0] = leftVol; 19337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1] = rightVol; 19437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 19537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 19637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // send a message for the volume to be updated by the object which implements the volume 19737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi (new AMessage(kWhatVolumeUpdate, id()))->post(); 19837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 19937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 20070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 20170c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi//-------------------------------------------------- 20213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 20313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone 20413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 20513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 20613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::resetDataLocator() { 20713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorNone; 20813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 20913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 21013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 21113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data, bool async) { 21213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatNotif, id()); 21313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt32(event, (int32_t)data); 21413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (async) { 21513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 21613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 21713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi this->onNotify(msg); 21813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 21913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 22013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 22113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 22237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data1, int data2, bool async) { 22337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatNotif, id()); 22437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi msg->setRect(event, 0, 0, (int32_t)data1, (int32_t)data2); 22537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (async) { 22637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi msg->post(); 22737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 22837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi this->onNotify(msg); 22937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 23037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 23137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 23237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 23313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 23413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// AHandler implementation 23513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onMessageReceived(const sp<AMessage> &msg) { 23613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (msg->what()) { 23713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPrepare: 23813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPrepare(); 23913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 24013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 24113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatNotif: 24213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onNotify(msg); 24313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 24413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 24513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPlay: 24613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPlay(); 24713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 24813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 24913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPause: 25013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPause(); 25113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 25213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 25313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatSeek: 25413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onSeek(msg); 25513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 25613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 25713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatLoop: 25813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onLoop(msg); 25913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 26013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 26137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case kWhatVolumeUpdate: 26237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi onVolumeUpdate(); 26337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 26437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 26513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 26613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi TRESPASS(); 26713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 26813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 26913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 27013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 27113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 27213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 27313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPrepare() { 27413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::onPrepare()"); 27513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (!(mStateFlags & kFlagPrepared)) { 27613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags |= kFlagPrepared; 27713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi notify(PLAYEREVENT_PREPARED, PLAYER_SUCCESS, false /*async*/); 27813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 27913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 28013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 28113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 28213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 28313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onNotify(const sp<AMessage> &msg) { 28413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (NULL == mNotifyClient) { 28513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 28613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 28713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 28837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int32_t val1, val2; 28937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (msg->findInt32(PLAYEREVENT_PREPARED, &val1)) { 29037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREPARED, val1); 29137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mNotifyClient(kEventPrepared, val1, 0, mNotifyUser); 29237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else if (msg->findRect(PLAYEREVENT_VIDEO_SIZE_UPDATE, &val1, &val2, &val1, &val2)) { 29337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi SL_LOGD("GenericPlayer notifying %s = %d, %d", PLAYEREVENT_VIDEO_SIZE_UPDATE, val1, val2); 29437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mNotifyClient(kEventHasVideoSize, val1, val2, mNotifyUser); 29513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 29613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 29713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 29813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 29913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPlay() { 30013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::onPlay()"); 30113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((mStateFlags & kFlagPrepared)) { 30213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("starting player"); 30313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags |= kFlagPlaying; 30413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 30513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 30613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 30713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 30813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 30913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPause() { 31113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGI("GenericPlayer::onPause()"); 31213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((mStateFlags & kFlagPrepared)) { 31313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 31413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 31513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 31713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onSeek(const sp<AMessage> &msg) { 32013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::onSeek"); 32113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 32213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onLoop(const sp<AMessage> &msg) { 32513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::onLoop"); 32613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 32713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 32937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericPlayer::onVolumeUpdate() { 33037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 33137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 33237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 33313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 334