MediaPlayerService.cpp revision ad04d9201452001dbaac4349f084cc9316190b89
108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller/* 208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** 308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** Copyright 2008, The Android Open Source Project 408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** 508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** Licensed under the Apache License, Version 2.0 (the "License"); 608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** you may not use this file except in compliance with the License. 708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** You may obtain a copy of the License at 808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** 908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** http://www.apache.org/licenses/LICENSE-2.0 1008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** 1108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** Unless required by applicable law or agreed to in writing, software 1208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** distributed under the License is distributed on an "AS IS" BASIS, 1308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** See the License for the specific language governing permissions and 1508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller** limitations under the License. 1608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller*/ 17ebbf205bc6e8292f74d8fc4652c70274a445f907Jim Miller 1808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller// Proxy for media player implementations 19ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 20ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller//#define LOG_NDEBUG 0 21f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#define LOG_TAG "MediaPlayerService" 2208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include <utils/Log.h> 2308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 24a7596147b43940cad3f76c53ed154ef088b9269bJim Miller#include <sys/types.h> 259f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#include <sys/stat.h> 26ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#include <dirent.h> 2708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include <unistd.h> 2808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 29f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#include <string.h> 3008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include <cutils/atomic.h> 3108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 32dcdaf87ed0aa99073638bcfe645949f130f0c7adAlex Klyubin#include <android_runtime/ActivityManager.h> 3308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include <utils/IPCThreadState.h> 34a7596147b43940cad3f76c53ed154ef088b9269bJim Miller#include <utils/IServiceManager.h> 3508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include <utils/MemoryHeapBase.h> 369f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#include <utils/MemoryBase.h> 37ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller#include <cutils/properties.h> 38ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#include <media/MediaPlayerInterface.h> 40b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller#include <media/mediarecorder.h> 419f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#include <media/MediaMetadataRetrieverInterface.h> 42f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#include <media/AudioTrack.h> 43f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 44f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#include "MediaRecorderClient.h" 4508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include "MediaPlayerService.h" 4608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#include "MetadataRetrieverClient.h" 47ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 48ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#include "MidiFile.h" 49ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#include "VorbisPlayer.h" 50ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#include <media/PVPlayer.h> 5108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 5208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller/* desktop Linux needs a little help with gettid() */ 5308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS) 5408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#define __KERNEL__ 55d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller# include <linux/unistd.h> 5608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#ifdef _syscall0 57a7596147b43940cad3f76c53ed154ef088b9269bJim Miller_syscall0(pid_t,gettid) 58f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#else 59f501b58de8f467a80fef49c704555781bc61ea6fJim Millerpid_t gettid() { return syscall(__NR_gettid);} 60f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#endif 61f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#undef __KERNEL__ 6208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#endif 63ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 64ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 65ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millernamespace android { 66ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 6708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller// TODO: Temp hack until we can register players 68ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millertypedef struct { 69ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller const char *extension; 70ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller const player_type playertype; 7108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller} extmap; 72ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerextmap FILE_EXTS [] = { 73ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".mid", SONIVOX_PLAYER}, 74ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".midi", SONIVOX_PLAYER}, 75ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".smf", SONIVOX_PLAYER}, 76a7596147b43940cad3f76c53ed154ef088b9269bJim Miller {".xmf", SONIVOX_PLAYER}, 77ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".imy", SONIVOX_PLAYER}, 78ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".rtttl", SONIVOX_PLAYER}, 79ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".rtx", SONIVOX_PLAYER}, 80ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".ota", SONIVOX_PLAYER}, 81ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".ogg", VORBIS_PLAYER}, 82ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller {".oga", VORBIS_PLAYER}, 8308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller}; 84ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 85ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller// TODO: Find real cause of Audio/Video delay in PV framework and remove this workaround 86ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller/* static */ const uint32_t MediaPlayerService::AudioOutput::kAudioVideoDelayMs = 96; 87ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller/* static */ int MediaPlayerService::AudioOutput::mMinBufferCount = 4; 88ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller/* static */ bool MediaPlayerService::AudioOutput::mIsOnEmulator = false; 8908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 90ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millervoid MediaPlayerService::instantiate() { 91ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller defaultServiceManager()->addService( 92ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String16("media.player"), new MediaPlayerService()); 93ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 94ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 95ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim MillerMediaPlayerService::MediaPlayerService() 969f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 97ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("MediaPlayerService created"); 98ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mNextConnId = 1; 99ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 100ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 101ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim MillerMediaPlayerService::~MediaPlayerService() 102ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 103ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("MediaPlayerService destroyed"); 104ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 105ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 106fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Millersp<IMediaRecorder> MediaPlayerService::createMediaRecorder(pid_t pid) 107fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller{ 108fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller sp<MediaRecorderClient> recorder = new MediaRecorderClient(pid); 109fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller LOGV("Create new media recorder client from pid %d", pid); 110fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller return recorder; 111ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 112ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 113ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millersp<IMediaMetadataRetriever> MediaPlayerService::createMetadataRetriever(pid_t pid) 114f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 115ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MetadataRetrieverClient> retriever = new MetadataRetrieverClient(pid); 1169f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("Create new media retriever from pid %d", pid); 11708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller return retriever; 118ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 119ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 120ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millersp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) 121ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 122ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller int32_t connId = android_atomic_inc(&mNextConnId); 123ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<Client> c = new Client(this, pid, connId, client); 124ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("Create new client(%d) from pid %d, url=%s, connId=%d", connId, pid, url, connId); 125a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (NO_ERROR != c->setDataSource(url)) 126ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller { 127ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller c.clear(); 128ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return c; 129ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 130ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller wp<Client> w = c; 131a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Mutex::Autolock lock(mLock); 132ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mClients.add(w); 133ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return c; 134ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 135ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 136ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millersp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, 137a7596147b43940cad3f76c53ed154ef088b9269bJim Miller int fd, int64_t offset, int64_t length) 138ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 139ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller int32_t connId = android_atomic_inc(&mNextConnId); 140ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<Client> c = new Client(this, pid, connId, client); 141ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("Create new client(%d) from pid %d, fd=%d, offset=%lld, length=%lld", 142ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller connId, pid, fd, offset, length); 143ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (NO_ERROR != c->setDataSource(fd, offset, length)) { 144ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller c.clear(); 145ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 1469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller wp<Client> w = c; 147ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Mutex::Autolock lock(mLock); 148ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mClients.add(w); 149ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 150ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller ::close(fd); 151ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return c; 1529f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 153ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 154ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerstatus_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& args) const 155ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 156ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller const size_t SIZE = 256; 157ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller char buffer[SIZE]; 158ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String8 result; 159ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 1609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append(" AudioCache\n"); 161ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mHeap != 0) { 162ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller snprintf(buffer, 255, " heap base(%p), size(%d), flags(%d), device(%s)\n", 163ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mHeap->getBase(), mHeap->getSize(), mHeap->getFlags(), mHeap->getDevice()); 164ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 165f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 166ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller snprintf(buffer, 255, " msec per frame(%f), channel count(%d), format(%d), frame count(%ld)\n", 1679f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mMsecsPerFrame, mChannelCount, mFormat, mFrameCount); 168a7596147b43940cad3f76c53ed154ef088b9269bJim Miller result.append(buffer); 16908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller snprintf(buffer, 255, " sample rate(%d), size(%d), error(%d), command complete(%s)\n", 170d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller mSampleRate, mSize, mError, mCommandComplete?"true":"false"); 171a7596147b43940cad3f76c53ed154ef088b9269bJim Miller result.append(buffer); 1729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller ::write(fd, result.string(), result.size()); 1739f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return NO_ERROR; 1749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 1759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1769f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatus_t MediaPlayerService::AudioOutput::dump(int fd, const Vector<String16>& args) const 177f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 178ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller const size_t SIZE = 256; 179ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller char buffer[SIZE]; 180ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String8 result; 181ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 182fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller result.append(" AudioOutput\n"); 183ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", 184ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mStreamType, mLeftVolume, mRightVolume); 185ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 186ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller snprintf(buffer, 255, " msec per frame(%f), latency (%d)\n", 187ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mMsecsPerFrame, mLatency); 188ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 189ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller ::write(fd, result.string(), result.size()); 190ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mTrack != 0) { 191ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mTrack->dump(fd, args); 192ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 193ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return NO_ERROR; 194ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 195ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 196ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerstatus_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) const 197ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 19808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller const size_t SIZE = 256; 1999f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller char buffer[SIZE]; 200ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String8 result; 201b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller result.append(" Client\n"); 2029f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", 203f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mPid, mConnId, mStatus, mLoop?"true": "false"); 204ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 205b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller write(fd, result.string(), result.size()); 206f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (mAudioOutput != 0) { 207ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mAudioOutput->dump(fd, args); 208ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 209b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller write(fd, "\n", 1); 210f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return NO_ERROR; 211b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller} 212b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller 213b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Millerstatic int myTid() { 214f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#ifdef HAVE_GETTID 215ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return gettid(); 216ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#else 217ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return getpid(); 218ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#endif 219ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 220ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 221f501b58de8f467a80fef49c704555781bc61ea6fJim Millerstatus_t MediaPlayerService::dump(int fd, const Vector<String16>& args) 222f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 223f501b58de8f467a80fef49c704555781bc61ea6fJim Miller const size_t SIZE = 256; 224ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller char buffer[SIZE]; 225ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String8 result; 226ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 227ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller snprintf(buffer, SIZE, "Permission Denial: " 228ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller "can't dump MediaPlayerService from pid=%d, uid=%d\n", 229f501b58de8f467a80fef49c704555781bc61ea6fJim Miller IPCThreadState::self()->getCallingPid(), 230f501b58de8f467a80fef49c704555781bc61ea6fJim Miller IPCThreadState::self()->getCallingUid()); 231f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append(buffer); 232ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 233ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Mutex::Autolock lock(mLock); 234b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller for (int i = 0, n = mClients.size(); i < n; ++i) { 235b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller sp<Client> c = mClients[i].promote(); 236b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller if (c != 0) c->dump(fd, args); 237f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 238f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append(" Files opened and/or mapped:\n"); 239f501b58de8f467a80fef49c704555781bc61ea6fJim Miller snprintf(buffer, SIZE, "/proc/%d/maps", myTid()); 240b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller FILE *f = fopen(buffer, "r"); 241b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller if (f) { 242ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller while (!feof(f)) { 243ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller fgets(buffer, SIZE, f); 244ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (strstr(buffer, " /sdcard/") || 245ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller strstr(buffer, " /system/sounds/") || 246f501b58de8f467a80fef49c704555781bc61ea6fJim Miller strstr(buffer, " /system/media/")) { 247f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append(" "); 248ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 249ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 250f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 25108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller fclose(f); 25208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } else { 2539f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append("couldn't open "); 2549f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append(buffer); 255f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append("\n"); 2569f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 257748bc36f2eebfdc67520c5025b48fefdfd8d7c01Jim Miller 2589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller snprintf(buffer, SIZE, "/proc/%d/fd", myTid()); 2599f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller DIR *d = opendir(buffer); 2609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (d) { 261f501b58de8f467a80fef49c704555781bc61ea6fJim Miller struct dirent *ent; 262f501b58de8f467a80fef49c704555781bc61ea6fJim Miller while((ent = readdir(d)) != NULL) { 263f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { 264f501b58de8f467a80fef49c704555781bc61ea6fJim Miller snprintf(buffer, SIZE, "/proc/%d/fd/%s", myTid(), ent->d_name); 265f501b58de8f467a80fef49c704555781bc61ea6fJim Miller struct stat s; 266f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (lstat(buffer, &s) == 0) { 267f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if ((s.st_mode & S_IFMT) == S_IFLNK) { 2689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller char linkto[256]; 2699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller int len = readlink(buffer, linkto, sizeof(linkto)); 2709f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if(len > 0) { 271ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller if(len > 255) { 2729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller linkto[252] = '.'; 2739f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller linkto[253] = '.'; 2749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller linkto[254] = '.'; 2759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller linkto[255] = 0; 276f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } else { 2779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller linkto[len] = 0; 2789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 2799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (strstr(linkto, "/sdcard/") == linkto || 2809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller strstr(linkto, "/system/sounds/") == linkto || 281ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller strstr(linkto, "/system/media/") == linkto) { 282ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(" "); 283ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append(buffer); 2849f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append(" -> "); 2859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append(linkto); 2869f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append("\n"); 2879f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 288ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 28906e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller } else { 2909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append(" unexpected type for "); 291f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append(buffer); 292ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append("\n"); 293f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 294ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 29506e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller } 2969f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 2979f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller closedir(d); 2989f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } else { 2999f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller result.append("couldn't open "); 300f501b58de8f467a80fef49c704555781bc61ea6fJim Miller result.append(buffer); 301ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result.append("\n"); 3029f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 303f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 30408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller write(fd, result.string(), result.size()); 3059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return NO_ERROR; 306ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 3079f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 3089f0753f5a378fc80da86305b33244acc6fc53f01Jim Millervoid MediaPlayerService::removeClient(wp<Client> client) 309f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 310ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Mutex::Autolock lock(mLock); 3119f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mClients.remove(client); 312f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 31308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3149f0753f5a378fc80da86305b33244acc6fc53f01Jim MillerMediaPlayerService::Client::Client(const sp<MediaPlayerService>& service, pid_t pid, 3159f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller int32_t connId, const sp<IMediaPlayerClient>& client) 316ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 3179f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("Client(%d) constructor", connId); 318ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mPid = pid; 319ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mConnId = connId; 320ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mService = service; 321ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mClient = client; 322ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mLoop = false; 323ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mStatus = NO_INIT; 3249f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#if CALLBACK_ANTAGONIZER 32508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGD("create Antagonizer"); 3269f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAntagonizer = new Antagonizer(notify, this); 3279f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#endif 3289f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 3299f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 330f501b58de8f467a80fef49c704555781bc61ea6fJim MillerMediaPlayerService::Client::~Client() 331ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 332ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("Client(%d) destructor pid = %d", mConnId, mPid); 3339f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAudioOutput.clear(); 3349f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller wp<Client> client(this); 3359f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller disconnect(); 3369f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mService->removeClient(client); 3379f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 338ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 339ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millervoid MediaPlayerService::Client::disconnect() 3409f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 341ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("disconnect(%d) from pid %d", mConnId, mPid); 342a7596147b43940cad3f76c53ed154ef088b9269bJim Miller // grab local reference and clear main reference to prevent future 3439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // access to object 344ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MediaPlayerBase> p; 3459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller { 3469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Mutex::Autolock l(mLock); 3479f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller p = mPlayer; 348ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 349ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mPlayer.clear(); 3509f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 351ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // clear the notification to prevent callbacks to dead client 35208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller // and reset the player. We assume the player will serialize 3539f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // access to itself if necessary. 3549f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p != 0) { 355ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller p->setNotifyCallback(0, 0); 3569f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#if CALLBACK_ANTAGONIZER 357ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGD("kill Antagonizer"); 3589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAntagonizer->kill(); 359ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller#endif 3609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller p->reset(); 36108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 3629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 3639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller IPCThreadState::self()->flushCommands(); 3649f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 3659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 3669f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatic player_type getPlayerType(int fd, int64_t offset, int64_t length) 367ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 368ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller char buf[20]; 3699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller lseek(fd, offset, SEEK_SET); 3709f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller read(fd, buf, sizeof(buf)); 3719f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller lseek(fd, offset, SEEK_SET); 3729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 373ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller long ident = *((long*)buf); 374ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 375ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Ogg vorbis? 3769f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (ident == 0x5367674f) // 'OggS' 377ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return VORBIS_PLAYER; 3789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 3799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // Some kind of MIDI? 3809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller EAS_DATA_HANDLE easdata; 3819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (EAS_Init(&easdata) == EAS_SUCCESS) { 3829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller EAS_FILE locator; 383ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller locator.path = NULL; 38408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller locator.fd = fd; 38508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller locator.offset = offset; 38608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller locator.length = length; 387ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller EAS_HANDLE eashandle; 388ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) { 3899f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller EAS_CloseFile(easdata, eashandle); 3909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller EAS_Shutdown(easdata); 3919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return SONIVOX_PLAYER; 3929f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 393d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller EAS_Shutdown(easdata); 3949f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 3959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 396ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Fall through to PV 397f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return PV_PLAYER; 398f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 399e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller 400e4c58e46419bdc1cbe94516bdded71f017534d9cJim Millerstatic player_type getPlayerType(const char* url) 401e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller{ 402e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller 403e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller // use MidiFile for MIDI extensions 404d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller int lenURL = strlen(url); 405f501b58de8f467a80fef49c704555781bc61ea6fJim Miller for (int i = 0; i < NELEM(FILE_EXTS); ++i) { 406ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller int len = strlen(FILE_EXTS[i].extension); 407f501b58de8f467a80fef49c704555781bc61ea6fJim Miller int start = lenURL - len; 408f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (start > 0) { 409ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi if (!strncmp(url + start, FILE_EXTS[i].extension, len)) { 410ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi return FILE_EXTS[i].playertype; 411ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi } 412f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 413f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 414f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 415f501b58de8f467a80fef49c704555781bc61ea6fJim Miller // Fall through to PV 416f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return PV_PLAYER; 417f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 418f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 419f501b58de8f467a80fef49c704555781bc61ea6fJim Millerstatic sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie, 420f501b58de8f467a80fef49c704555781bc61ea6fJim Miller notify_callback_f notifyFunc) 421f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 422f501b58de8f467a80fef49c704555781bc61ea6fJim Miller sp<MediaPlayerBase> p; 423f501b58de8f467a80fef49c704555781bc61ea6fJim Miller switch (playerType) { 424f501b58de8f467a80fef49c704555781bc61ea6fJim Miller case PV_PLAYER: 425ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi LOGV(" create PVPlayer"); 426ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi p = new PVPlayer(); 427f501b58de8f467a80fef49c704555781bc61ea6fJim Miller break; 428ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi case SONIVOX_PLAYER: 429f501b58de8f467a80fef49c704555781bc61ea6fJim Miller LOGV(" create MidiFile"); 4309f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller p = new MidiFile(); 4319f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller break; 4329f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller case VORBIS_PLAYER: 4339f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV(" create VorbisPlayer"); 434ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller p = new VorbisPlayer(); 435ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller break; 436ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 437ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (p != NULL) { 438ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (p->initCheck() == NO_ERROR) { 439ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller p->setNotifyCallback(cookie, notifyFunc); 440ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 441ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller p.clear(); 4429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 4439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 444f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (p == NULL) { 4459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGE("Failed to create player object"); 4469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 447ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return p; 4484af76a51d5082c740609563e07cf35f30bc2224eSvetoslav} 4494af76a51d5082c740609563e07cf35f30bc2224eSvetoslav 4509f0753f5a378fc80da86305b33244acc6fc53f01Jim Millersp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) 451ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 452ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // determine if we have the right player type 453ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MediaPlayerBase> p = mPlayer; 454ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if ((p != NULL) && (p->playerType() != playerType)) { 455ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("delete player"); 456ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller p.clear(); 457ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 4589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p == NULL) { 459d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller p = android::createPlayer(playerType, this, notify); 460d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller } 461d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller return p; 4629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 4639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 4649f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatus_t MediaPlayerService::Client::setDataSource(const char *url) 4659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 4669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("setDataSource(%s)", url); 4679f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (url == NULL) 4689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return UNKNOWN_ERROR; 469fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller 470fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller if (strncmp(url, "content://", 10) == 0) { 4719f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // get a filedescriptor for the content Uri and 4729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // pass it to the setDataSource(fd) method 473f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 474ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String16 url16(url); 47508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller int fd = android::openContentProviderFile(url16); 476f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (fd < 0) 477f501b58de8f467a80fef49c704555781bc61ea6fJim Miller { 478f501b58de8f467a80fef49c704555781bc61ea6fJim Miller LOGE("Couldn't open fd for %s", url); 4799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return UNKNOWN_ERROR; 4809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 48108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus 4829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller close(fd); 483ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mStatus; 484ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 485ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller player_type playerType = getPlayerType(url); 486ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("player type = %d", playerType); 487ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 488fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller // create the right type of player 489ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MediaPlayerBase> p = createPlayer(playerType); 490ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (p == NULL) return NO_INIT; 4919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 49208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (!p->hardwareOutput()) { 4939f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAudioOutput = new AudioOutput(); 494fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 495ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 496ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 497ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // now set data source 498ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV(" setDataSource"); 499ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mStatus = p->setDataSource(url); 500ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mStatus == NO_ERROR) mPlayer = p; 501ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mStatus; 502ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 503ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 504ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 505ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerstatus_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length) 506ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 507ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); 508ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller struct stat sb; 509ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller int ret = fstat(fd, &sb); 510ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (ret != 0) { 511f501b58de8f467a80fef49c704555781bc61ea6fJim Miller LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 512ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return UNKNOWN_ERROR; 513ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 514ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 515ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("st_dev = %llu", sb.st_dev); 51608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGV("st_mode = %u", sb.st_mode); 517ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("st_uid = %lu", sb.st_uid); 51808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGV("st_gid = %lu", sb.st_gid); 519ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("st_size = %llu", sb.st_size); 52008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 52108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (offset >= sb.st_size) { 52208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGE("offset error"); 523e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy ::close(fd); 524e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy return UNKNOWN_ERROR; 525e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy } 526e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy if (offset + length > sb.st_size) { 527e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy length = sb.st_size - offset; 528e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy LOGV("calculated length = %lld", length); 529e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy } 530e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy 531e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy player_type playerType = getPlayerType(fd, offset, length); 532e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy LOGV("player type = %d", playerType); 533e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy 534e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy // create the right type of player 535e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy sp<MediaPlayerBase> p = createPlayer(playerType); 536e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy if (p == NULL) return NO_INIT; 537e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy 5389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (!p->hardwareOutput()) { 5399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAudioOutput = new AudioOutput(); 5409f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 541ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 542ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 5439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // now set data source 54408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mStatus = p->setDataSource(fd, offset, length); 545f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (mStatus == NO_ERROR) mPlayer = p; 5469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return mStatus; 5479f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 5489f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 5499f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatus_t MediaPlayerService::Client::setVideoSurface(const sp<ISurface>& surface) 550ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 5519f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] setVideoSurface(%p)", mConnId, surface.get()); 552ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MediaPlayerBase> p = getPlayer(); 553ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (p == 0) return UNKNOWN_ERROR; 554ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return p->setVideoSurface(surface); 555ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 556ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 55708fa40c5cb5229b7969b2a5146855a337870f45aJim Millerstatus_t MediaPlayerService::Client::prepareAsync() 55808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller{ 55908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGV("[%d] prepareAsync", mConnId); 56008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller sp<MediaPlayerBase> p = getPlayer(); 5619f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p == 0) return UNKNOWN_ERROR; 5629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller status_t ret = p->prepareAsync(); 5639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#if CALLBACK_ANTAGONIZER 564ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGD("start Antagonizer"); 5659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (ret == NO_ERROR) mAntagonizer->start(); 56608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller#endif 567f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return ret; 5689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 5699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 57008fa40c5cb5229b7969b2a5146855a337870f45aJim Millerstatus_t MediaPlayerService::Client::start() 57108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller{ 5729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] start", mConnId); 57308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller sp<MediaPlayerBase> p = getPlayer(); 5749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p == 0) return UNKNOWN_ERROR; 57508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller p->setLooping(mLoop); 576a7596147b43940cad3f76c53ed154ef088b9269bJim Miller return p->start(); 5779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 57808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 57908fa40c5cb5229b7969b2a5146855a337870f45aJim Millerstatus_t MediaPlayerService::Client::stop() 58008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller{ 5819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] stop", mConnId); 5829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sp<MediaPlayerBase> p = getPlayer(); 5839f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p == 0) return UNKNOWN_ERROR; 584ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return p->stop(); 585ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 5869f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 587f501b58de8f467a80fef49c704555781bc61ea6fJim Millerstatus_t MediaPlayerService::Client::pause() 5882aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi{ 5899f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] pause", mConnId); 5904af76a51d5082c740609563e07cf35f30bc2224eSvetoslav sp<MediaPlayerBase> p = getPlayer(); 59108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (p == 0) return UNKNOWN_ERROR; 5929f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return p->pause(); 59308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller} 5949f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 59508fa40c5cb5229b7969b2a5146855a337870f45aJim Millerstatus_t MediaPlayerService::Client::isPlaying(bool* state) 59608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller{ 59708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller *state = false; 5982aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi sp<MediaPlayerBase> p = getPlayer(); 5992aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (p == 0) return UNKNOWN_ERROR; 600ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller *state = p->isPlaying(); 6019f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] isPlaying: %d", mConnId, *state); 60208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller return NO_ERROR; 603f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 6042aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi 6052aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggistatus_t MediaPlayerService::Client::getCurrentPosition(int *msec) 6062aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi{ 6072aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGV("getCurrentPosition"); 6082aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi sp<MediaPlayerBase> p = getPlayer(); 6092aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (p == 0) return UNKNOWN_ERROR; 6102aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi status_t ret = p->getCurrentPosition(msec); 6112aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (ret == NO_ERROR) { 6122aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGV("[%d] getCurrentPosition = %d", mConnId, *msec); 613f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } else { 6142aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGE("getCurrentPosition returned %d", ret); 6152aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } 6164af76a51d5082c740609563e07cf35f30bc2224eSvetoslav return ret; 6174af76a51d5082c740609563e07cf35f30bc2224eSvetoslav} 6182aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi 6192aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggistatus_t MediaPlayerService::Client::getDuration(int *msec) 6202aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi{ 6212aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGV("getDuration"); 6222aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi sp<MediaPlayerBase> p = getPlayer(); 6232aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (p == 0) return UNKNOWN_ERROR; 6242aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi status_t ret = p->getDuration(msec); 6252aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (ret == NO_ERROR) { 6262aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGV("[%d] getDuration = %d", mConnId, *msec); 6272aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } else { 6282aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi LOGE("getDuration returned %d", ret); 629f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 6309f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return ret; 63108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller} 63208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 6339f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatus_t MediaPlayerService::Client::seekTo(int msec) 6344af76a51d5082c740609563e07cf35f30bc2224eSvetoslav{ 63508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller LOGV("[%d] seekTo(%d)", mConnId, msec); 6369f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sp<MediaPlayerBase> p = getPlayer(); 63708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (p == 0) return UNKNOWN_ERROR; 63808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller return p->seekTo(msec); 6399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 640a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 6419f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatus_t MediaPlayerService::Client::reset() 642a7596147b43940cad3f76c53ed154ef088b9269bJim Miller{ 643a7596147b43940cad3f76c53ed154ef088b9269bJim Miller LOGV("[%d] reset", mConnId); 6444d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales sp<MediaPlayerBase> p = getPlayer(); 6454d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales if (p == 0) return UNKNOWN_ERROR; 6464d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales return p->reset(); 6474d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales} 6484d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales 6494d41a203a08c55b3f3190519535ccee6557ea4feAndres Moralesstatus_t MediaPlayerService::Client::setAudioStreamType(int type) 6504d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales{ 6514d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales LOGV("[%d] setAudioStreamType(%d)", mConnId, type); 6524d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales // TODO: for hardware output, call player instead 6534af76a51d5082c740609563e07cf35f30bc2224eSvetoslav Mutex::Autolock l(mLock); 6544d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales if (mAudioOutput != 0) mAudioOutput->setAudioStreamType(type); 6554d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales return NO_ERROR; 6564d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales} 6574d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales 6584d41a203a08c55b3f3190519535ccee6557ea4feAndres Moralesstatus_t MediaPlayerService::Client::setLooping(int loop) 6594d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales{ 6604d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales LOGV("[%d] setLooping(%d)", mConnId, loop); 6614d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales mLoop = loop; 6624d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales sp<MediaPlayerBase> p = getPlayer(); 66324e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin if (p != 0) return p->setLooping(loop); 66424e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin return NO_ERROR; 66524e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin} 66624e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin 66724e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubinstatus_t MediaPlayerService::Client::setVolume(float leftVolume, float rightVolume) 668f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 669f501b58de8f467a80fef49c704555781bc61ea6fJim Miller LOGV("[%d] setVolume(%f, %f)", mConnId, leftVolume, rightVolume); 670f501b58de8f467a80fef49c704555781bc61ea6fJim Miller // TODO: for hardware output, call player instead 671f501b58de8f467a80fef49c704555781bc61ea6fJim Miller Mutex::Autolock l(mLock); 6729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mAudioOutput != 0) mAudioOutput->setVolume(leftVolume, rightVolume); 6739f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return NO_ERROR; 6749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 6759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 6769f0753f5a378fc80da86305b33244acc6fc53f01Jim Millervoid MediaPlayerService::Client::notify(void* cookie, int msg, int ext1, int ext2) 6779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 6789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Client* client = static_cast<Client*>(cookie); 6799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2); 680f501b58de8f467a80fef49c704555781bc61ea6fJim Miller client->mClient->notify(msg, ext1, ext2); 681f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 682f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 683f501b58de8f467a80fef49c704555781bc61ea6fJim Miller#if CALLBACK_ANTAGONIZER 684f501b58de8f467a80fef49c704555781bc61ea6fJim Millerconst int Antagonizer::interval = 10000; // 10 msecs 6859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 6869f0753f5a378fc80da86305b33244acc6fc53f01Jim MillerAntagonizer::Antagonizer(notify_callback_f cb, void* client) : 6879f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mExit(false), mActive(false), mClient(client), mCb(cb) 6889f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 6899f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller createThread(callbackThread, this); 6909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 6919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 6929f0753f5a378fc80da86305b33244acc6fc53f01Jim Millervoid Antagonizer::kill() 69308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller{ 6949f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Mutex::Autolock _l(mLock); 6959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mActive = false; 6969f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mExit = true; 6979f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mCondition.wait(mLock); 6989f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 6999f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7009f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerint Antagonizer::callbackThread(void* user) 7019f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 7029f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGD("Antagonizer started"); 7039f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Antagonizer* p = reinterpret_cast<Antagonizer*>(user); 7049f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller while (!p->mExit) { 7059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (p->mActive) { 706a7596147b43940cad3f76c53ed154ef088b9269bJim Miller LOGV("send event"); 707a7596147b43940cad3f76c53ed154ef088b9269bJim Miller p->mCb(p->mClient, 0, 0, 0); 708a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 7099f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller usleep(interval); 7109f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 7119f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Mutex::Autolock _l(p->mLock); 7129f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller p->mCondition.signal(); 7139f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGD("Antagonizer stopped"); 7149f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return 0; 7159f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 7169f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller#endif 7179f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7189f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerstatic size_t kDefaultHeapSize = 1024 * 1024; // 1MB 7199f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7209f0753f5a378fc80da86305b33244acc6fc53f01Jim Millersp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) 7219f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 7229f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("decode(%s)", url); 7239f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sp<MemoryBase> mem; 7249f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sp<MediaPlayerBase> player; 7259f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 726f501b58de8f467a80fef49c704555781bc61ea6fJim Miller // Protect our precious, precious DRMd ringtones by only allowing 7279f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // decoding of http, but not filesystem paths or content Uris. 728f501b58de8f467a80fef49c704555781bc61ea6fJim Miller // If the application wants to decode those, it should open a 729f501b58de8f467a80fef49c704555781bc61ea6fJim Miller // filedescriptor for them and use that. 730f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (url != NULL && strncmp(url, "http://", 7) != 0) { 731f501b58de8f467a80fef49c704555781bc61ea6fJim Miller LOGD("Can't decode %s by path, use filedescriptor instead", url); 732f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mem; 733f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 734f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 735f501b58de8f467a80fef49c704555781bc61ea6fJim Miller player_type playerType = getPlayerType(url); 7369f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("player type = %d", playerType); 7379f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // create the right type of player 7399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sp<AudioCache> cache = new AudioCache(url); 7409f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller player = android::createPlayer(playerType, cache.get(), cache->notify); 7419f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (player == NULL) goto Exit; 7429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (player->hardwareOutput()) goto Exit; 7439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7449f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 7459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // set data source 7479f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (player->setDataSource(url) != NO_ERROR) goto Exit; 7489f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7499f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("prepare"); 750ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller player->prepareAsync(); 751ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 752ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller LOGV("wait for prepare"); 753ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller if (cache->wait() != NO_ERROR) goto Exit; 7549f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7559f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("start"); 7569f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller player->start(); 7579f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("wait for playback complete"); 7599f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (cache->wait() != NO_ERROR) goto Exit; 76024e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin 7619f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 7629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller *pSampleRate = cache->sampleRate(); 7639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller *pNumChannels = cache->channelCount(); 7649f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller *pFormat = cache->format(); 7659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 7669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 7679f0753f5a378fc80da86305b33244acc6fc53f01Jim MillerExit: 7689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (player != 0) player->reset(); 769ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller return mem; 770ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller} 771ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 772fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Millersp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) 773ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 774ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("decode(%d, %lld, %lld)", fd, offset, length); 775ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MemoryBase> mem; 776ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller sp<MediaPlayerBase> player; 777ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 778ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller player_type playerType = getPlayerType(fd, offset, length); 779ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("player type = %d", playerType); 780ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 781ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // create the right type of player 7824af76a51d5082c740609563e07cf35f30bc2224eSvetoslav sp<AudioCache> cache = new AudioCache("decode_fd"); 783ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller player = android::createPlayer(playerType, cache.get(), cache->notify); 784ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (player == NULL) goto Exit; 785ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (player->hardwareOutput()) goto Exit; 786ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 787ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 788ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 789ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // set data source 790ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; 791ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 792ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("prepare"); 793ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller player->prepareAsync(); 794ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 795ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("wait for prepare"); 796ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (cache->wait() != NO_ERROR) goto Exit; 797ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 798ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("start"); 799ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller player->start(); 800fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller 801fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller LOGV("wait for playback complete"); 802fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller if (cache->wait() != NO_ERROR) goto Exit; 803fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller 804fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 805ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller *pSampleRate = cache->sampleRate(); 806ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller *pNumChannels = cache->channelCount(); 807ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller *pFormat = cache->format(); 808ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 809ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 810ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim MillerExit: 811ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (player != 0) player->reset(); 812ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller ::close(fd); 8139f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return mem; 814ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 815ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 816ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller#undef LOG_TAG 81799d6019bead4705b7e126e65b856d538417d4934Jim Miller#define LOG_TAG "AudioSink" 818ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim MillerMediaPlayerService::AudioOutput::AudioOutput() 819ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 820ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mTrack = 0; 821ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mStreamType = AudioSystem::MUSIC; 822ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mLeftVolume = 1.0; 823ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mRightVolume = 1.0; 824ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mLatency = 0; 825ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mMsecsPerFrame = 0; 826ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller setMinBufferCount(); 827ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 828ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 829ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim MillerMediaPlayerService::AudioOutput::~AudioOutput() 830ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 831ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller close(); 832ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 833ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 834ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millervoid MediaPlayerService::AudioOutput::setMinBufferCount() 835ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 836ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller char value[PROPERTY_VALUE_MAX]; 837ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (property_get("ro.kernel.qemu", value, 0)) { 838ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mIsOnEmulator = true; 839ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mMinBufferCount = 12; // to prevent systematic buffer underrun for emulator 840ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 841ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller} 842ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 843ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerbool MediaPlayerService::AudioOutput::isOnEmulator() 844ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller{ 8459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller setMinBufferCount(); 846ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mIsOnEmulator; 84799d6019bead4705b7e126e65b856d538417d4934Jim Miller} 84899d6019bead4705b7e126e65b856d538417d4934Jim Miller 8499f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerint MediaPlayerService::AudioOutput::getMinBufferCount() 8509f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 8519f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller setMinBufferCount(); 852f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mMinBufferCount; 8539f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 8549f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 8559f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerssize_t MediaPlayerService::AudioOutput::bufferSize() const 8569f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 8579f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mTrack == 0) return NO_INIT; 858f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mTrack->frameCount() * frameSize(); 8599f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 8609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 8619f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerssize_t MediaPlayerService::AudioOutput::frameCount() const 8629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 863f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (mTrack == 0) return NO_INIT; 864f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mTrack->frameCount(); 865f501b58de8f467a80fef49c704555781bc61ea6fJim Miller} 866f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 867f501b58de8f467a80fef49c704555781bc61ea6fJim Millerssize_t MediaPlayerService::AudioOutput::channelCount() const 868f501b58de8f467a80fef49c704555781bc61ea6fJim Miller{ 869f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (mTrack == 0) return NO_INIT; 870f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mTrack->channelCount(); 8719f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 8729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 873f501b58de8f467a80fef49c704555781bc61ea6fJim Millerssize_t MediaPlayerService::AudioOutput::frameSize() const 8749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 8759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mTrack == 0) return NO_INIT; 8769f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return mTrack->frameSize(); 8779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 878f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 8799f0753f5a378fc80da86305b33244acc6fc53f01Jim Milleruint32_t MediaPlayerService::AudioOutput::latency () const 8809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller{ 8819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return mLatency; 8829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller} 8839f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 8844d41a203a08c55b3f3190519535ccee6557ea4feAndres Moralesfloat MediaPlayerService::AudioOutput::msecsPerFrame() const 8854d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales{ 886 return mMsecsPerFrame; 887} 888 889status_t MediaPlayerService::AudioOutput::open(uint32_t sampleRate, int channelCount, int format, int bufferCount) 890{ 891 // Check argument "bufferCount" against the mininum buffer count 892 if (bufferCount < mMinBufferCount) { 893 LOGD("bufferCount (%d) is too small and increased to %d", bufferCount, mMinBufferCount); 894 bufferCount = mMinBufferCount; 895 896 } 897 LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); 898 if (mTrack) close(); 899 int afSampleRate; 900 int afFrameCount; 901 int frameCount; 902 903 if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) { 904 return NO_INIT; 905 } 906 if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != NO_ERROR) { 907 return NO_INIT; 908 } 909 910 frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 911 AudioTrack *t = new AudioTrack(mStreamType, sampleRate, format, channelCount, frameCount); 912 if ((t == 0) || (t->initCheck() != NO_ERROR)) { 913 LOGE("Unable to create audio track"); 914 delete t; 915 return NO_INIT; 916 } 917 918 LOGV("setVolume"); 919 t->setVolume(mLeftVolume, mRightVolume); 920 mMsecsPerFrame = 1.e3 / (float) sampleRate; 921 mLatency = t->latency() + kAudioVideoDelayMs; 922 mTrack = t; 923 return NO_ERROR; 924} 925 926void MediaPlayerService::AudioOutput::start() 927{ 928 LOGV("start"); 929 if (mTrack) { 930 mTrack->setVolume(mLeftVolume, mRightVolume); 931 mTrack->start(); 932 } 933} 934 935ssize_t MediaPlayerService::AudioOutput::write(const void* buffer, size_t size) 936{ 937 //LOGV("write(%p, %u)", buffer, size); 938 if (mTrack) return mTrack->write(buffer, size); 939 return NO_INIT; 940} 941 942void MediaPlayerService::AudioOutput::stop() 943{ 944 LOGV("stop"); 945 if (mTrack) mTrack->stop(); 946} 947 948void MediaPlayerService::AudioOutput::flush() 949{ 950 LOGV("flush"); 951 if (mTrack) mTrack->flush(); 952} 953 954void MediaPlayerService::AudioOutput::pause() 955{ 956 LOGV("pause"); 957 if (mTrack) mTrack->pause(); 958} 959 960void MediaPlayerService::AudioOutput::close() 961{ 962 LOGV("close"); 963 delete mTrack; 964 mTrack = 0; 965} 966 967void MediaPlayerService::AudioOutput::setVolume(float left, float right) 968{ 969 LOGV("setVolume(%f, %f)", left, right); 970 mLeftVolume = left; 971 mRightVolume = right; 972 if (mTrack) { 973 mTrack->setVolume(left, right); 974 } 975} 976 977#undef LOG_TAG 978#define LOG_TAG "AudioCache" 979MediaPlayerService::AudioCache::AudioCache(const char* name) : 980 mChannelCount(0), mFrameCount(1024), mSampleRate(0), mSize(0), 981 mError(NO_ERROR), mCommandComplete(false) 982{ 983 // create ashmem heap 984 mHeap = new MemoryHeapBase(kDefaultHeapSize, 0, name); 985} 986 987uint32_t MediaPlayerService::AudioCache::latency () const 988{ 989 return 0; 990} 991 992float MediaPlayerService::AudioCache::msecsPerFrame() const 993{ 994 return mMsecsPerFrame; 995} 996 997status_t MediaPlayerService::AudioCache::open(uint32_t sampleRate, int channelCount, int format, int bufferCount) 998{ 999 LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); 1000 if (mHeap->getHeapID() < 0) return NO_INIT; 1001 mSampleRate = sampleRate; 1002 mChannelCount = (uint16_t)channelCount; 1003 mFormat = (uint16_t)format; 1004 mMsecsPerFrame = 1.e3 / (float) sampleRate; 1005 return NO_ERROR; 1006} 1007 1008ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) 1009{ 1010 LOGV("write(%p, %u)", buffer, size); 1011 if ((buffer == 0) || (size == 0)) return size; 1012 1013 uint8_t* p = static_cast<uint8_t*>(mHeap->getBase()); 1014 if (p == NULL) return NO_INIT; 1015 p += mSize; 1016 LOGV("memcpy(%p, %p, %u)", p, buffer, size); 1017 if (mSize + size > mHeap->getSize()) { 1018 LOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize()); 1019 size = mHeap->getSize() - mSize; 1020 } 1021 memcpy(p, buffer, size); 1022 mSize += size; 1023 return size; 1024} 1025 1026// call with lock held 1027status_t MediaPlayerService::AudioCache::wait() 1028{ 1029 Mutex::Autolock lock(mLock); 1030 if (!mCommandComplete) { 1031 mSignal.wait(mLock); 1032 } 1033 mCommandComplete = false; 1034 1035 if (mError == NO_ERROR) { 1036 LOGV("wait - success"); 1037 } else { 1038 LOGV("wait - error"); 1039 } 1040 return mError; 1041} 1042 1043void MediaPlayerService::AudioCache::notify(void* cookie, int msg, int ext1, int ext2) 1044{ 1045 LOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); 1046 AudioCache* p = static_cast<AudioCache*>(cookie); 1047 1048 // ignore buffering messages 1049 if (msg == MEDIA_BUFFERING_UPDATE) return; 1050 1051 // set error condition 1052 if (msg == MEDIA_ERROR) { 1053 LOGE("Error %d, %d occurred", ext1, ext2); 1054 p->mError = ext1; 1055 } 1056 1057 // wake up thread 1058 LOGV("wakeup thread"); 1059 p->mCommandComplete = true; 1060 p->mSignal.signal(); 1061} 1062 1063}; // namespace android 1064