android_GenericPlayer.cpp revision 3610785fa93586ce84a27a27530feb77b8035229
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 214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/foundation/ADebug.h> 224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <sys/stat.h> 234ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivinamespace android { 2513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 2613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviGenericPlayer::GenericPlayer(const AudioPlayback_Parameters* params) : 2813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType(kDataLocatorNone), 2913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyClient(NULL), 3013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mNotifyUser(NULL), 3113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags(0), 3213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooperPriority(PRIORITY_DEFAULT), 3337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mPlaybackParams(*params), 341a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten mChannelCount(UNKNOWN_NUMCHANNELS), 354ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mDurationMsec(ANDROID_UNKNOWN_TIME), 364ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mPositionMsec(ANDROID_UNKNOWN_TIME), 371a9c2615d0933d183fcb1b9e34ec8f0da2a85153Glenn Kasten mSampleRateHz(UNKNOWN_SAMPLERATE), 384ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheStatus(kStatusEmpty), 394ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFill(0), 404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mLastNotifiedCacheFill(0), 414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFillNotifThreshold(100) 4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi{ 43e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::GenericPlayer()"); 4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper = new android::ALooper(); 4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 4737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mMute = false; 4837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[0] = 1.0f; 4937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1] = 1.0f; 5013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 5113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel TriviGenericPlayer::~GenericPlayer() { 54e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten SL_LOGV("GenericPlayer::~GenericPlayer()"); 5513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 5913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::init(const notif_cbf_t cbf, void* notifUser) { 60e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::init()"); 6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 62e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi { 63e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi android::Mutex::Autolock autoLock(mNotifyClientLock); 64e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mNotifyClient = cbf; 65e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mNotifyUser = notifUser; 66e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 6713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->registerHandler(this); 6913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, mLooperPriority); 7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 7113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 7213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 73e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivivoid GenericPlayer::preDestroy() { 74e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi SL_LOGD("GenericPlayer::preDestroy()"); 75e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi { 76e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi android::Mutex::Autolock autoLock(mNotifyClientLock); 77e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mNotifyClient = NULL; 78e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mNotifyUser = NULL; 79e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 80e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 81e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mLooper->stop(); 82e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi mLooper->unregisterHandler(id()); 83e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi} 84e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 85e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi 8613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::setDataSource(const char *uri) { 87b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::setDataSource(uri=%s)", uri); 8813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi resetDataLocator(); 8913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.uriRef = uri; 9113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorUri; 9313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 9413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 97b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::setDataSource(fd=%d, offset=%lld, length=%lld)", fd, offset, length); 9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi resetDataLocator(); 9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.fd = fd; 10113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi struct stat sb; 10313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi int ret = fstat(fd, &sb); 10413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (ret != 0) { 10513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("GenericPlayer::setDataSource: fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 10613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 10713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 10813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 10913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (offset >= sb.st_size) { 11013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGE("SfPlayer::setDataSource: invalid offset"); 11113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi return; 11213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 11313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.offset = offset; 11413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 11513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (PLAYER_FD_FIND_FILE_SIZE == length) { 11613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size; 11713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else if (offset + length > sb.st_size) { 11813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = sb.st_size - offset; 11913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 12013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocator.fdi.length = length; 12113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 12213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorFd; 12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 12713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::prepare() { 128e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::prepare()"); 12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPrepare, id()); 13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::play() { 135e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::play()"); 13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPlay, id()); 13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 13913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::pause() { 142e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::pause()"); 14313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatPause, id()); 14413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 14513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 14613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 14813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::stop() { 149e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::stop()"); 15013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi (new AMessage(kWhatPause, id()))->post(); 15113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi // after a stop, playback should resume from the start. 15313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi seek(0); 15413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 15513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 15713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::seek(int64_t timeMsec) { 15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::seek %lld", timeMsec); 1597ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi if (timeMsec < 0) { 1607ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi SL_LOGE("GenericPlayer::seek error, can't seek to negative time %lldms", timeMsec); 1617ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi return; 1627ef5526a7bd12eccfa777cc8bc167794634f405aJean-Michel Trivi } 16313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatSeek, id()); 16413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt64(WHATPARAM_SEEK_SEEKTIME_MS, timeMsec); 16513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 16613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 16713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 16813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 16913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::loop(bool loop) { 170b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::loop %s", loop ? "true" : "false"); 17113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatLoop, id()); 17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt32(WHATPARAM_LOOP_LOOPING, (int32_t)loop); 17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 17413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 1774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::setBufferingUpdateThreshold(int16_t thresholdPercent) { 178b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::setBufferingUpdateThreshold %d", thresholdPercent); 1794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatBuffUpdateThres, id()); 1804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->setInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, (int32_t)thresholdPercent); 1814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(); 1824ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 1834ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1844ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 18513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 18670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivivoid GenericPlayer::getDurationMsec(int* msec) { 1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi *msec = mDurationMsec; 1884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::getPositionMsec(int* msec) { 1914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi *msec = mPositionMsec; 19270c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi} 19370c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 1947f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivivoid GenericPlayer::getSampleRate(uint* hz) { 1957f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi *hz = mSampleRateHz; 1967f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi} 1977f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi 19837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi//-------------------------------------------------- 1994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::setVolume(bool mute, bool useStereoPos, 20037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi XApermille stereoPos, XAmillibel volume) { 201b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::setVolume mute=%s, useStereoPos=%s, stereoPos=%d, volume=%d", 202b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten mute ? "true" : "false", useStereoPos ? "true" : "false", stereoPos, volume); 20337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 20437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // compute amplification as the combination of volume level and stereo position 20537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi float leftVol = 1.0f, rightVol = 1.0f; 20637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from volume level 20737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= sles_to_android_amplification(volume); 20837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol = leftVol; 20937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 21037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf) 21137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // FIXME use calculation below when supporting effects 21237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi //leftVol *= mAndroidAudioLevels.mAmplFromDirectLevel; 21337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi //rightVol *= mAndroidAudioLevels.mAmplFromDirectLevel; 21437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 21537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // amplification from stereo position 21637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (useStereoPos) { 21737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // panning law depends on number of channels of content: stereo panning vs 2ch. balance 21837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (1 == mChannelCount) { 21937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // stereo panning 22037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi double theta = (1000 + stereoPos) * M_PI_4 / 1000.0f; // 0 <= theta <= Pi/2 22137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= cos(theta); 22237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= sin(theta); 22337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 22437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // stereo balance 22537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (stereoPos > 0) { 22637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= (1000 - stereoPos) / 1000.0f; 22737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= 1.0f; 22837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 22937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi leftVol *= 1.0f; 23037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi rightVol *= (1000 + stereoPos) / 1000.0f; 23137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 23237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 23337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 23437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 23537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi { 23637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 23737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mMute = mute; 23837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[0] = leftVol; 23937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi mAndroidAudioLevels.mFinalVolume[1] = rightVol; 24037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 24137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 24237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi // send a message for the volume to be updated by the object which implements the volume 24337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi (new AMessage(kWhatVolumeUpdate, id()))->post(); 24437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 24537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 24670c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi 24770c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi//-------------------------------------------------- 2483610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericPlayer::attachAuxEffect(int32_t effectId) 2493610785fa93586ce84a27a27530feb77b8035229Glenn Kasten{ 2503610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("GenericPlayer::attachAuxEffect(id=%d)", effectId); 2513610785fa93586ce84a27a27530feb77b8035229Glenn Kasten sp<AMessage> msg = new AMessage(kWhatAttachAuxEffect, id()); 2523610785fa93586ce84a27a27530feb77b8035229Glenn Kasten msg->setInt32(WHATPARAM_ATTACHAUXEFFECT, effectId); 2533610785fa93586ce84a27a27530feb77b8035229Glenn Kasten msg->post(); 2543610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 2553610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2563610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2573610785fa93586ce84a27a27530feb77b8035229Glenn Kasten//-------------------------------------------------- 2583610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericPlayer::setAuxEffectSendLevel(float level) 2593610785fa93586ce84a27a27530feb77b8035229Glenn Kasten{ 2603610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("GenericPlayer::setAuxEffectSendLevel(level=%g)", level); 2613610785fa93586ce84a27a27530feb77b8035229Glenn Kasten sp<AMessage> msg = new AMessage(kWhatSetAuxEffectSendLevel, id()); 2623610785fa93586ce84a27a27530feb77b8035229Glenn Kasten msg->setFloat(WHATPARAM_SETAUXEFFECTSENDLEVEL, level); 2633610785fa93586ce84a27a27530feb77b8035229Glenn Kasten msg->post(); 2643610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 2653610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2663610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 2673610785fa93586ce84a27a27530feb77b8035229Glenn Kasten//-------------------------------------------------- 26813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/* 26913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * post-condition: mDataLocatorType == kDataLocatorNone 27013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * 27113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */ 27213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::resetDataLocator() { 273b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::resetDataLocator()"); 27413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mDataLocatorType = kDataLocatorNone; 27513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 27613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 27713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 27813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data, bool async) { 279b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::notify(event=%s, data=%d, async=%s)", event, data, 280b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten async ? "true" : "false"); 28113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatNotif, id()); 28213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->setInt32(event, (int32_t)data); 28313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if (async) { 28413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi msg->post(); 28513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 28613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi this->onNotify(msg); 28713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 28813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 28913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 29013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 29137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericPlayer::notify(const char* event, int data1, int data2, bool async) { 292b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::notify(event=%s, data1=%d, data2=%d, async=%s)", event, data1, data2, 293b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten async ? "true" : "false"); 29437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatNotif, id()); 29537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi msg->setRect(event, 0, 0, (int32_t)data1, (int32_t)data2); 29637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi if (async) { 29737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi msg->post(); 29837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else { 29937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi this->onNotify(msg); 30037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } 30137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 30237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 30337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 30413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 30513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// AHandler implementation 30613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onMessageReceived(const sp<AMessage> &msg) { 307b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::onMessageReceived()"); 30813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi switch (msg->what()) { 30913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPrepare: 310b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGD("kWhatPrepare"); 31113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPrepare(); 31213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 31313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatNotif: 315b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGI("kWhatNotif"); 31613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onNotify(msg); 31713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 31813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 31913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPlay: 320b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatPlay"); 32113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPlay(); 32213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 32313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatPause: 325b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatPause"); 32613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onPause(); 32713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 32813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 32913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatSeek: 330b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatSeek"); 33113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onSeek(msg); 33213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 33313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 33413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi case kWhatLoop: 335b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatLoop"); 33613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi onLoop(msg); 33713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi break; 33813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 33937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi case kWhatVolumeUpdate: 340b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatVolumeUpdate"); 34137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi onVolumeUpdate(); 34237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi break; 34337dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 3444ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case kWhatSeekComplete: 345b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatSeekComplete"); 3464ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onSeekComplete(); 3474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case kWhatBufferingUpdate: 350b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatBufferingUpdate"); 3514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onBufferingUpdate(msg); 3524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi case kWhatBuffUpdateThres: 355b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatBuffUpdateThres"); 3564ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi onSetBufferingUpdateThreshold(msg); 3574ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi break; 3584ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 3593610785fa93586ce84a27a27530feb77b8035229Glenn Kasten case kWhatAttachAuxEffect: 3603610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("kWhatAttachAuxEffect"); 3613610785fa93586ce84a27a27530feb77b8035229Glenn Kasten onAttachAuxEffect(msg); 3623610785fa93586ce84a27a27530feb77b8035229Glenn Kasten break; 3633610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 3643610785fa93586ce84a27a27530feb77b8035229Glenn Kasten case kWhatSetAuxEffectSendLevel: 3653610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("kWhatSetAuxEffectSendLevel"); 3663610785fa93586ce84a27a27530feb77b8035229Glenn Kasten onSetAuxEffectSendLevel(msg); 3673610785fa93586ce84a27a27530feb77b8035229Glenn Kasten break; 3683610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 36913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi default: 370b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("kWhatPlay"); 37113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi TRESPASS(); 37213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 37313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 37413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 37513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 37613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi//-------------------------------------------------- 37713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi// Event handlers 3784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi// it is strictly verboten to call those methods outside of the event loop 3794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 38013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPrepare() { 38149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten SL_LOGI("GenericPlayer::onPrepare()"); 38249935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // Subclass is responsible for indicating whether prepare was successful or unsuccessful 38349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten // by updating mStateFlags accordingly. It must set exactly one of these two flags. 38449935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten assert(!(mStateFlags & kFlagPrepared) != !(mStateFlags & kFlagPreparedUnsuccessfully)); 38549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten notify(PLAYEREVENT_PREPARED, mStateFlags & kFlagPrepared ? PLAYER_SUCCESS : PLAYER_FAILURE, 38649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten false /*async*/); 387e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::onPrepare() done, mStateFlags=0x%x", mStateFlags); 38813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 38913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 39013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 39113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onNotify(const sp<AMessage> &msg) { 392b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::onNotify()"); 393e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notif_cbf_t notifClient; 394e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi void* notifUser; 395e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi { 396e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi android::Mutex::Autolock autoLock(mNotifyClientLock); 397e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi if (NULL == mNotifyClient) { 398e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi return; 399e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } else { 400e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient = mNotifyClient; 401e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifUser = mNotifyUser; 402e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi } 40313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 40413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 40537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi int32_t val1, val2; 4064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(PLAYEREVENT_PREFETCHSTATUSCHANGE, &val1)) { 4074ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHSTATUSCHANGE, val1); 408e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient(kEventPrefetchStatusChange, val1, 0, notifUser); 4094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (msg->findInt32(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, &val1)) { 4104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREFETCHFILLLEVELUPDATE, val1); 411e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient(kEventPrefetchFillLevelUpdate, val1, 0, notifUser); 4124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (msg->findInt32(PLAYEREVENT_ENDOFSTREAM, &val1)) { 4134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_ENDOFSTREAM, val1); 414e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient(kEventEndOfStream, val1, 0, notifUser); 4154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } else if (msg->findInt32(PLAYEREVENT_PREPARED, &val1)) { 41637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PREPARED, val1); 417e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient(kEventPrepared, val1, 0, notifUser); 41837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi } else if (msg->findRect(PLAYEREVENT_VIDEO_SIZE_UPDATE, &val1, &val2, &val1, &val2)) { 4194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGV("GenericPlayer notifying %s = %d, %d", PLAYEREVENT_VIDEO_SIZE_UPDATE, val1, val2); 420e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi notifClient(kEventHasVideoSize, val1, val2, notifUser); 421b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten } else { 422b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer notifying unknown"); 42313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 42413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 42513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 42613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 42713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPlay() { 428e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::onPlay()"); 42913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((mStateFlags & kFlagPrepared)) { 430e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("starting player"); 43113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags |= kFlagPlaying; 43213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } else { 43313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("NOT starting player mStateFlags=0x%x", mStateFlags); 43413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 43513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 43613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 43713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 43813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onPause() { 439e9236d046fdb5cac0696c42e03443a2439188146Jean-Michel Trivi SL_LOGD("GenericPlayer::onPause()"); 44013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi if ((mStateFlags & kFlagPrepared)) { 44113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi mStateFlags &= ~kFlagPlaying; 44213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi } 44313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 44413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 44513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 44613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onSeek(const sp<AMessage> &msg) { 44713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::onSeek"); 44813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 44913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 45013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 45113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivivoid GenericPlayer::onLoop(const sp<AMessage> &msg) { 45213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi SL_LOGV("GenericPlayer::onLoop"); 45313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} 45413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi 45537dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 45637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivivoid GenericPlayer::onVolumeUpdate() { 457b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::onVolumeUpdate"); 45837dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi} 45937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi 4604ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4614ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::onSeekComplete() { 4624ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi SL_LOGD("GenericPlayer::onSeekComplete()"); 4634ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mStateFlags &= ~kFlagSeeking; 4644ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 4654ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4664ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4674ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::onBufferingUpdate(const sp<AMessage> &msg) { 468b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::onBufferingUpdate"); 4694ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 4704ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4714ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4724ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::onSetBufferingUpdateThreshold(const sp<AMessage> &msg) { 473b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::onSetBufferingUpdateThreshold"); 4744ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi int32_t thresholdPercent = 0; 4754ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi if (msg->findInt32(WHATPARAM_BUFFERING_UPDATETHRESHOLD_PERCENT, &thresholdPercent)) { 4764ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi Mutex::Autolock _l(mSettingsLock); 4774ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mCacheFillNotifThreshold = (int16_t)thresholdPercent; 4784ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi } 4794ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 4804ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4814ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4823610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericPlayer::onAttachAuxEffect(const sp<AMessage> &msg) { 4833610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("GenericPlayer::onAttachAuxEffect()"); 4843610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 4853610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 4863610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 4873610785fa93586ce84a27a27530feb77b8035229Glenn Kastenvoid GenericPlayer::onSetAuxEffectSendLevel(const sp<AMessage> &msg) { 4883610785fa93586ce84a27a27530feb77b8035229Glenn Kasten SL_LOGV("GenericPlayer::onSetAuxEffectSendLevel()"); 4893610785fa93586ce84a27a27530feb77b8035229Glenn Kasten} 4903610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 4913610785fa93586ce84a27a27530feb77b8035229Glenn Kasten 4924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi//------------------------------------------------- 4934ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::notifyStatus() { 494b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::notifyStatus"); 4954ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notify(PLAYEREVENT_PREFETCHSTATUSCHANGE, (int32_t)mCacheStatus, true /*async*/); 4964ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 4974ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4984ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 4994ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::notifyCacheFill() { 500b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::notifyCacheFill"); 5014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi mLastNotifiedCacheFill = mCacheFill; 5024ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi notify(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, (int32_t)mLastNotifiedCacheFill, true/*async*/); 5034ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 5044ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5054ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5064ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::seekComplete() { 507b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::seekComplete"); 5084ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatSeekComplete, id()); 5094ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(); 5104ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 5114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 5134ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivivoid GenericPlayer::bufferingUpdate(int16_t fillLevelPerMille) { 514b2549c73290f1955f3a7731bf98446a45f295dfaGlenn Kasten SL_LOGV("GenericPlayer::bufferingUpdate"); 5154ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi sp<AMessage> msg = new AMessage(kWhatBufferingUpdate, id()); 5164ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->setInt32(WHATPARAM_BUFFERING_UPDATE, fillLevelPerMille); 5174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi msg->post(); 5184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi} 5194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi 52013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi} // namespace android 521