MediaPlayerService.cpp revision 44a7e42f0310831e6a846d1b6bb40bf3a399bf6d
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2008, The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Proxy for media player implementations 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "MediaPlayerService" 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/stat.h> 267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <sys/time.h> 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <dirent.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <unistd.h> 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <string.h> 316f74b0cc490a3b8523252ded00f7ca55160effd1Mathias Agopian 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <cutils/atomic.h> 3314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <cutils/properties.h> // for property_get 346f74b0cc490a3b8523252ded00f7ca55160effd1Mathias Agopian 356f74b0cc490a3b8523252ded00f7ca55160effd1Mathias Agopian#include <utils/misc.h> 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 377562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IPCThreadState.h> 387562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h> 397562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/MemoryHeapBase.h> 407562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/MemoryBase.h> 417dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis#include <gui/SurfaceTextureClient.h> 421d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania#include <utils/Errors.h> // for status_t 431d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania#include <utils/String8.h> 4410dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen#include <utils/SystemClock.h> 451d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania#include <utils/Vector.h> 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/MediaPlayerInterface.h> 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediarecorder.h> 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/MediaMetadataRetrieverInterface.h> 50a64c8c79af1a15911c55306d83a797fa50969f77niko#include <media/Metadata.h> 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioTrack.h> 528635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#include <media/MemoryLeakTrackUtil.h> 539cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent#include <media/stagefright/MediaErrors.h> 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5564760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 56fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 577cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <private/android_filesystem_config.h> 587cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 59559bf2836f5da25b75bfb229fec0d20d540ee426James Dong#include "ActivityManager.h" 6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MediaRecorderClient.h" 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MediaPlayerService.h" 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MetadataRetrieverClient.h" 6344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h" 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MidiFile.h" 6614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include "TestPlayerStub.h" 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "StagefrightPlayer.h" 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "nuplayer/NuPlayerDriver.h" 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX.h> 7114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 72ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include "Crypto.h" 73ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 74a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catanianamespace { 75a64c8c79af1a15911c55306d83a797fa50969f77nikousing android::media::Metadata; 76a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::status_t; 77a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::OK; 78a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::BAD_VALUE; 79a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::NOT_ENOUGH_DATA; 80a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::Parcel; 81a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 82a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Max number of entries in the filter. 83a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniaconst int kMaxFilterSize = 64; // I pulled that out of thin air. 84a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 85a64c8c79af1a15911c55306d83a797fa50969f77niko// FIXME: Move all the metadata related function in the Metadata.cpp 86d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 87a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 88a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Unmarshall a filter from a Parcel. 89a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Filter format in a parcel: 90a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// 91a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 92a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 93a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | number of entries (n) | 94a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 95a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type 1 | 96a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 97a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type 2 | 98a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 99a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// .... 100a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 101a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type n | 102a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 103a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// 104a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param p Parcel that should start with a filter. 105a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param[out] filter On exit contains the list of metadata type to be 106a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// filtered. 107a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param[out] status On exit contains the status code to be returned. 108a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @return true if the parcel starts with a valid filter. 109a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniabool unmarshallFilter(const Parcel& p, 110a64c8c79af1a15911c55306d83a797fa50969f77niko Metadata::Filter *filter, 111a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania status_t *status) 112a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 1134829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania int32_t val; 1144829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (p.readInt32(&val) != OK) 115a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 11629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to read filter's length"); 117a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = NOT_ENOUGH_DATA; 118a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 119a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 120a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1214829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if( val > kMaxFilterSize || val < 0) 122a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 12329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Invalid filter len %d", val); 124a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = BAD_VALUE; 125a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 126a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 127a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1284829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania const size_t num = val; 129a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 130a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania filter->clear(); 1314829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania filter->setCapacity(num); 132a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 133a64c8c79af1a15911c55306d83a797fa50969f77niko size_t size = num * sizeof(Metadata::Type); 134a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1354829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1364829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (p.dataAvail() < size) 137a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 13829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Filter too short expected %d but got %d", size, p.dataAvail()); 139a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = NOT_ENOUGH_DATA; 140a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 141a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 142a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 143a64c8c79af1a15911c55306d83a797fa50969f77niko const Metadata::Type *data = 144a64c8c79af1a15911c55306d83a797fa50969f77niko static_cast<const Metadata::Type*>(p.readInplace(size)); 145a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1464829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (NULL == data) 147a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 14829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Filter had no data"); 149a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = BAD_VALUE; 150a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 151a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 152a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 153a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // TODO: The stl impl of vector would be more efficient here 154a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // because it degenerates into a memcpy on pod types. Try to 155a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // replace later or use stl::set. 1564829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania for (size_t i = 0; i < num; ++i) 157a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 1584829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania filter->add(*data); 159a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania ++data; 160a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 161a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = OK; 162a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 163a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 164a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1654829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania// @param filter Of metadata type. 166a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param val To be searched. 167a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @return true if a match was found. 168a64c8c79af1a15911c55306d83a797fa50969f77nikobool findMetadata(const Metadata::Filter& filter, const int32_t val) 169a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 170a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // Deal with empty and ANY right away 171a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania if (filter.isEmpty()) return false; 172a64c8c79af1a15911c55306d83a797fa50969f77niko if (filter[0] == Metadata::kAny) return true; 173a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1744829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania return filter.indexOf(val) >= 0; 175a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 176a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 177a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} // anonymous namespace 178a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 179a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 182d681bbb1767bed09415e050ba78975df214bcd68Dave Burkestatic bool checkPermission(const char* permissionString) { 183d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#ifndef HAVE_ANDROID_OS 184d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return true; 185d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#endif 186d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 187d681bbb1767bed09415e050ba78975df214bcd68Dave Burke bool ok = checkCallingPermission(String16(permissionString)); 18829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block if (!ok) ALOGE("Request requires %s", permissionString); 189d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return ok; 190d681bbb1767bed09415e050ba78975df214bcd68Dave Burke} 191d681bbb1767bed09415e050ba78975df214bcd68Dave Burke 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// TODO: Find real cause of Audio/Video delay in PV framework and remove this workaround 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* static */ int MediaPlayerService::AudioOutput::mMinBufferCount = 4; 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* static */ bool MediaPlayerService::AudioOutput::mIsOnEmulator = false; 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::instantiate() { 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project defaultServiceManager()->addService( 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String16("media.player"), new MediaPlayerService()); 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::MediaPlayerService() 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MediaPlayerService created"); 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mNextConnId = 1; 2059ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 2069ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount = 0; 2079ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 2089ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[i] = 0; 2099ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 2109ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] = 0; 2119ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 2129ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // speaker is on by default 2139ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[SPEAKER] = 1; 21444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 21544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman MediaPlayerFactory::registerBuiltinFactories(); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::~MediaPlayerService() 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MediaPlayerService destroyed"); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaRecorder> MediaPlayerService::createMediaRecorder(pid_t pid) 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 225dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid); 226dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang wp<MediaRecorderClient> w = recorder; 227dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang Mutex::Autolock lock(mLock); 228dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaRecorderClients.add(w); 2293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new media recorder client from pid %d", pid); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return recorder; 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 233dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wangvoid MediaPlayerService::removeMediaRecorderClient(wp<MediaRecorderClient> client) 234dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang{ 235dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang Mutex::Autolock lock(mLock); 236dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaRecorderClients.remove(client); 2373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Delete media recorder client"); 238dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang} 239dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaMetadataRetriever> MediaPlayerService::createMetadataRetriever(pid_t pid) 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MetadataRetrieverClient> retriever = new MetadataRetrieverClient(pid); 2433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new media retriever from pid %d", pid); 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return retriever; 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, 248d681bbb1767bed09415e050ba78975df214bcd68Dave Burke int audioSessionId) 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int32_t connId = android_atomic_inc(&mNextConnId); 2519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber sp<Client> c = new Client( 2539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber this, pid, connId, client, audioSessionId, 2549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber IPCThreadState::self()->getCallingUid()); 2559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid, 257d681bbb1767bed09415e050ba78975df214bcd68Dave Burke IPCThreadState::self()->getCallingUid()); 258e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 259d681bbb1767bed09415e050ba78975df214bcd68Dave Burke wp<Client> w = c; 260d681bbb1767bed09415e050ba78975df214bcd68Dave Burke { 261e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Mutex::Autolock lock(mLock); 262e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mClients.add(w); 263e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 264e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return c; 265e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 266e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMX> MediaPlayerService::getOMX() { 268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (mOMX.get() == NULL) { 271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX = new OMX; 272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mOMX; 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 277ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubersp<ICrypto> MediaPlayerService::makeCrypto() { 2781bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return new Crypto; 279ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 280ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& args) const 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" AudioCache\n"); 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mHeap != 0) { 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " heap base(%p), size(%d), flags(%d), device(%s)\n", 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mHeap->getBase(), mHeap->getSize(), mHeap->getFlags(), mHeap->getDevice()); 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " msec per frame(%f), channel count(%d), format(%d), frame count(%ld)\n", 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame, mChannelCount, mFormat, mFrameCount); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " sample rate(%d), size(%d), error(%d), command complete(%s)\n", 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSampleRate, mSize, mError, mCommandComplete?"true":"false"); 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::write(fd, result.string(), result.size()); 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioOutput::dump(int fd, const Vector<String16>& args) const 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" AudioOutput\n"); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType, mLeftVolume, mRightVolume); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " msec per frame(%f), latency (%d)\n", 314db354e58e65592777aa17caa47933e14838b8b35Eric Laurent mMsecsPerFrame, (mTrack != 0) ? mTrack->latency() : -1); 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 3162beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent snprintf(buffer, 255, " aux effect id(%d), send level (%f)\n", 3172beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId, mSendLevel); 3182beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent result.append(buffer); 3192beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::write(fd, result.string(), result.size()); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack != 0) { 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->dump(fd, args); 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) const 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" Client\n"); 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPid, mConnId, mStatus, mLoop?"true": "false"); 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, result.string(), result.size()); 337a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mPlayer != NULL) { 338a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mPlayer->dump(fd, args); 339a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioOutput != 0) { 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioOutput->dump(fd, args); 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, "\n", 1); 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::dump(int fd, const Vector<String16>& args) 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, SIZE, "Permission Denial: " 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "can't dump MediaPlayerService from pid=%d, uid=%d\n", 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->getCallingPid(), 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->getCallingUid()); 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project for (int i = 0, n = mClients.size(); i < n; ++i) { 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<Client> c = mClients[i].promote(); 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (c != 0) c->dump(fd, args); 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 364b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong if (mMediaRecorderClients.size() == 0) { 365b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong result.append(" No media recorder client\n\n"); 366b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong } else { 367b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) { 368b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote(); 369e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong if (c != 0) { 370e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid); 371e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong result.append(buffer); 372e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong write(fd, result.string(), result.size()); 373e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong result = "\n"; 374e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong c->dump(fd, args); 375e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong } 376b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong } 377dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang } 378dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" Files opened and/or mapped:\n"); 3800512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FILE *f = fopen(buffer, "r"); 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (f) { 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (!feof(f)) { 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fgets(buffer, SIZE, f); 38573ac1eebff620714c6977f7342ff8dcc4858b3cfMarco Nelissen if (strstr(buffer, " /storage/") || 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(buffer, " /system/sounds/") || 38702fa834249a01144d6f23137951538600aa5d611Dave Sparks strstr(buffer, " /data/") || 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(buffer, " /system/media/")) { 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" "); 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fclose(f); 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("couldn't open "); 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4000512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project DIR *d = opendir(buffer); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d) { 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct dirent *ent; 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while((ent = readdir(d)) != NULL) { 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { 4060512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct stat s; 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lstat(buffer, &s) == 0) { 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((s.st_mode & S_IFMT) == S_IFLNK) { 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char linkto[256]; 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int len = readlink(buffer, linkto, sizeof(linkto)); 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(len > 0) { 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(len > 255) { 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[252] = '.'; 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[253] = '.'; 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[254] = '.'; 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[255] = 0; 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[len] = 0; 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 42173ac1eebff620714c6977f7342ff8dcc4858b3cfMarco Nelissen if (strstr(linkto, "/storage/") == linkto || 42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(linkto, "/system/sounds/") == linkto || 42302fa834249a01144d6f23137951538600aa5d611Dave Sparks strstr(linkto, "/data/") == linkto || 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(linkto, "/system/media/") == linkto) { 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" "); 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" -> "); 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(linkto); 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" unexpected type for "); 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project closedir(d); 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("couldn't open "); 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool dumpMem = false; 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project for (size_t i = 0; i < args.size(); i++) { 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (args[i] == String16("-m")) { 45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project dumpMem = true; 45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (dumpMem) { 4548635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMemoryAddresses(fd); 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, result.string(), result.size()); 45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::removeClient(wp<Client> client) 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mClients.remove(client); 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas HuberMediaPlayerService::Client::Client( 4689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber const sp<MediaPlayerService>& service, pid_t pid, 4699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber int32_t connId, const sp<IMediaPlayerClient>& client, 4709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber int audioSessionId, uid_t uid) 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client(%d) constructor", connId); 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPid = pid; 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mConnId = connId; 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mService = service; 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mClient = client; 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLoop = false; 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStatus = NO_INIT; 479a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mAudioSessionId = audioSessionId; 4809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 481c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 482a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 484b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("create Antagonizer"); 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAntagonizer = new Antagonizer(notify, this); 48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::Client::~Client() 49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client(%d) destructor pid = %d", mConnId, mPid); 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioOutput.clear(); 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project wp<Client> client(this); 49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project disconnect(); 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mService->removeClient(client); 49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::Client::disconnect() 49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("disconnect(%d) from pid %d", mConnId, mPid); 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // grab local reference and clear main reference to prevent future 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // access to object 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p; 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mLock); 50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p = mPlayer; 50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 508795fa5848276bab87445fa64fd0941c13ef62398Dave Sparks mClient.clear(); 50920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPlayer.clear(); 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // clear the notification to prevent callbacks to dead client 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // and reset the player. We assume the player will serialize 51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // access to itself if necessary. 51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p != 0) { 51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->setNotifyCallback(0, 0); 51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 518b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("kill Antagonizer"); 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAntagonizer->kill(); 52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->reset(); 52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5247dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 5257dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->flushCommands(); 52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // determine if we have the right player type 53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = mPlayer; 53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((p != NULL) && (p->playerType() != playerType)) { 5343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("delete player"); 53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p.clear(); 53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == NULL) { 53844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p = MediaPlayerFactory::createPlayer(playerType, this, notify); 53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5409b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 541db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons if (p != NULL) { 542db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons p->setUID(mUID); 543db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons } 5449b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p; 54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 548c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmansp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre( 549c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman player_type playerType) 550c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman{ 551c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("player type = %d", playerType); 552c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 553c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // create the right type of player 554c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = createPlayer(playerType); 555c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 556c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return p; 557c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 558c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 559c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (!p->hardwareOutput()) { 560c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mAudioOutput = new AudioOutput(mAudioSessionId); 561c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 562c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 563c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 564c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return p; 565c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 566c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 567c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanvoid MediaPlayerService::Client::setDataSource_post( 568c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman const sp<MediaPlayerBase>& p, 569c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman status_t status) 570c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman{ 571c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV(" setDataSource"); 572c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mStatus = status; 573c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus != OK) { 574c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGE(" error: %d", mStatus); 575c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return; 576c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 577c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 578c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // Set the re-transmission endpoint if one was chosen. 579c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mRetransmitEndpointValid) { 580c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mStatus = p->setRetransmitEndpoint(&mRetransmitEndpoint); 581c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus != NO_ERROR) { 582c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGE("setRetransmitEndpoint error: %d", mStatus); 583c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 584c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 585c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 586c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus == OK) { 587c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mPlayer = p; 588c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 589c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 590c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 5912db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t MediaPlayerService::Client::setDataSource( 5922db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber const char *url, const KeyedVector<String8, String8> *headers) 59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDataSource(%s)", url); 59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (url == NULL) 59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 598d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if ((strncmp(url, "http://", 7) == 0) || 599d681bbb1767bed09415e050ba78975df214bcd68Dave Burke (strncmp(url, "https://", 8) == 0) || 600d681bbb1767bed09415e050ba78975df214bcd68Dave Burke (strncmp(url, "rtsp://", 7) == 0)) { 601d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if (!checkPermission("android.permission.INTERNET")) { 602d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return PERMISSION_DENIED; 603d681bbb1767bed09415e050ba78975df214bcd68Dave Burke } 604d681bbb1767bed09415e050ba78975df214bcd68Dave Burke } 605d681bbb1767bed09415e050ba78975df214bcd68Dave Burke 60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (strncmp(url, "content://", 10) == 0) { 60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // get a filedescriptor for the content Uri and 60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // pass it to the setDataSource(fd) method 60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String16 url16(url); 61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int fd = android::openContentProviderFile(url16); 61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (fd < 0) 61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 61429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Couldn't open fd for %s", url); 61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus 61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project close(fd); 61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 62144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, url); 622c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 623c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 624c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_INIT; 62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 627c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(url, headers)); 62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length) 63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); 63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct stat sb; 63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int ret = fstat(fd, &sb); 63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret != 0) { 63829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_dev = %llu", sb.st_dev); 6433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_mode = %u", sb.st_mode); 6443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_uid = %lu", sb.st_uid); 6453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_gid = %lu", sb.st_gid); 6463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_size = %llu", sb.st_size); 64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (offset >= sb.st_size) { 64929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("offset error"); 65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::close(fd); 65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (offset + length > sb.st_size) { 65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project length = sb.st_size - offset; 6553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("calculated length = %lld", length); 65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, 65944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman fd, 66044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman offset, 66144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman length); 662c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 663c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 664c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_INIT; 66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // now set data source 668c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(fd, offset, length)); 66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 672e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t MediaPlayerService::Client::setDataSource( 673e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber const sp<IStreamSource> &source) { 674e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // create the right type of player 67544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, source); 676c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 677e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (p == NULL) { 678e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return NO_INIT; 679e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 680e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 681e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // now set data source 682c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(source)); 683e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return mStatus; 684e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 685e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 6867dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennisvoid MediaPlayerService::Client::disconnectNativeWindow() { 6877dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (mConnectedWindow != NULL) { 6887dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = native_window_api_disconnect(mConnectedWindow.get(), 6897dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis NATIVE_WINDOW_API_MEDIA); 6907dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 6917dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err != OK) { 6925ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("native_window_api_disconnect returned an error: %s (%d)", 6937dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis strerror(-err), err); 6947dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 6957dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 6967dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindow.clear(); 6977dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis} 6987dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 6991173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t MediaPlayerService::Client::setVideoSurfaceTexture( 7001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ISurfaceTexture>& surfaceTexture) 7011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten{ 7023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setVideoSurfaceTexture(%p)", mConnId, surfaceTexture.get()); 7031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<MediaPlayerBase> p = getPlayer(); 7041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (p == 0) return UNKNOWN_ERROR; 7057dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7067dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis sp<IBinder> binder(surfaceTexture == NULL ? NULL : 7077dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis surfaceTexture->asBinder()); 7087dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (mConnectedWindowBinder == binder) { 7097dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return OK; 7107dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7117dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7127dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis sp<ANativeWindow> anw; 7137dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (surfaceTexture != NULL) { 7147dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis anw = new SurfaceTextureClient(surfaceTexture); 7157dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = native_window_api_connect(anw.get(), 7167dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis NATIVE_WINDOW_API_MEDIA); 7177dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7187dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err != OK) { 71929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoSurfaceTexture failed: %d", err); 7207dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Note that we must do the reset before disconnecting from the ANW. 7217dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Otherwise queue/dequeue calls could be made on the disconnected 7227dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // ANW, which may result in errors. 7237dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis reset(); 7247dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7257dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7267dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7277dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return err; 7287dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7297dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7307dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7317dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Note that we must set the player's new SurfaceTexture before 7327dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // disconnecting the old one. Otherwise queue/dequeue calls could be made 7337dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // on the disconnected ANW, which may result in errors. 7347dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = p->setVideoSurfaceTexture(surfaceTexture); 7357dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7367dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7377dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7387dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindow = anw; 7397dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7407dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err == OK) { 7417dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindowBinder = binder; 7427dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } else { 7437dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7447dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7457dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7467dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return err; 7471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 7481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 7491d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniastatus_t MediaPlayerService::Client::invoke(const Parcel& request, 7501d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania Parcel *reply) 7511d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania{ 7521d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania sp<MediaPlayerBase> p = getPlayer(); 7531d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania if (p == NULL) return UNKNOWN_ERROR; 7541d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania return p->invoke(request, reply); 7551d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania} 7561d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania 757a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// This call doesn't need to access the native player. 758a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniastatus_t MediaPlayerService::Client::setMetadataFilter(const Parcel& filter) 759a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 760a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania status_t status; 761a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata::Filter allow, drop; 762a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 7634829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (unmarshallFilter(filter, &allow, &status) && 7644829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania unmarshallFilter(filter, &drop, &status)) { 7654829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 766a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 767a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania mMetadataAllow = allow; 768a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania mMetadataDrop = drop; 769a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 770a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return status; 771a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 772a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 7734829038419910aa6e75ce8992d45a223452d5c67Nicolas Cataniastatus_t MediaPlayerService::Client::getMetadata( 7744829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania bool update_only, bool apply_filter, Parcel *reply) 7758e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania{ 776a64c8c79af1a15911c55306d83a797fa50969f77niko sp<MediaPlayerBase> player = getPlayer(); 777a64c8c79af1a15911c55306d83a797fa50969f77niko if (player == 0) return UNKNOWN_ERROR; 778d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 7798e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania status_t status; 780d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // Placeholder for the return code, updated by the caller. 781d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko reply->writeInt32(-1); 7824829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 783a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata::Filter ids; 7844829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 7854829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // We don't block notifications while we fetch the data. We clear 7864829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // mMetadataUpdated first so we don't lose notifications happening 7874829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // during the rest of this call. 7884829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania { 7894829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 7904829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (update_only) { 791d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko ids = mMetadataUpdated; 7924829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 7934829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania mMetadataUpdated.clear(); 7944829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 7958e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania 796a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata metadata(reply); 7974829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 798a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.appendHeader(); 799a64c8c79af1a15911c55306d83a797fa50969f77niko status = player->getMetadata(ids, reply); 800d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 801d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko if (status != OK) { 802a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.resetParcel(); 80329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getMetadata failed %d", status); 804d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko return status; 805d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko } 806d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 807d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // FIXME: Implement filtering on the result. Not critical since 808d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // filtering takes place on the update notifications already. This 809d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // would be when all the metadata are fetch and a filter is set. 810d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 811d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // Everything is fine, update the metadata length. 812a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.updateLength(); 813d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko return OK; 8148e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania} 8158e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania 81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::prepareAsync() 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] prepareAsync", mConnId); 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = p->prepareAsync(); 82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 823b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("start Antagonizer"); 82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) mAntagonizer->start(); 82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::start() 83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] start", mConnId); 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->setLooping(mLoop); 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->start(); 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::stop() 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] stop", mConnId); 84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->stop(); 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::pause() 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] pause", mConnId); 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->pause(); 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::isPlaying(bool* state) 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *state = false; 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *state = p->isPlaying(); 8603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] isPlaying: %d", mConnId, *state); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::getCurrentPosition(int *msec) 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getCurrentPosition"); 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = p->getCurrentPosition(msec); 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) { 8713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getCurrentPosition = %d", mConnId, *msec); 87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 87329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getCurrentPosition returned %d", ret); 87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::getDuration(int *msec) 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getDuration"); 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = p->getDuration(msec); 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) { 8853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getDuration = %d", mConnId, *msec); 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 88729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getDuration returned %d", ret); 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8926b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenstatus_t MediaPlayerService::Client::setNextPlayer(const sp<IMediaPlayer>& player) { 8936b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("setNextPlayer"); 8946b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen Mutex::Autolock l(mLock); 8956b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen sp<Client> c = static_cast<Client*>(player.get()); 8966b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextClient = c; 8976b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mAudioOutput != NULL && c != NULL) { 8986b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mAudioOutput->setNextOutput(c->mAudioOutput); 8996b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } else { 9006b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGE("no current audio output"); 9016b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 9026b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return OK; 9036b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 9046b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 9056b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::seekTo(int msec) 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] seekTo(%d)", mConnId, msec); 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->seekTo(msec); 91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::reset() 91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] reset", mConnId); 917c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->reset(); 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 923fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t MediaPlayerService::Client::setAudioStreamType(audio_stream_type_t type) 92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setAudioStreamType(%d)", mConnId, type); 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // TODO: for hardware output, call player instead 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mLock); 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioOutput != 0) mAudioOutput->setAudioStreamType(type); 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setLooping(int loop) 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setLooping(%d)", mConnId, loop); 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLoop = loop; 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p != 0) return p->setLooping(loop); 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setVolume(float leftVolume, float rightVolume) 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setVolume(%f, %f)", mConnId, leftVolume, rightVolume); 944761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman 945761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman // for hardware output, call player instead 946761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman sp<MediaPlayerBase> p = getPlayer(); 947761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman { 948761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman Mutex::Autolock l(mLock); 949761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman if (p != 0 && p->hardwareOutput()) { 950761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman MediaPlayerHWInterface* hwp = 951761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman reinterpret_cast<MediaPlayerHWInterface*>(p.get()); 952761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman return hwp->setVolume(leftVolume, rightVolume); 953761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } else { 954761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman if (mAudioOutput != 0) mAudioOutput->setVolume(leftVolume, rightVolume); 955761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman return NO_ERROR; 956761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } 957761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } 958761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9622beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::Client::setAuxEffectSendLevel(float level) 9632beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 9643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setAuxEffectSendLevel(%f)", mConnId, level); 9652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent Mutex::Autolock l(mLock); 9662beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mAudioOutput != 0) return mAudioOutput->setAuxEffectSendLevel(level); 9672beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 9682beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 9692beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 9702beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::Client::attachAuxEffect(int effectId) 9712beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 9723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] attachAuxEffect(%d)", mConnId, effectId); 9732beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent Mutex::Autolock l(mLock); 9742beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mAudioOutput != 0) return mAudioOutput->attachAuxEffect(effectId); 9752beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 9762beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 9774829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 9784f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayerService::Client::setParameter(int key, const Parcel &request) { 9793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setParameter(%d)", mConnId, key); 9804f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang sp<MediaPlayerBase> p = getPlayer(); 9814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang if (p == 0) return UNKNOWN_ERROR; 9824f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return p->setParameter(key, request); 9834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 9844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 9854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayerService::Client::getParameter(int key, Parcel *reply) { 9863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getParameter(%d)", mConnId, key); 9874f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang sp<MediaPlayerBase> p = getPlayer(); 9884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang if (p == 0) return UNKNOWN_ERROR; 9894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return p->getParameter(key, reply); 9904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 9914f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 992c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayerService::Client::setRetransmitEndpoint( 993c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman const struct sockaddr_in* endpoint) { 994c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 995c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (NULL != endpoint) { 996c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman uint32_t a = ntohl(endpoint->sin_addr.s_addr); 997c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman uint16_t p = ntohs(endpoint->sin_port); 998c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("[%d] setRetransmitEndpoint(%u.%u.%u.%u:%hu)", mConnId, 999c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman (a >> 24), (a >> 16) & 0xFF, (a >> 8) & 0xFF, (a & 0xFF), p); 1000c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } else { 1001c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("[%d] setRetransmitEndpoint = <none>", mConnId); 1002c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 1003c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1004c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = getPlayer(); 1005c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1006c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // Right now, the only valid time to set a retransmit endpoint is before 1007c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // player selection has been made (since the presence or absence of a 1008c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // retransmit endpoint is going to determine which player is selected during 1009c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // setDataSource). 1010c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p != 0) return INVALID_OPERATION; 1011c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1012c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (NULL != endpoint) { 1013c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpoint = *endpoint; 1014c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = true; 1015c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } else { 1016c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 1017c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 1018c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1019c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_ERROR; 1020c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 1021c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 102244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerService::Client::getRetransmitEndpoint( 102344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman struct sockaddr_in* endpoint) 102444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman{ 102544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (NULL == endpoint) 102644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return BAD_VALUE; 102744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 102844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sp<MediaPlayerBase> p = getPlayer(); 102944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 103044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (p != NULL) 103144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p->getRetransmitEndpoint(endpoint); 103244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 103344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!mRetransmitEndpointValid) 103444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return NO_INIT; 103544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 103644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *endpoint = mRetransmitEndpoint; 103744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 103844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return NO_ERROR; 103944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 104044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 1041b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayerService::Client::notify( 1042b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Client* client = static_cast<Client*>(cookie); 1045a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 10466b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen { 10476b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen Mutex::Autolock l(client->mLock); 10486b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) { 10496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen client->mAudioOutput->switchToNextOutput(); 10506b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen client->mNextClient->start(); 10516b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen client->mNextClient->mClient->notify(MEDIA_INFO, MEDIA_INFO_STARTED_AS_NEXT, 0, obj); 10526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 10536b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 10546b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 1055a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania if (MEDIA_INFO == msg && 10564829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania MEDIA_INFO_METADATA_UPDATE == ext1) { 1057a64c8c79af1a15911c55306d83a797fa50969f77niko const media::Metadata::Type metadata_type = ext2; 10584829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 10594829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if(client->shouldDropMetadata(metadata_type)) { 10604829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania return; 10614829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 10624829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 10634829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // Update the list of metadata that have changed. getMetadata 10644829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // also access mMetadataUpdated and clears it. 10654829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania client->addNewMetadataUpdate(metadata_type); 1066a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 10673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2); 1068b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang client->mClient->notify(msg, ext1, ext2, obj); 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10714829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1072a64c8c79af1a15911c55306d83a797fa50969f77nikobool MediaPlayerService::Client::shouldDropMetadata(media::Metadata::Type code) const 1073a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 10744829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 1075a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 10764829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (findMetadata(mMetadataDrop, code)) { 1077a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 1078a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1079a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 10804829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (mMetadataAllow.isEmpty() || findMetadata(mMetadataAllow, code)) { 1081a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 10824829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } else { 1083a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 1084a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1085a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 1086a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 10874829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1088a64c8c79af1a15911c55306d83a797fa50969f77nikovoid MediaPlayerService::Client::addNewMetadataUpdate(media::Metadata::Type metadata_type) { 10894829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 10904829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (mMetadataUpdated.indexOf(metadata_type) < 0) { 10914829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania mMetadataUpdated.add(metadata_type); 10924829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 10934829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania} 10944829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectconst int Antagonizer::interval = 10000; // 10 msecs 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectAntagonizer::Antagonizer(notify_callback_f cb, void* client) : 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mExit(false), mActive(false), mClient(client), mCb(cb) 110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project createThread(callbackThread, this); 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Antagonizer::kill() 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(mLock); 110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mActive = false; 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mExit = true; 110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.wait(mLock); 111089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint Antagonizer::callbackThread(void* user) 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1114b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Antagonizer started"); 111589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Antagonizer* p = reinterpret_cast<Antagonizer*>(user); 111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (!p->mExit) { 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p->mActive) { 11183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("send event"); 111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCb(p->mClient, 0, 0, 0); 112089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project usleep(interval); 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(p->mLock); 112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCondition.signal(); 1125b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Antagonizer stopped"); 112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic size_t kDefaultHeapSize = 1024 * 1024; // 1MB 113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1132e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kastensp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat) 113389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 11343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decode(%s)", url); 113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MemoryBase> mem; 113689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> player; 113789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 113889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Protect our precious, precious DRMd ringtones by only allowing 113989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // decoding of http, but not filesystem paths or content Uris. 114089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If the application wants to decode those, it should open a 114189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // filedescriptor for them and use that. 114289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (url != NULL && strncmp(url, "http://", 7) != 0) { 1143b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Can't decode %s by path, use filedescriptor instead", url); 114489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 114589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 114744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = 114844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman MediaPlayerFactory::getPlayerType(NULL /* client */, url); 11493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("player type = %d", playerType); 115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create the right type of player 115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AudioCache> cache = new AudioCache(url); 115344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player == NULL) goto Exit; 115589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->hardwareOutput()) goto Exit; 115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // set data source 116089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->setDataSource(url) != NO_ERROR) goto Exit; 116189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 116389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->prepareAsync(); 116489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for prepare"); 116689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (cache->wait() != NO_ERROR) goto Exit; 116789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 116989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->start(); 117089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for playback complete"); 11729cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent cache->wait(); 11739cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent // in case of error, return what was successfully decoded. 11749cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent if (cache->size() == 0) { 11759cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent goto Exit; 11769cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent } 117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 117889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pSampleRate = cache->sampleRate(); 118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pNumChannels = cache->channelCount(); 1181e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten *pFormat = cache->format(); 11823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectExit: 118589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player != 0) player->reset(); 118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 118789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 118889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1189e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kastensp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat) 119089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 11913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decode(%d, %lld, %lld)", fd, offset, length); 119289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MemoryBase> mem; 119389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> player; 119489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 119544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(NULL /* client */, 119644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman fd, 119744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman offset, 119844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman length); 11993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("player type = %d", playerType); 120089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 120189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create the right type of player 120289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AudioCache> cache = new AudioCache("decode_fd"); 120344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); 120489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player == NULL) goto Exit; 120589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->hardwareOutput()) goto Exit; 120689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 120789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 120989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // set data source 121089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; 121189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 121389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->prepareAsync(); 121489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for prepare"); 121689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (cache->wait() != NO_ERROR) goto Exit; 121789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 121989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->start(); 122089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for playback complete"); 12229cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent cache->wait(); 12239cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent // in case of error, return what was successfully decoded. 12249cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent if (cache->size() == 0) { 12259cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent goto Exit; 12269cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent } 122789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 122889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 122989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pSampleRate = cache->sampleRate(); 123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pNumChannels = cache->channelCount(); 123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pFormat = cache->format(); 12323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 123489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectExit: 123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player != 0) player->reset(); 123689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::close(fd); 123789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 123989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 124010dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen 124189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#undef LOG_TAG 124289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "AudioSink" 1243a514bdb58b5de4986679f72b7204b4764f7a2778Eric LaurentMediaPlayerService::AudioOutput::AudioOutput(int sessionId) 124420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCallback(NULL), 1245a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mCallbackCookie(NULL), 12466b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData(NULL), 12474110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mBytesWritten(0), 12481948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSessionId(sessionId), 12491948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mFlags(AUDIO_OUTPUT_FLAG_NONE) { 12503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AudioOutput(%d)", sessionId); 125189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = 0; 12526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = 0; 1253fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin mStreamType = AUDIO_STREAM_MUSIC; 125489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLeftVolume = 1.0; 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRightVolume = 1.0; 12567a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mPlaybackRatePermille = 1000; 12577a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mSampleRateHz = 0; 125889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame = 0; 12592beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId = 0; 12602beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mSendLevel = 0.0; 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 126289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 126389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::AudioOutput::~AudioOutput() 126589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 126689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project close(); 12676b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mRecycledTrack; 12686b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mCallbackData; 126989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 127089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 127189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::setMinBufferCount() 127289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 127389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 127489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (property_get("ro.kernel.qemu", value, 0)) { 127589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsOnEmulator = true; 127689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMinBufferCount = 12; // to prevent systematic buffer underrun for emulator 127789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 127889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 127989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayerService::AudioOutput::isOnEmulator() 128189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 128389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mIsOnEmulator; 128489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 128589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint MediaPlayerService::AudioOutput::getMinBufferCount() 128789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 128889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 128989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMinBufferCount; 129089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 129189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 129289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::bufferSize() const 129389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 129489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 129589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameCount() * frameSize(); 129689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 129789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 129889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::frameCount() const 129989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 130089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 130189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameCount(); 130289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 130389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::channelCount() const 130589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 130689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->channelCount(); 130889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 130989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 131089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::frameSize() const 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 131289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 131389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameSize(); 131489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 131689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectuint32_t MediaPlayerService::AudioOutput::latency () const 131789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1318db354e58e65592777aa17caa47933e14838b8b35Eric Laurent if (mTrack == 0) return 0; 1319db354e58e65592777aa17caa47933e14838b8b35Eric Laurent return mTrack->latency(); 132089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 132189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectfloat MediaPlayerService::AudioOutput::msecsPerFrame() const 132389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMsecsPerFrame; 132589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13274110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioOutput::getPosition(uint32_t *position) const 1328342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent{ 1329342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (mTrack == 0) return NO_INIT; 1330342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return mTrack->getPosition(position); 1331342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent} 1332342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 13334110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioOutput::getFramesWritten(uint32_t *frameswritten) const 13344110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen{ 13354110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (mTrack == 0) return NO_INIT; 13364110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen *frameswritten = mBytesWritten / frameSize(); 13374110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen return OK; 13384110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen} 13394110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 134020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t MediaPlayerService::AudioOutput::open( 1341786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 1342786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi audio_format_t format, int bufferCount, 13431948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent AudioCallback cb, void *cookie, 13441948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags) 134589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 134620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCallback = cb; 134720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCallbackCookie = cookie; 134820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 134989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Check argument "bufferCount" against the mininum buffer count 135089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (bufferCount < mMinBufferCount) { 1351b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("bufferCount (%d) is too small and increased to %d", bufferCount, mMinBufferCount); 135289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bufferCount = mMinBufferCount; 135389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1355786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGV("open(%u, %d, 0x%x, %d, %d, %d)", sampleRate, channelCount, channelMask, 1356786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi format, bufferCount, mSessionId); 135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int afSampleRate; 135889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int afFrameCount; 13591948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent uint32_t frameCount; 136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 136189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) { 136289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 136389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 136489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != NO_ERROR) { 136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 136920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1370786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) { 1371ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten channelMask = audio_channel_out_mask_from_count(channelCount); 1372786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi if (0 == channelMask) { 1373786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGE("open() error, can\'t derive mask for %d audio channels", channelCount); 1374786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi return NO_INIT; 1375786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi } 1376786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi } 13771948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 137867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen AudioTrack *t; 137967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen CallbackData *newcbd = NULL; 138067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen if (mCallback != NULL) { 138167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen newcbd = new CallbackData(this); 138267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen t = new AudioTrack( 138367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mStreamType, 138467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen sampleRate, 138567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen format, 138667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen channelMask, 138767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen frameCount, 138867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen flags, 138967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen CallbackWrapper, 139067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen newcbd, 139167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 0, // notification frames 139267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mSessionId); 139367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } else { 139467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen t = new AudioTrack( 139567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mStreamType, 139667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen sampleRate, 139767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen format, 139867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen channelMask, 139967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen frameCount, 140067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen flags, 140167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen NULL, 140267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen NULL, 140367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 0, 140467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mSessionId); 140567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } 140667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 140767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen if ((t == 0) || (t->initCheck() != NO_ERROR)) { 140867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGE("Unable to create audio track"); 140967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete t; 141067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete newcbd; 141167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen return NO_INIT; 141267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } 141367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 141467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 14156b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mRecycledTrack) { 14166b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // check if the existing track can be reused as-is, or if a new track needs to be created. 14176b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 14186b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen bool reuse = true; 14196b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if ((mCallbackData == NULL && mCallback != NULL) || 14206b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen (mCallbackData != NULL && mCallback == NULL)) { 14216b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // recycled track uses callbacks but the caller wants to use writes, or vice versa 14226b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("can't chain callback and write"); 14236b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen reuse = false; 14246b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } else if ((mRecycledTrack->getSampleRate() != sampleRate) || 14256b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen (mRecycledTrack->channelCount() != channelCount) || 142667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen (mRecycledTrack->frameCount() != t->frameCount())) { 142767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGV("samplerate, channelcount or framecount differ: %d/%d Hz, %d/%d ch, %d/%d frames", 142867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->getSampleRate(), sampleRate, 142967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->channelCount(), channelCount, 143067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->frameCount(), t->frameCount()); 14316b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen reuse = false; 143267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } else if (flags != mFlags) { 143367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGV("output flags differ %08x/%08x", flags, mFlags); 14341948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent reuse = false; 14356b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 14366b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (reuse) { 14376b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("chaining to next output"); 14386b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen close(); 14396b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mTrack = mRecycledTrack; 14406b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = NULL; 14416b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 14426b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->setOutput(this); 14436b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 144467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete t; 144567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete newcbd; 14466b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return OK; 14476b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 14486b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 14496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // if we're not going to reuse the track, unblock and flush it 14506b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 14516b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->setOutput(NULL); 14526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->endTrackSwitch(); 14536b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 14546b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack->flush(); 14556b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mRecycledTrack; 14566b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = NULL; 14576b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mCallbackData; 14586b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData = NULL; 14596b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen close(); 14606b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 1461786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi 146267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mCallbackData = newcbd; 14633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVolume"); 146489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project t->setVolume(mLeftVolume, mRightVolume); 14652beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 14667a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mSampleRateHz = sampleRate; 14671948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mFlags = flags; 14687a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mMsecsPerFrame = mPlaybackRatePermille / (float) sampleRate; 146999448608f375a7191c068c3bfd296f204b58a219Marco Nelissen uint32_t pos; 147099448608f375a7191c068c3bfd296f204b58a219Marco Nelissen if (t->getPosition(&pos) == OK) { 147199448608f375a7191c068c3bfd296f204b58a219Marco Nelissen mBytesWritten = uint64_t(pos) * t->frameSize(); 147299448608f375a7191c068c3bfd296f204b58a219Marco Nelissen } 147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = t; 14742beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 14757a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi status_t res = t->setSampleRate(mPlaybackRatePermille * mSampleRateHz / 1000); 14767a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (res != NO_ERROR) { 14777a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return res; 14787a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 14792beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent t->setAuxEffectSendLevel(mSendLevel); 14802beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return t->attachAuxEffect(mAuxEffectId);; 148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::start() 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 14853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 14866b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 14876b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->endTrackSwitch(); 14886b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) { 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->setVolume(mLeftVolume, mRightVolume); 14912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mTrack->setAuxEffectSendLevel(mSendLevel); 149289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->start(); 149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 149489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 149589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14966b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenvoid MediaPlayerService::AudioOutput::setNextOutput(const sp<AudioOutput>& nextOutput) { 14976b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput = nextOutput; 14986b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 14996b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 15007ee8ac94bb1a724a481a7cddf10ce63d35df6296Marco Nelissen 15016b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenvoid MediaPlayerService::AudioOutput::switchToNextOutput() { 15026b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("switchToNextOutput"); 15036b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mNextOutput != NULL) { 15046b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 15056b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->beginTrackSwitch(); 15066b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15076b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mNextOutput->mCallbackData; 15086b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mCallbackData = mCallbackData; 15096b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData = NULL; 15106b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mRecycledTrack = mTrack; 15116b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mTrack = NULL; 15126b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mSampleRateHz = mSampleRateHz; 15136b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mMsecsPerFrame = mMsecsPerFrame; 15144110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mNextOutput->mBytesWritten = mBytesWritten; 1515d791e094da5698c787f8db28ca5d5d490c512cf1Marco Nelissen mNextOutput->mFlags = mFlags; 15166b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15176b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 15187ee8ac94bb1a724a481a7cddf10ce63d35df6296Marco Nelissen 151989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::write(const void* buffer, size_t size) 152089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 152120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback."); 152220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("write(%p, %u)", buffer, size); 152410dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen if (mTrack) { 152510dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen ssize_t ret = mTrack->write(buffer, size); 15264110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mBytesWritten += ret; 152710dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen return ret; 152810dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen } 152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::stop() 153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stop"); 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->stop(); 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::flush() 153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("flush"); 154189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->flush(); 154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 154489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::pause() 154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("pause"); 154789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->pause(); 154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 154989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 155089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::close() 155189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("close"); 155389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mTrack; 155489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = 0; 155589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 155689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 155789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::setVolume(float left, float right) 155889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVolume(%f, %f)", left, right); 156089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLeftVolume = left; 156189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRightVolume = right; 156289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) { 156389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->setVolume(left, right); 156489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 156589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 156689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15677a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivistatus_t MediaPlayerService::AudioOutput::setPlaybackRatePermille(int32_t ratePermille) 15687a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi{ 15697a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi ALOGV("setPlaybackRatePermille(%d)", ratePermille); 15707a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi status_t res = NO_ERROR; 15717a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (mTrack) { 15727a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi res = mTrack->setSampleRate(ratePermille * mSampleRateHz / 1000); 15737a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } else { 15747a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi res = NO_INIT; 15757a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 15767a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mPlaybackRatePermille = ratePermille; 15777a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (mSampleRateHz != 0) { 15787a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mMsecsPerFrame = mPlaybackRatePermille / (float) mSampleRateHz; 15797a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 15807a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return res; 15817a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi} 15827a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi 15832beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::AudioOutput::setAuxEffectSendLevel(float level) 15842beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 15853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAuxEffectSendLevel(%f)", level); 15862beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mSendLevel = level; 15872beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mTrack) { 15882beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return mTrack->setAuxEffectSendLevel(level); 15892beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent } 15902beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 15912beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 15922beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 15932beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::AudioOutput::attachAuxEffect(int effectId) 15942beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 15953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("attachAuxEffect(%d)", effectId); 15962beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId = effectId; 15972beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mTrack) { 15982beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return mTrack->attachAuxEffect(effectId); 15992beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent } 16002beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 16012beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 16022beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 160320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 160420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaPlayerService::AudioOutput::CallbackWrapper( 1605d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kasten int event, void *cookie, void *info) { 16063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("callbackwrapper"); 160720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (event != AudioTrack::EVENT_MORE_DATA) { 160820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return; 160920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 161020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16116b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen CallbackData *data = (CallbackData*)cookie; 16126b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->lock(); 16136b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen AudioOutput *me = data->getOutput(); 161420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 16156b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (me == NULL) { 16166b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // no output set, likely because the track was scheduled to be reused 16176b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // by another player, but the format turned out to be incompatible. 16186b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->unlock(); 16196b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen buffer->size = 0; 16206b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return; 16216b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 162220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16237d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t actualSize = (*me->mCallback)( 162420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber me, buffer->raw, buffer->size, me->mCallbackCookie); 16257d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16266b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (actualSize == 0 && buffer->size > 0 && me->mNextOutput == NULL) { 162751c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber // We've reached EOS but the audio track is not stopped yet, 162851c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber // keep playing silence. 162951c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber 163051c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber memset(buffer->raw, 0, buffer->size); 163151c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber actualSize = buffer->size; 163251c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber } 16332e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 163451c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber buffer->size = actualSize; 16356b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->unlock(); 163620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 163720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16384110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint MediaPlayerService::AudioOutput::getSessionId() const 16398c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent{ 16408c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent return mSessionId; 16418c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent} 16428c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent 164389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#undef LOG_TAG 164489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "AudioCache" 164589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::AudioCache::AudioCache(const char* name) : 164689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mChannelCount(0), mFrameCount(1024), mSampleRate(0), mSize(0), 164789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mError(NO_ERROR), mCommandComplete(false) 164889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 164989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create ashmem heap 165089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mHeap = new MemoryHeapBase(kDefaultHeapSize, 0, name); 165189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 165289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 165389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectuint32_t MediaPlayerService::AudioCache::latency () const 165489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 165589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 165689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 165789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 165889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectfloat MediaPlayerService::AudioCache::msecsPerFrame() const 165989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 166089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMsecsPerFrame; 166189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 166289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16634110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) const 1664342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent{ 1665342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (position == 0) return BAD_VALUE; 1666342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *position = mSize; 1667342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1668342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent} 1669342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 16704110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioCache::getFramesWritten(uint32_t *written) const 16714110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen{ 16724110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (written == 0) return BAD_VALUE; 16734110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen *written = mSize; 16744110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen return NO_ERROR; 16754110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen} 16764110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 16777d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber//////////////////////////////////////////////////////////////////////////////// 16787d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16797d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberstruct CallbackThread : public Thread { 16807d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread(const wp<MediaPlayerBase::AudioSink> &sink, 16817d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback cb, 16827d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *cookie); 16837d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16847d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberprotected: 16857d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber virtual ~CallbackThread(); 16867d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16877d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber virtual bool threadLoop(); 16887d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16897d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberprivate: 16907d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber wp<MediaPlayerBase::AudioSink> mSink; 16917d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback mCallback; 16927d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *mCookie; 16937d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *mBuffer; 16947d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t mBufferSize; 16957d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16967d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread(const CallbackThread &); 16977d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread &operator=(const CallbackThread &); 16987d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber}; 16997d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17007d5b8a70c28c0d5746a600467b2887822dbff88eAndreas HuberCallbackThread::CallbackThread( 17017d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber const wp<MediaPlayerBase::AudioSink> &sink, 17027d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback cb, 17037d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *cookie) 17047d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber : mSink(sink), 17057d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallback(cb), 17067d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCookie(cookie), 17077d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer(NULL), 17087d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBufferSize(0) { 17097d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17107d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17117d5b8a70c28c0d5746a600467b2887822dbff88eAndreas HuberCallbackThread::~CallbackThread() { 17127d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mBuffer) { 17137d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber free(mBuffer); 17147d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer = NULL; 17157d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17167d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17177d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17187d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberbool CallbackThread::threadLoop() { 17197d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber sp<MediaPlayerBase::AudioSink> sink = mSink.promote(); 17207d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (sink == NULL) { 17217d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber return false; 17227d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17237d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17247d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mBuffer == NULL) { 17257d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBufferSize = sink->bufferSize(); 17267d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer = malloc(mBufferSize); 17277d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17287d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17297d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t actualSize = 17307d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber (*mCallback)(sink.get(), mBuffer, mBufferSize, mCookie); 17317d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17327d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (actualSize > 0) { 17337d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber sink->write(mBuffer, actualSize); 17347d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17357d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17367d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber return true; 17377d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17387d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17397d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber//////////////////////////////////////////////////////////////////////////////// 17407d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 174120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t MediaPlayerService::AudioCache::open( 1742786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 1743786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi audio_format_t format, int bufferCount, 17441948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent AudioCallback cb, void *cookie, audio_output_flags_t flags) 174589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1746786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGV("open(%u, %d, 0x%x, %d, %d)", sampleRate, channelCount, channelMask, format, bufferCount); 17478eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks if (mHeap->getHeapID() < 0) { 17488eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks return NO_INIT; 17498eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks } 175020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 175189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSampleRate = sampleRate; 175289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mChannelCount = (uint16_t)channelCount; 1753e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten mFormat = format; 175489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame = 1.e3 / (float) sampleRate; 17557d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17567d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (cb != NULL) { 17577d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread = new CallbackThread(this, cb, cookie); 17587d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 175989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 176089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 176189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17627d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubervoid MediaPlayerService::AudioCache::start() { 17637d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mCallbackThread != NULL) { 17647d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread->run("AudioCache callback"); 17657d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17667d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17677d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17687d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubervoid MediaPlayerService::AudioCache::stop() { 17697d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mCallbackThread != NULL) { 17707d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread->requestExitAndWait(); 17717d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17727d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17737d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 177489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) 177589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 17763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("write(%p, %u)", buffer, size); 177789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((buffer == 0) || (size == 0)) return size; 177889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 177989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint8_t* p = static_cast<uint8_t*>(mHeap->getBase()); 178089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == NULL) return NO_INIT; 178189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p += mSize; 17823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("memcpy(%p, %p, %u)", p, buffer, size); 178389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mSize + size > mHeap->getSize()) { 178429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize()); 178589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size = mHeap->getSize() - mSize; 178689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 178789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memcpy(p, buffer, size); 178889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSize += size; 178989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return size; 179089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 179189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 179289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// call with lock held 179389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioCache::wait() 179489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 179589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 17964bbc0ba371c52951191eff1cba7c1ea5d27ee976Dave Sparks while (!mCommandComplete) { 179789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSignal.wait(mLock); 179889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 179989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCommandComplete = false; 180089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 180189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mError == NO_ERROR) { 18023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait - success"); 180389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 18043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait - error"); 180589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 180689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mError; 180789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 180889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1809b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayerService::AudioCache::notify( 1810b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 181189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 18123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); 181389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project AudioCache* p = static_cast<AudioCache*>(cookie); 181489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 181589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // ignore buffering messages 18168eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks switch (msg) 18178eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks { 18188eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_ERROR: 181929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Error %d, %d occurred", ext1, ext2); 182089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mError = ext1; 18218eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18228eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_PREPARED: 18233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepared"); 18248eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18258eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_PLAYBACK_COMPLETE: 18263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("playback complete"); 18278eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18288eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks default: 18293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ignored"); 18308eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks return; 183189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 183289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 183389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // wake up thread 1834fe4c6f01646de47d41bbe3aa6d17c6a0daa2b730Dave Sparks Mutex::Autolock lock(p->mLock); 183589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCommandComplete = true; 183689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mSignal.signal(); 183789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 183889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18394110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint MediaPlayerService::AudioCache::getSessionId() const 18408c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent{ 18418c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent return 0; 18428c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent} 18438c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent 18447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid MediaPlayerService::addBatteryData(uint32_t params) 18457cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang{ 18467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Mutex::Autolock lock(mLock); 18479ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18489ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t time = systemTime() / 1000000L; 18499ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18509ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // change audio output devices. This notification comes from AudioFlinger 18519ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if ((params & kBatteryDataSpeakerOn) 18529ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang || (params & kBatteryDataOtherAudioDeviceOn)) { 18539ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18549ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int deviceOn[NUM_AUDIO_DEVICES]; 18559ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 18569ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[i] = 0; 18579ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18589ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18599ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if ((params & kBatteryDataSpeakerOn) 18609ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang && (params & kBatteryDataOtherAudioDeviceOn)) { 18619ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[SPEAKER_AND_OTHER] = 1; 18629ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else if (params & kBatteryDataSpeakerOn) { 18639ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[SPEAKER] = 1; 18649ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else { 18659ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[OTHER_AUDIO_DEVICE] = 1; 18669ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18679ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18689ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 18699ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i] != deviceOn[i]){ 18709ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18719ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount > 0) { // if playing audio 18729ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (!deviceOn[i]) { 18739ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] += time; 18749ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 18759ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 18769ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else { 18779ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0 - time; 18789ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18799ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18809ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18819ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[i] = deviceOn[i]; 18829ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18839ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18849ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 18859ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18869ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18879ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // an sudio stream is started 18889ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (params & kBatteryDataAudioFlingerStart) { 18899ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // record the start time only if currently no other audio 18909ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // is being played 18919ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount == 0) { 18929ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 18939ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i]) { 18949ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] -= time; 18959ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18969ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18979ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 18989ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 18999ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount ++; 19009ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19019ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19029ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else if (params & kBatteryDataAudioFlingerStop) { 19039ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount <= 0) { 19045ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Battery track warning: refCount is <= 0"); 19059ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19069ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19079ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19089ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // record the stop time only if currently this is the only 19099ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // audio being played 19109ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount == 1) { 19119ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19129ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i]) { 19139ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] += time; 19149ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 19159ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 19169ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19179ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19189ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19199ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19209ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount --; 19219ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19229ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19239ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int uid = IPCThreadState::self()->getCallingUid(); 19257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (uid == AID_MEDIA) { 19267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 19277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int index = mBatteryData.indexOfKey(uid); 19297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (index < 0) { // create a new entry for this UID 19317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo info; 19327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime = 0; 19337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime = 0; 19347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime = 0; 19357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime = 0; 19367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount = 0; 19377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19389ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryData.add(uid, info) == NO_MEMORY) { 193929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Battery track error: no memory for new app"); 19409ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19419ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19427cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19437cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo &info = mBatteryData.editValueFor(uid); 19457cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19467cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataCodecStarted) { 19477cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackAudio) { 19487cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime -= time; 19497cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount ++; 19507cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19517cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackVideo) { 19527cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime -= time; 19537cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount ++; 19547cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19557cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } else { 19567cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount == 0) { 19575ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Battery track warning: refCount is already 0"); 19587cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 19597cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } else if (info.refCount < 0) { 196029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Battery track error: refCount < 0"); 19617cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang mBatteryData.removeItem(uid); 19627cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 19637cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19647cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19657cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackAudio) { 19667cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime += time; 19677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount --; 19687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackVideo) { 19707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime += time; 19717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount --; 19727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang // no stream is being played by this UID 19757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount == 0) { 19767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime += info.audioLastTime; 19777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime = 0; 19787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime += info.videoLastTime; 19797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime = 0; 19807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 19837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangstatus_t MediaPlayerService::pullBatteryData(Parcel* reply) { 19857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Mutex::Autolock lock(mLock); 19869ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19879ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // audio output devices usage 19889ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t time = systemTime() / 1000000L; //in ms 19899ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t totalTime; 19909ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19919ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19929ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang totalTime = mBatteryAudio.totalTime[i]; 19939ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19949ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i] 19959ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang && (mBatteryAudio.lastTime[i] != 0)) { 19969ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t tmpTime = mBatteryAudio.lastTime[i] + time; 19979ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang totalTime += tmpTime; 19989ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19999ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20009ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang reply->writeInt32(totalTime); 20019ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // reset the total time 20029ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] = 0; 20039ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 20049ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20059ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // codec usage 20067cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo info; 20077cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int size = mBatteryData.size(); 20087cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20097cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(size); 20107cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int i = 0; 20117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang while (i < size) { 20137cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info = mBatteryData.valueAt(i); 20147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(mBatteryData.keyAt(i)); //UID 20167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(info.audioTotalTime); 20177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(info.videoTotalTime); 20187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime = 0; 20207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime = 0; 20217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang // remove the UID entry where no stream is being played 20237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount <= 0) { 20247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang mBatteryData.removeItemsAt(i); 20257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang size --; 20267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang i --; 20277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang i++; 20297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return NO_ERROR; 20317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 2032a64c8c79af1a15911c55306d83a797fa50969f77niko} // namespace android 2033