MediaPlayerService.cpp revision b019250df516e094b0cb648851f9a132b045378a
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 47e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown#include <media/IRemoteDisplay.h> 48e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown#include <media/IRemoteDisplayClient.h> 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/MediaPlayerInterface.h> 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediarecorder.h> 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/MediaMetadataRetrieverInterface.h> 52a64c8c79af1a15911c55306d83a797fa50969f77niko#include <media/Metadata.h> 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioTrack.h> 548635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#include <media/MemoryLeakTrackUtil.h> 559cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent#include <media/stagefright/MediaErrors.h> 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5764760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 58fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 597cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <private/android_filesystem_config.h> 607cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 61559bf2836f5da25b75bfb229fec0d20d540ee426James Dong#include "ActivityManager.h" 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MediaRecorderClient.h" 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MediaPlayerService.h" 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MetadataRetrieverClient.h" 6544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h" 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MidiFile.h" 6814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include "TestPlayerStub.h" 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "StagefrightPlayer.h" 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "nuplayer/NuPlayerDriver.h" 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX.h> 7314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 74ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include "Crypto.h" 75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include "RemoteDisplay.h" 76ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 77a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catanianamespace { 78a64c8c79af1a15911c55306d83a797fa50969f77nikousing android::media::Metadata; 79a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::status_t; 80a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::OK; 81a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::BAD_VALUE; 82a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::NOT_ENOUGH_DATA; 83a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniausing android::Parcel; 84a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 85a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Max number of entries in the filter. 86a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniaconst int kMaxFilterSize = 64; // I pulled that out of thin air. 87a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 88a64c8c79af1a15911c55306d83a797fa50969f77niko// FIXME: Move all the metadata related function in the Metadata.cpp 89d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 90a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 91a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Unmarshall a filter from a Parcel. 92a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// Filter format in a parcel: 93a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// 94a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas 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 95a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 96a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | number of entries (n) | 97a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 98a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type 1 | 99a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 100a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type 2 | 101a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 102a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// .... 103a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 104a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// | metadata type n | 105a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 106a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// 107a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param p Parcel that should start with a filter. 108a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param[out] filter On exit contains the list of metadata type to be 109a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// filtered. 110a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param[out] status On exit contains the status code to be returned. 111a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @return true if the parcel starts with a valid filter. 112a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniabool unmarshallFilter(const Parcel& p, 113a64c8c79af1a15911c55306d83a797fa50969f77niko Metadata::Filter *filter, 114a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania status_t *status) 115a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 1164829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania int32_t val; 1174829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (p.readInt32(&val) != OK) 118a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 11929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to read filter's length"); 120a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = NOT_ENOUGH_DATA; 121a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 122a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 123a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1244829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if( val > kMaxFilterSize || val < 0) 125a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 12629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Invalid filter len %d", val); 127a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = BAD_VALUE; 128a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 129a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 130a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1314829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania const size_t num = val; 132a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 133a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania filter->clear(); 1344829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania filter->setCapacity(num); 135a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 136a64c8c79af1a15911c55306d83a797fa50969f77niko size_t size = num * sizeof(Metadata::Type); 137a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1384829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1394829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (p.dataAvail() < size) 140a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 14129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Filter too short expected %d but got %d", size, p.dataAvail()); 142a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = NOT_ENOUGH_DATA; 143a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 144a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 145a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 146a64c8c79af1a15911c55306d83a797fa50969f77niko const Metadata::Type *data = 147a64c8c79af1a15911c55306d83a797fa50969f77niko static_cast<const Metadata::Type*>(p.readInplace(size)); 148a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1494829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (NULL == data) 150a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 15129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Filter had no data"); 152a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = BAD_VALUE; 153a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 154a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 155a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 156a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // TODO: The stl impl of vector would be more efficient here 157a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // because it degenerates into a memcpy on pod types. Try to 158a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // replace later or use stl::set. 1594829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania for (size_t i = 0; i < num; ++i) 160a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania { 1614829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania filter->add(*data); 162a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania ++data; 163a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 164a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania *status = OK; 165a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 166a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 167a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1684829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania// @param filter Of metadata type. 169a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @param val To be searched. 170a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// @return true if a match was found. 171a64c8c79af1a15911c55306d83a797fa50969f77nikobool findMetadata(const Metadata::Filter& filter, const int32_t val) 172a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 173a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania // Deal with empty and ANY right away 174a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania if (filter.isEmpty()) return false; 175a64c8c79af1a15911c55306d83a797fa50969f77niko if (filter[0] == Metadata::kAny) return true; 176a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1774829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania return filter.indexOf(val) >= 0; 178a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 179a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 180a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} // anonymous namespace 181a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 182a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 185d681bbb1767bed09415e050ba78975df214bcd68Dave Burkestatic bool checkPermission(const char* permissionString) { 186d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#ifndef HAVE_ANDROID_OS 187d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return true; 188d681bbb1767bed09415e050ba78975df214bcd68Dave Burke#endif 189d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 190d681bbb1767bed09415e050ba78975df214bcd68Dave Burke bool ok = checkCallingPermission(String16(permissionString)); 19129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block if (!ok) ALOGE("Request requires %s", permissionString); 192d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return ok; 193d681bbb1767bed09415e050ba78975df214bcd68Dave Burke} 194d681bbb1767bed09415e050ba78975df214bcd68Dave Burke 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// TODO: Find real cause of Audio/Video delay in PV framework and remove this workaround 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* static */ int MediaPlayerService::AudioOutput::mMinBufferCount = 4; 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* static */ bool MediaPlayerService::AudioOutput::mIsOnEmulator = false; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::instantiate() { 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project defaultServiceManager()->addService( 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String16("media.player"), new MediaPlayerService()); 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::MediaPlayerService() 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MediaPlayerService created"); 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mNextConnId = 1; 2089ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 2099ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount = 0; 2109ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 2119ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[i] = 0; 2129ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 2139ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] = 0; 2149ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 2159ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // speaker is on by default 2169ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[SPEAKER] = 1; 21744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 21844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman MediaPlayerFactory::registerBuiltinFactories(); 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::~MediaPlayerService() 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("MediaPlayerService destroyed"); 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaRecorder> MediaPlayerService::createMediaRecorder(pid_t pid) 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 228dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid); 229dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang wp<MediaRecorderClient> w = recorder; 230dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang Mutex::Autolock lock(mLock); 231dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaRecorderClients.add(w); 2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new media recorder client from pid %d", pid); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return recorder; 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 236dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wangvoid MediaPlayerService::removeMediaRecorderClient(wp<MediaRecorderClient> client) 237dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang{ 238dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang Mutex::Autolock lock(mLock); 239dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaRecorderClients.remove(client); 2403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Delete media recorder client"); 241dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang} 242dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaMetadataRetriever> MediaPlayerService::createMetadataRetriever(pid_t pid) 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MetadataRetrieverClient> retriever = new MetadataRetrieverClient(pid); 2463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new media retriever from pid %d", pid); 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return retriever; 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, 251d681bbb1767bed09415e050ba78975df214bcd68Dave Burke int audioSessionId) 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int32_t connId = android_atomic_inc(&mNextConnId); 2549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber sp<Client> c = new Client( 2569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber this, pid, connId, client, audioSessionId, 2579b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber IPCThreadState::self()->getCallingUid()); 2589b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 2593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid, 260d681bbb1767bed09415e050ba78975df214bcd68Dave Burke IPCThreadState::self()->getCallingUid()); 261e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 262d681bbb1767bed09415e050ba78975df214bcd68Dave Burke wp<Client> w = c; 263d681bbb1767bed09415e050ba78975df214bcd68Dave Burke { 264e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Mutex::Autolock lock(mLock); 265e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mClients.add(w); 266e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 267e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return c; 268e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 269e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMX> MediaPlayerService::getOMX() { 271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (mOMX.get() == NULL) { 274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOMX = new OMX; 275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mOMX; 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 280ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubersp<ICrypto> MediaPlayerService::makeCrypto() { 2811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return new Crypto; 282ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 283ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 284e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brownsp<IRemoteDisplay> MediaPlayerService::listenForRemoteDisplay( 285e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown const sp<IRemoteDisplayClient>& client, const String8& iface) { 286b019250df516e094b0cb648851f9a132b045378aJeff Brown if (!checkPermission("android.permission.CONTROL_WIFI_DISPLAY")) { 287b019250df516e094b0cb648851f9a132b045378aJeff Brown return NULL; 288b019250df516e094b0cb648851f9a132b045378aJeff Brown } 289b019250df516e094b0cb648851f9a132b045378aJeff Brown 290455d02eca342d8159637af317a5d83219d267812Jeff Brown return new RemoteDisplay(client, iface.string()); 291e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown} 292e104596061b219e9bce6d4db49a9d15242f8d2e5Jeff Brown 293b019250df516e094b0cb648851f9a132b045378aJeff Brown// TODO: delete this method 294bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huberstatus_t MediaPlayerService::enableRemoteDisplay(const char *iface) { 295b019250df516e094b0cb648851f9a132b045378aJeff Brown if (!checkPermission("android.permission.CONTROL_WIFI_DISPLAY")) { 296b019250df516e094b0cb648851f9a132b045378aJeff Brown return PERMISSION_DENIED; 297b019250df516e094b0cb648851f9a132b045378aJeff Brown } 298b019250df516e094b0cb648851f9a132b045378aJeff Brown 299d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex::Autolock autoLock(mLock); 300d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 301bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber if (iface != NULL) { 302bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber if (mRemoteDisplay != NULL) { 303bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber return INVALID_OPERATION; 304bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber } 305bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber 3060b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber mRemoteDisplay = new RemoteDisplay(NULL /* client */, iface); 307d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 308bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber } 309bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber 310bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber if (mRemoteDisplay != NULL) { 311455d02eca342d8159637af317a5d83219d267812Jeff Brown mRemoteDisplay->dispose(); 312d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mRemoteDisplay.clear(); 313d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 314d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 315d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 316d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 317d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& args) const 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" AudioCache\n"); 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mHeap != 0) { 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " heap base(%p), size(%d), flags(%d), device(%s)\n", 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mHeap->getBase(), mHeap->getSize(), mHeap->getFlags(), mHeap->getDevice()); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " msec per frame(%f), channel count(%d), format(%d), frame count(%ld)\n", 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame, mChannelCount, mFormat, mFrameCount); 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " sample rate(%d), size(%d), error(%d), command complete(%s)\n", 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSampleRate, mSize, mError, mCommandComplete?"true":"false"); 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::write(fd, result.string(), result.size()); 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioOutput::dump(int fd, const Vector<String16>& args) const 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" AudioOutput\n"); 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType, mLeftVolume, mRightVolume); 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " msec per frame(%f), latency (%d)\n", 351db354e58e65592777aa17caa47933e14838b8b35Eric Laurent mMsecsPerFrame, (mTrack != 0) ? mTrack->latency() : -1); 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 3532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent snprintf(buffer, 255, " aux effect id(%d), send level (%f)\n", 3542beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId, mSendLevel); 3552beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent result.append(buffer); 3562beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::write(fd, result.string(), result.size()); 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack != 0) { 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->dump(fd, args); 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) const 36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" Client\n"); 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPid, mConnId, mStatus, mLoop?"true": "false"); 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, result.string(), result.size()); 374a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber if (mPlayer != NULL) { 375a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber mPlayer->dump(fd, args); 376a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber } 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioOutput != 0) { 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioOutput->dump(fd, args); 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, "\n", 1); 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::dump(int fd, const Vector<String16>& args) 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const size_t SIZE = 256; 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char buffer[SIZE]; 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String8 result; 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project snprintf(buffer, SIZE, "Permission Denial: " 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "can't dump MediaPlayerService from pid=%d, uid=%d\n", 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->getCallingPid(), 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->getCallingUid()); 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project for (int i = 0, n = mClients.size(); i < n; ++i) { 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<Client> c = mClients[i].promote(); 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (c != 0) c->dump(fd, args); 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 401b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong if (mMediaRecorderClients.size() == 0) { 402b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong result.append(" No media recorder client\n\n"); 403b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong } else { 404b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) { 405b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote(); 406e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong if (c != 0) { 407e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid); 408e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong result.append(buffer); 409e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong write(fd, result.string(), result.size()); 410e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong result = "\n"; 411e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong c->dump(fd, args); 412e579e28089c6b86f56d257030b778c5e22b1a5a5James Dong } 413b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong } 414dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang } 415dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" Files opened and/or mapped:\n"); 4170512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FILE *f = fopen(buffer, "r"); 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (f) { 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (!feof(f)) { 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fgets(buffer, SIZE, f); 42273ac1eebff620714c6977f7342ff8dcc4858b3cfMarco Nelissen if (strstr(buffer, " /storage/") || 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(buffer, " /system/sounds/") || 42402fa834249a01144d6f23137951538600aa5d611Dave Sparks strstr(buffer, " /data/") || 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(buffer, " /system/media/")) { 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" "); 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fclose(f); 43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("couldn't open "); 43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4370512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); 43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project DIR *d = opendir(buffer); 43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d) { 44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct dirent *ent; 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while((ent = readdir(d)) != NULL) { 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { 4430512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct stat s; 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lstat(buffer, &s) == 0) { 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((s.st_mode & S_IFMT) == S_IFLNK) { 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char linkto[256]; 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int len = readlink(buffer, linkto, sizeof(linkto)); 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(len > 0) { 45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(len > 255) { 45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[252] = '.'; 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[253] = '.'; 45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[254] = '.'; 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[255] = 0; 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project linkto[len] = 0; 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45873ac1eebff620714c6977f7342ff8dcc4858b3cfMarco Nelissen if (strstr(linkto, "/storage/") == linkto || 45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(linkto, "/system/sounds/") == linkto || 46002fa834249a01144d6f23137951538600aa5d611Dave Sparks strstr(linkto, "/data/") == linkto || 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project strstr(linkto, "/system/media/") == linkto) { 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" "); 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" -> "); 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(linkto); 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(" unexpected type for "); 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project closedir(d); 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("couldn't open "); 48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append(buffer); 48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result.append("\n"); 48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool dumpMem = false; 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project for (size_t i = 0; i < args.size(); i++) { 48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (args[i] == String16("-m")) { 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project dumpMem = true; 48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (dumpMem) { 4918635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMemoryAddresses(fd); 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project write(fd, result.string(), result.size()); 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::removeClient(wp<Client> client) 49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mClients.remove(client); 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5049b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas HuberMediaPlayerService::Client::Client( 5059b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber const sp<MediaPlayerService>& service, pid_t pid, 5069b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber int32_t connId, const sp<IMediaPlayerClient>& client, 5079b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber int audioSessionId, uid_t uid) 50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client(%d) constructor", connId); 51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPid = pid; 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mConnId = connId; 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mService = service; 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mClient = client; 51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLoop = false; 51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStatus = NO_INIT; 516a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mAudioSessionId = audioSessionId; 5179b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 518c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 519a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent 52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 521b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("create Antagonizer"); 52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAntagonizer = new Antagonizer(notify, this); 52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::Client::~Client() 52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client(%d) destructor pid = %d", mConnId, mPid); 52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioOutput.clear(); 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project wp<Client> client(this); 53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project disconnect(); 53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mService->removeClient(client); 53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::Client::disconnect() 53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("disconnect(%d) from pid %d", mConnId, mPid); 53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // grab local reference and clear main reference to prevent future 53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // access to object 54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p; 54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mLock); 54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p = mPlayer; 54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 545795fa5848276bab87445fa64fd0941c13ef62398Dave Sparks mClient.clear(); 54620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPlayer.clear(); 54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // clear the notification to prevent callbacks to dead client 55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // and reset the player. We assume the player will serialize 55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // access to itself if necessary. 55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p != 0) { 55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->setNotifyCallback(0, 0); 55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 555b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("kill Antagonizer"); 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAntagonizer->kill(); 55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->reset(); 55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5617dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 5627dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project IPCThreadState::self()->flushCommands(); 56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) 56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // determine if we have the right player type 56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = mPlayer; 57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((p != NULL) && (p->playerType() != playerType)) { 5713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("delete player"); 57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p.clear(); 57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == NULL) { 57544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p = MediaPlayerFactory::createPlayer(playerType, this, notify); 57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 578db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons if (p != NULL) { 579db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons p->setUID(mUID); 580db29e5238e28d59978755a2ff2e7e0f05393abdfJason Simmons } 5819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p; 58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 585c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmansp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre( 586c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman player_type playerType) 587c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman{ 588c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("player type = %d", playerType); 589c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 590c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // create the right type of player 591c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = createPlayer(playerType); 592c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 593c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return p; 594c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 595c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 596c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (!p->hardwareOutput()) { 597c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mAudioOutput = new AudioOutput(mAudioSessionId); 598c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); 599c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 600c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 601c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return p; 602c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 603c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 604c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanvoid MediaPlayerService::Client::setDataSource_post( 605c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman const sp<MediaPlayerBase>& p, 606c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman status_t status) 607c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman{ 608c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV(" setDataSource"); 609c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mStatus = status; 610c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus != OK) { 611c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGE(" error: %d", mStatus); 612c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return; 613c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 614c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 615c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // Set the re-transmission endpoint if one was chosen. 616c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mRetransmitEndpointValid) { 617c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mStatus = p->setRetransmitEndpoint(&mRetransmitEndpoint); 618c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus != NO_ERROR) { 619c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGE("setRetransmitEndpoint error: %d", mStatus); 620c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 621c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 622c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 623c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (mStatus == OK) { 624c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mPlayer = p; 625c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 626c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 627c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 6282db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t MediaPlayerService::Client::setDataSource( 6292db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber const char *url, const KeyedVector<String8, String8> *headers) 63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDataSource(%s)", url); 63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (url == NULL) 63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 635d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if ((strncmp(url, "http://", 7) == 0) || 636d681bbb1767bed09415e050ba78975df214bcd68Dave Burke (strncmp(url, "https://", 8) == 0) || 637d681bbb1767bed09415e050ba78975df214bcd68Dave Burke (strncmp(url, "rtsp://", 7) == 0)) { 638d681bbb1767bed09415e050ba78975df214bcd68Dave Burke if (!checkPermission("android.permission.INTERNET")) { 639d681bbb1767bed09415e050ba78975df214bcd68Dave Burke return PERMISSION_DENIED; 640d681bbb1767bed09415e050ba78975df214bcd68Dave Burke } 641d681bbb1767bed09415e050ba78975df214bcd68Dave Burke } 642d681bbb1767bed09415e050ba78975df214bcd68Dave Burke 64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (strncmp(url, "content://", 10) == 0) { 64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // get a filedescriptor for the content Uri and 64589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // pass it to the setDataSource(fd) method 64689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project String16 url16(url); 64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int fd = android::openContentProviderFile(url16); 64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (fd < 0) 65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 65129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Couldn't open fd for %s", url); 65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus 65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project close(fd); 65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 65844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, url); 659c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 660c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 661c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_INIT; 66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 664c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(url, headers)); 66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length) 67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); 67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project struct stat sb; 67389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int ret = fstat(fd, &sb); 67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret != 0) { 67529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); 67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 67789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_dev = %llu", sb.st_dev); 6803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_mode = %u", sb.st_mode); 6813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_uid = %lu", sb.st_uid); 6823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_gid = %lu", sb.st_gid); 6833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("st_size = %llu", sb.st_size); 68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (offset >= sb.st_size) { 68629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("offset error"); 68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::close(fd); 68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (offset + length > sb.st_size) { 69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project length = sb.st_size - offset; 6923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("calculated length = %lld", length); 69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 69544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, 69644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman fd, 69744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman offset, 69844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman length); 699c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 700c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p == NULL) { 701c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_INIT; 70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 70489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // now set data source 705c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(fd, offset, length)); 70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mStatus; 70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 70889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 709e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t MediaPlayerService::Client::setDataSource( 710e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber const sp<IStreamSource> &source) { 711e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // create the right type of player 71244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(this, source); 713c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = setDataSource_pre(playerType); 714e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (p == NULL) { 715e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return NO_INIT; 716e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 717e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 718e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // now set data source 719c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman setDataSource_post(p, p->setDataSource(source)); 720e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return mStatus; 721e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 722e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 7237dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennisvoid MediaPlayerService::Client::disconnectNativeWindow() { 7247dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (mConnectedWindow != NULL) { 7257dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = native_window_api_disconnect(mConnectedWindow.get(), 7267dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis NATIVE_WINDOW_API_MEDIA); 7277dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7287dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err != OK) { 7295ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("native_window_api_disconnect returned an error: %s (%d)", 7307dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis strerror(-err), err); 7317dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7327dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7337dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindow.clear(); 7347dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis} 7357dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7361173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t MediaPlayerService::Client::setVideoSurfaceTexture( 7371173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ISurfaceTexture>& surfaceTexture) 7381173118eace0e9e347cb007f0da817cee87579edGlenn Kasten{ 7393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setVideoSurfaceTexture(%p)", mConnId, surfaceTexture.get()); 7401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<MediaPlayerBase> p = getPlayer(); 7411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten if (p == 0) return UNKNOWN_ERROR; 7427dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7437dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis sp<IBinder> binder(surfaceTexture == NULL ? NULL : 7447dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis surfaceTexture->asBinder()); 7457dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (mConnectedWindowBinder == binder) { 7467dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return OK; 7477dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7487dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7497dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis sp<ANativeWindow> anw; 7507dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (surfaceTexture != NULL) { 7517dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis anw = new SurfaceTextureClient(surfaceTexture); 7527dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = native_window_api_connect(anw.get(), 7537dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis NATIVE_WINDOW_API_MEDIA); 7547dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7557dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err != OK) { 75629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoSurfaceTexture failed: %d", err); 7577dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Note that we must do the reset before disconnecting from the ANW. 7587dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Otherwise queue/dequeue calls could be made on the disconnected 7597dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // ANW, which may result in errors. 7607dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis reset(); 7617dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7627dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7637dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7647dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return err; 7657dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7667dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7677dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7687dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // Note that we must set the player's new SurfaceTexture before 7697dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // disconnecting the old one. Otherwise queue/dequeue calls could be made 7707dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis // on the disconnected ANW, which may result in errors. 7717dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis status_t err = p->setVideoSurfaceTexture(surfaceTexture); 7727dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7737dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7747dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7757dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindow = anw; 7767dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7777dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis if (err == OK) { 7787dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis mConnectedWindowBinder = binder; 7797dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } else { 7807dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis disconnectNativeWindow(); 7817dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis } 7827dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis 7837dae00baa6e8957be15523c46bb948bd1dde64c3Jamie Gennis return err; 7841173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 7851173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 7861d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniastatus_t MediaPlayerService::Client::invoke(const Parcel& request, 7871d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania Parcel *reply) 7881d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania{ 7891d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania sp<MediaPlayerBase> p = getPlayer(); 7901d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania if (p == NULL) return UNKNOWN_ERROR; 7911d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania return p->invoke(request, reply); 7921d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania} 7931d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania 794a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania// This call doesn't need to access the native player. 795a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Cataniastatus_t MediaPlayerService::Client::setMetadataFilter(const Parcel& filter) 796a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 797a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania status_t status; 798a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata::Filter allow, drop; 799a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 8004829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (unmarshallFilter(filter, &allow, &status) && 8014829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania unmarshallFilter(filter, &drop, &status)) { 8024829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 803a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 804a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania mMetadataAllow = allow; 805a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania mMetadataDrop = drop; 806a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 807a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return status; 808a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 809a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 8104829038419910aa6e75ce8992d45a223452d5c67Nicolas Cataniastatus_t MediaPlayerService::Client::getMetadata( 8114829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania bool update_only, bool apply_filter, Parcel *reply) 8128e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania{ 813a64c8c79af1a15911c55306d83a797fa50969f77niko sp<MediaPlayerBase> player = getPlayer(); 814a64c8c79af1a15911c55306d83a797fa50969f77niko if (player == 0) return UNKNOWN_ERROR; 815d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 8168e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania status_t status; 817d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // Placeholder for the return code, updated by the caller. 818d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko reply->writeInt32(-1); 8194829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 820a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata::Filter ids; 8214829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 8224829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // We don't block notifications while we fetch the data. We clear 8234829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // mMetadataUpdated first so we don't lose notifications happening 8244829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // during the rest of this call. 8254829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania { 8264829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 8274829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (update_only) { 828d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko ids = mMetadataUpdated; 8294829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 8304829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania mMetadataUpdated.clear(); 8314829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 8328e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania 833a64c8c79af1a15911c55306d83a797fa50969f77niko media::Metadata metadata(reply); 8344829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 835a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.appendHeader(); 836a64c8c79af1a15911c55306d83a797fa50969f77niko status = player->getMetadata(ids, reply); 837d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 838d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko if (status != OK) { 839a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.resetParcel(); 84029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getMetadata failed %d", status); 841d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko return status; 842d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko } 843d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 844d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // FIXME: Implement filtering on the result. Not critical since 845d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // filtering takes place on the update notifications already. This 846d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // would be when all the metadata are fetch and a filter is set. 847d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko 848d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko // Everything is fine, update the metadata length. 849a64c8c79af1a15911c55306d83a797fa50969f77niko metadata.updateLength(); 850d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko return OK; 8518e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania} 8528e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::prepareAsync() 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] prepareAsync", mConnId); 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = p->prepareAsync(); 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 860b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("start Antagonizer"); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) mAntagonizer->start(); 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::start() 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] start", mConnId); 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->setLooping(mLoop); 87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->start(); 87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::stop() 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] stop", mConnId); 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->stop(); 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::pause() 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] pause", mConnId); 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->pause(); 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::isPlaying(bool* state) 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *state = false; 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *state = p->isPlaying(); 8973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] isPlaying: %d", mConnId, *state); 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::getCurrentPosition(int *msec) 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getCurrentPosition"); 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = p->getCurrentPosition(msec); 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) { 9083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getCurrentPosition = %d", mConnId, *msec); 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 91029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getCurrentPosition returned %d", ret); 91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::getDuration(int *msec) 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getDuration"); 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 status_t ret = p->getDuration(msec); 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret == NO_ERROR) { 9223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getDuration = %d", mConnId, *msec); 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 92429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getDuration returned %d", ret); 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9296b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenstatus_t MediaPlayerService::Client::setNextPlayer(const sp<IMediaPlayer>& player) { 9306b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("setNextPlayer"); 9316b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen Mutex::Autolock l(mLock); 9326b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen sp<Client> c = static_cast<Client*>(player.get()); 9336b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextClient = c; 9342e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman 9352e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman if (c != NULL) { 9362e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman if (mAudioOutput != NULL) { 9372e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman mAudioOutput->setNextOutput(c->mAudioOutput); 9382e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman } else if ((mPlayer != NULL) && !mPlayer->hardwareOutput()) { 9392e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman ALOGE("no current audio output"); 9402e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman } 9412e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman 9422e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman if ((mPlayer != NULL) && (mNextClient->getPlayer() != NULL)) { 9432e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman mPlayer->setNextPlayer(mNextClient->getPlayer()); 9442e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman } 9456b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 9462e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman 9476b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return OK; 9486b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 9496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::seekTo(int msec) 95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] seekTo(%d)", mConnId, msec); 95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->seekTo(msec); 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::reset() 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] reset", mConnId); 961c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == 0) return UNKNOWN_ERROR; 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return p->reset(); 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 967fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t MediaPlayerService::Client::setAudioStreamType(audio_stream_type_t type) 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setAudioStreamType(%d)", mConnId, type); 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // TODO: for hardware output, call player instead 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mLock); 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioOutput != 0) mAudioOutput->setAudioStreamType(type); 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setLooping(int loop) 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setLooping(%d)", mConnId, loop); 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLoop = loop; 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> p = getPlayer(); 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p != 0) return p->setLooping(loop); 98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::Client::setVolume(float leftVolume, float rightVolume) 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setVolume(%f, %f)", mConnId, leftVolume, rightVolume); 988761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman 989761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman // for hardware output, call player instead 990761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman sp<MediaPlayerBase> p = getPlayer(); 991761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman { 992761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman Mutex::Autolock l(mLock); 993761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman if (p != 0 && p->hardwareOutput()) { 994761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman MediaPlayerHWInterface* hwp = 995761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman reinterpret_cast<MediaPlayerHWInterface*>(p.get()); 996761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman return hwp->setVolume(leftVolume, rightVolume); 997761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } else { 998761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman if (mAudioOutput != 0) mAudioOutput->setVolume(leftVolume, rightVolume); 999761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman return NO_ERROR; 1000761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } 1001761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman } 1002761defc341c5ce9019a42919c441f035f665ec0dJohn Grossman 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10062beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::Client::setAuxEffectSendLevel(float level) 10072beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 10083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setAuxEffectSendLevel(%f)", mConnId, level); 10092beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent Mutex::Autolock l(mLock); 10102beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mAudioOutput != 0) return mAudioOutput->setAuxEffectSendLevel(level); 10112beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 10122beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 10132beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 10142beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::Client::attachAuxEffect(int effectId) 10152beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 10163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] attachAuxEffect(%d)", mConnId, effectId); 10172beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent Mutex::Autolock l(mLock); 10182beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mAudioOutput != 0) return mAudioOutput->attachAuxEffect(effectId); 10192beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 10202beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 10214829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 10224f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayerService::Client::setParameter(int key, const Parcel &request) { 10233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] setParameter(%d)", mConnId, key); 10244f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang sp<MediaPlayerBase> p = getPlayer(); 10254f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang if (p == 0) return UNKNOWN_ERROR; 10264f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return p->setParameter(key, request); 10274f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 10284f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 10294f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t MediaPlayerService::Client::getParameter(int key, Parcel *reply) { 10303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%d] getParameter(%d)", mConnId, key); 10314f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang sp<MediaPlayerBase> p = getPlayer(); 10324f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang if (p == 0) return UNKNOWN_ERROR; 10334f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return p->getParameter(key, reply); 10344f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 10354f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 1036c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstatus_t MediaPlayerService::Client::setRetransmitEndpoint( 1037c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman const struct sockaddr_in* endpoint) { 1038c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1039c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (NULL != endpoint) { 1040c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman uint32_t a = ntohl(endpoint->sin_addr.s_addr); 1041c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman uint16_t p = ntohs(endpoint->sin_port); 1042c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("[%d] setRetransmitEndpoint(%u.%u.%u.%u:%hu)", mConnId, 1043c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman (a >> 24), (a >> 16) & 0xFF, (a >> 8) & 0xFF, (a & 0xFF), p); 1044c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } else { 1045c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman ALOGV("[%d] setRetransmitEndpoint = <none>", mConnId); 1046c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 1047c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1048c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman sp<MediaPlayerBase> p = getPlayer(); 1049c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1050c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // Right now, the only valid time to set a retransmit endpoint is before 1051c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // player selection has been made (since the presence or absence of a 1052c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // retransmit endpoint is going to determine which player is selected during 1053c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman // setDataSource). 1054c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (p != 0) return INVALID_OPERATION; 1055c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1056c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman if (NULL != endpoint) { 1057c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpoint = *endpoint; 1058c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = true; 1059c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } else { 1060c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman mRetransmitEndpointValid = false; 1061c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman } 1062c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 1063c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman return NO_ERROR; 1064c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman} 1065c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman 106644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerService::Client::getRetransmitEndpoint( 106744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman struct sockaddr_in* endpoint) 106844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman{ 106944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (NULL == endpoint) 107044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return BAD_VALUE; 107144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 107244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sp<MediaPlayerBase> p = getPlayer(); 107344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 107444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (p != NULL) 107544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p->getRetransmitEndpoint(endpoint); 107644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 107744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!mRetransmitEndpointValid) 107844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return NO_INIT; 107944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 108044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *endpoint = mRetransmitEndpoint; 108144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 108244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return NO_ERROR; 108344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 108444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 1085b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayerService::Client::notify( 1086b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Client* client = static_cast<Client*>(cookie); 1089b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong if (client == NULL) { 1090b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong return; 1091b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong } 1092a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1093b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong sp<IMediaPlayerClient> c; 10946b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen { 10956b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen Mutex::Autolock l(client->mLock); 1096b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong c = client->mClient; 10976b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) { 1098cb0b755efc2cd24703f400729994900bf2117f66John Grossman if (client->mAudioOutput != NULL) 1099cb0b755efc2cd24703f400729994900bf2117f66John Grossman client->mAudioOutput->switchToNextOutput(); 11006b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen client->mNextClient->start(); 11016b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen client->mNextClient->mClient->notify(MEDIA_INFO, MEDIA_INFO_STARTED_AS_NEXT, 0, obj); 11026b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 11036b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 11046b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 1105a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania if (MEDIA_INFO == msg && 11064829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania MEDIA_INFO_METADATA_UPDATE == ext1) { 1107a64c8c79af1a15911c55306d83a797fa50969f77niko const media::Metadata::Type metadata_type = ext2; 11084829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 11094829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if(client->shouldDropMetadata(metadata_type)) { 11104829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania return; 11114829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 11124829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 11134829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // Update the list of metadata that have changed. getMetadata 11144829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania // also access mMetadataUpdated and clears it. 11154829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania client->addNewMetadataUpdate(metadata_type); 1116a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1117b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong 1118b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong if (c != NULL) { 1119b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong ALOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2); 1120b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong c->notify(msg, ext1, ext2, obj); 1121b8a9825bf0f5c74333b0e4ff5ba7677ac6fd2a25James Dong } 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11244829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1125a64c8c79af1a15911c55306d83a797fa50969f77nikobool MediaPlayerService::Client::shouldDropMetadata(media::Metadata::Type code) const 1126a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania{ 11274829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 1128a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 11294829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (findMetadata(mMetadataDrop, code)) { 1130a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 1131a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1132a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 11334829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (mMetadataAllow.isEmpty() || findMetadata(mMetadataAllow, code)) { 1134a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return false; 11354829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } else { 1136a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return true; 1137a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1138a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania} 1139a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 11404829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 1141a64c8c79af1a15911c55306d83a797fa50969f77nikovoid MediaPlayerService::Client::addNewMetadataUpdate(media::Metadata::Type metadata_type) { 11424829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania Mutex::Autolock lock(mLock); 11434829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania if (mMetadataUpdated.indexOf(metadata_type) < 0) { 11444829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania mMetadataUpdated.add(metadata_type); 11454829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania } 11464829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania} 11474829038419910aa6e75ce8992d45a223452d5c67Nicolas Catania 114889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#if CALLBACK_ANTAGONIZER 114989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectconst int Antagonizer::interval = 10000; // 10 msecs 115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectAntagonizer::Antagonizer(notify_callback_f cb, void* client) : 115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mExit(false), mActive(false), mClient(client), mCb(cb) 115389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project createThread(callbackThread, this); 115589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid Antagonizer::kill() 115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(mLock); 116089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mActive = false; 116189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mExit = true; 116289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.wait(mLock); 116389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 116489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 116589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint Antagonizer::callbackThread(void* user) 116689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1167b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Antagonizer started"); 116889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Antagonizer* p = reinterpret_cast<Antagonizer*>(user); 116989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (!p->mExit) { 117089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p->mActive) { 11713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("send event"); 117289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCb(p->mClient, 0, 0, 0); 117389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project usleep(interval); 117589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(p->mLock); 117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCondition.signal(); 1178b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Antagonizer stopped"); 117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 118189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif 118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic size_t kDefaultHeapSize = 1024 * 1024; // 1MB 118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1185e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kastensp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat) 118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 11873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decode(%s)", url); 118889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MemoryBase> mem; 118989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> player; 119089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 119189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Protect our precious, precious DRMd ringtones by only allowing 119289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // decoding of http, but not filesystem paths or content Uris. 119389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If the application wants to decode those, it should open a 119489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // filedescriptor for them and use that. 119589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (url != NULL && strncmp(url, "http://", 7) != 0) { 1196b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("Can't decode %s by path, use filedescriptor instead", url); 119789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 119889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 119989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 120044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = 120144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman MediaPlayerFactory::getPlayerType(NULL /* client */, url); 12023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("player type = %d", playerType); 120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 120489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create the right type of player 120589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AudioCache> cache = new AudioCache(url); 120644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); 120789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player == NULL) goto Exit; 120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->hardwareOutput()) goto Exit; 120989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 121089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 121189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 121289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // set data source 121389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->setDataSource(url) != NO_ERROR) goto Exit; 121489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 121689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->prepareAsync(); 121789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for prepare"); 121989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (cache->wait() != NO_ERROR) goto Exit; 122089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 122289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->start(); 122389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for playback complete"); 12259cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent cache->wait(); 12269cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent // in case of error, return what was successfully decoded. 12279cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent if (cache->size() == 0) { 12289cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent goto Exit; 12299cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent } 123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pSampleRate = cache->sampleRate(); 123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pNumChannels = cache->channelCount(); 1234e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten *pFormat = cache->format(); 12353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 123689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 123789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectExit: 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player != 0) player->reset(); 123989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 124089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 124189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1242e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kastensp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat) 124389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 12443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decode(%d, %lld, %lld)", fd, offset, length); 124589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MemoryBase> mem; 124689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaPlayerBase> player; 124789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 124844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType = MediaPlayerFactory::getPlayerType(NULL /* client */, 124944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman fd, 125044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman offset, 125144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman length); 12523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("player type = %d", playerType); 125389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 125489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create the right type of player 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<AudioCache> cache = new AudioCache("decode_fd"); 125644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); 125789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player == NULL) goto Exit; 125889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->hardwareOutput()) goto Exit; 125989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 126089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 126289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // set data source 126389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 126689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->prepareAsync(); 126789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for prepare"); 126989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (cache->wait() != NO_ERROR) goto Exit; 127089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 127289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project player->start(); 127389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait for playback complete"); 12759cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent cache->wait(); 12769cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent // in case of error, return what was successfully decoded. 12779cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent if (cache->size() == 0) { 12789cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent goto Exit; 12799cb839a0fcc98fe4278b39afb8b6d664c04f1673Eric Laurent } 128089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mem = new MemoryBase(cache->getHeap(), 0, cache->size()); 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pSampleRate = cache->sampleRate(); 128389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pNumChannels = cache->channelCount(); 128489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pFormat = cache->format(); 12853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); 128689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectExit: 128889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (player != 0) player->reset(); 128989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ::close(fd); 129089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mem; 129189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 129289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 129310dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen 129489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#undef LOG_TAG 129589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "AudioSink" 1296a514bdb58b5de4986679f72b7204b4764f7a2778Eric LaurentMediaPlayerService::AudioOutput::AudioOutput(int sessionId) 129720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCallback(NULL), 1298a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mCallbackCookie(NULL), 12996b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData(NULL), 13004110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mBytesWritten(0), 13011948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSessionId(sessionId), 13021948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mFlags(AUDIO_OUTPUT_FLAG_NONE) { 13033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AudioOutput(%d)", sessionId); 130489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = 0; 13056b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = 0; 1306fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin mStreamType = AUDIO_STREAM_MUSIC; 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLeftVolume = 1.0; 130889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRightVolume = 1.0; 13097a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mPlaybackRatePermille = 1000; 13107a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mSampleRateHz = 0; 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame = 0; 13122beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId = 0; 13132beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mSendLevel = 0.0; 131489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 131689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 131789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::AudioOutput::~AudioOutput() 131889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 131989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project close(); 13206b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mRecycledTrack; 13216b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mCallbackData; 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 132389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::setMinBufferCount() 132589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (property_get("ro.kernel.qemu", value, 0)) { 132889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsOnEmulator = true; 132989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMinBufferCount = 12; // to prevent systematic buffer underrun for emulator 133089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 133189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 133289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool MediaPlayerService::AudioOutput::isOnEmulator() 133489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 133589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 133689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mIsOnEmulator; 133789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 133889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint MediaPlayerService::AudioOutput::getMinBufferCount() 134089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 134189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project setMinBufferCount(); 134289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMinBufferCount; 134389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 134489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 134589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::bufferSize() const 134689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 134789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 134889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameCount() * frameSize(); 134989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 135089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::frameCount() const 135289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 135389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 135489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameCount(); 135589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 135689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::channelCount() const 135889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 135989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->channelCount(); 136189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 136289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 136389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::frameSize() const 136489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack == 0) return NO_INIT; 136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mTrack->frameSize(); 136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectuint32_t MediaPlayerService::AudioOutput::latency () const 137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1371db354e58e65592777aa17caa47933e14838b8b35Eric Laurent if (mTrack == 0) return 0; 1372db354e58e65592777aa17caa47933e14838b8b35Eric Laurent return mTrack->latency(); 137389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 137489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectfloat MediaPlayerService::AudioOutput::msecsPerFrame() const 137689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 137789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMsecsPerFrame; 137889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 137989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13804110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioOutput::getPosition(uint32_t *position) const 1381342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent{ 1382342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (mTrack == 0) return NO_INIT; 1383342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return mTrack->getPosition(position); 1384342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent} 1385342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 13864110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioOutput::getFramesWritten(uint32_t *frameswritten) const 13874110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen{ 13884110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (mTrack == 0) return NO_INIT; 13894110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen *frameswritten = mBytesWritten / frameSize(); 13904110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen return OK; 13914110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen} 13924110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 139320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t MediaPlayerService::AudioOutput::open( 1394786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 1395786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi audio_format_t format, int bufferCount, 13961948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent AudioCallback cb, void *cookie, 13971948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags) 139889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 139920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCallback = cb; 140020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCallbackCookie = cookie; 140120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 140289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Check argument "bufferCount" against the mininum buffer count 140389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (bufferCount < mMinBufferCount) { 1404b8a805261bf0282e992d3608035e47d05a898710Steve Block ALOGD("bufferCount (%d) is too small and increased to %d", bufferCount, mMinBufferCount); 140589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bufferCount = mMinBufferCount; 140689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1408786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGV("open(%u, %d, 0x%x, %d, %d, %d)", sampleRate, channelCount, channelMask, 1409786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi format, bufferCount, mSessionId); 141089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int afSampleRate; 141189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int afFrameCount; 14121948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent uint32_t frameCount; 141389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) { 141589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 141689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 141789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != NO_ERROR) { 141889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 141989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 142089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project frameCount = (sampleRate*afFrameCount*bufferCount)/afSampleRate; 142220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1423786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi if (channelMask == CHANNEL_MASK_USE_CHANNEL_ORDER) { 1424ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten channelMask = audio_channel_out_mask_from_count(channelCount); 1425786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi if (0 == channelMask) { 1426786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGE("open() error, can\'t derive mask for %d audio channels", channelCount); 1427786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi return NO_INIT; 1428786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi } 1429786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi } 14301948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 143167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen AudioTrack *t; 143267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen CallbackData *newcbd = NULL; 143367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen if (mCallback != NULL) { 143467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen newcbd = new CallbackData(this); 143567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen t = new AudioTrack( 143667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mStreamType, 143767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen sampleRate, 143867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen format, 143967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen channelMask, 144067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen frameCount, 144167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen flags, 144267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen CallbackWrapper, 144367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen newcbd, 144467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 0, // notification frames 144567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mSessionId); 144667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } else { 144767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen t = new AudioTrack( 144867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mStreamType, 144967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen sampleRate, 145067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen format, 145167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen channelMask, 145267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen frameCount, 145367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen flags, 145467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen NULL, 145567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen NULL, 145667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 0, 145767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mSessionId); 145867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } 145967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 146067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen if ((t == 0) || (t->initCheck() != NO_ERROR)) { 146167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGE("Unable to create audio track"); 146267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete t; 146367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete newcbd; 146467295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen return NO_INIT; 146567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } 146667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 146767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen 14686b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mRecycledTrack) { 14696b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // check if the existing track can be reused as-is, or if a new track needs to be created. 14706b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 14716b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen bool reuse = true; 14726b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if ((mCallbackData == NULL && mCallback != NULL) || 14736b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen (mCallbackData != NULL && mCallback == NULL)) { 14746b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // recycled track uses callbacks but the caller wants to use writes, or vice versa 14756b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("can't chain callback and write"); 14766b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen reuse = false; 14776b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } else if ((mRecycledTrack->getSampleRate() != sampleRate) || 14786b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen (mRecycledTrack->channelCount() != channelCount) || 147967295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen (mRecycledTrack->frameCount() != t->frameCount())) { 148067295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGV("samplerate, channelcount or framecount differ: %d/%d Hz, %d/%d ch, %d/%d frames", 148167295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->getSampleRate(), sampleRate, 148267295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->channelCount(), channelCount, 148367295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mRecycledTrack->frameCount(), t->frameCount()); 14846b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen reuse = false; 148567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen } else if (flags != mFlags) { 148667295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen ALOGV("output flags differ %08x/%08x", flags, mFlags); 14871948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent reuse = false; 14886b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 14896b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (reuse) { 14906b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("chaining to next output"); 14916b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen close(); 14926b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mTrack = mRecycledTrack; 14936b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = NULL; 14946b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 14956b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->setOutput(this); 14966b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 149767295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete t; 149867295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen delete newcbd; 14996b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return OK; 15006b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15016b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 15026b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // if we're not going to reuse the track, unblock and flush it 15036b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 15046b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->setOutput(NULL); 15056b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->endTrackSwitch(); 15066b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15076b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack->flush(); 15086b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mRecycledTrack; 15096b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mRecycledTrack = NULL; 15106b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mCallbackData; 15116b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData = NULL; 15126b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen close(); 15136b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 1514786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi 151567295b543c16ed7c77b67f859d598fe7b4571660Marco Nelissen mCallbackData = newcbd; 15163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVolume"); 151789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project t->setVolume(mLeftVolume, mRightVolume); 15182beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 15197a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mSampleRateHz = sampleRate; 15201948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mFlags = flags; 15217a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mMsecsPerFrame = mPlaybackRatePermille / (float) sampleRate; 152299448608f375a7191c068c3bfd296f204b58a219Marco Nelissen uint32_t pos; 152399448608f375a7191c068c3bfd296f204b58a219Marco Nelissen if (t->getPosition(&pos) == OK) { 152499448608f375a7191c068c3bfd296f204b58a219Marco Nelissen mBytesWritten = uint64_t(pos) * t->frameSize(); 152599448608f375a7191c068c3bfd296f204b58a219Marco Nelissen } 152689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = t; 15272beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 15287a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi status_t res = t->setSampleRate(mPlaybackRatePermille * mSampleRateHz / 1000); 15297a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (res != NO_ERROR) { 15307a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return res; 15317a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 15322beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent t->setAuxEffectSendLevel(mSendLevel); 15332beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return t->attachAuxEffect(mAuxEffectId);; 153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::start() 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 15396b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 15406b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->endTrackSwitch(); 15416b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) { 154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->setVolume(mLeftVolume, mRightVolume); 15442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mTrack->setAuxEffectSendLevel(mSendLevel); 154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->start(); 154689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 154789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15496b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenvoid MediaPlayerService::AudioOutput::setNextOutput(const sp<AudioOutput>& nextOutput) { 15506b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput = nextOutput; 15516b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 15526b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen 15537ee8ac94bb1a724a481a7cddf10ce63d35df6296Marco Nelissen 15546b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissenvoid MediaPlayerService::AudioOutput::switchToNextOutput() { 15556b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen ALOGV("switchToNextOutput"); 15566b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mNextOutput != NULL) { 15576b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (mCallbackData != NULL) { 15586b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData->beginTrackSwitch(); 15596b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15606b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen delete mNextOutput->mCallbackData; 15616b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mCallbackData = mCallbackData; 15626b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mCallbackData = NULL; 15636b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mRecycledTrack = mTrack; 15646b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mTrack = NULL; 15656b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mSampleRateHz = mSampleRateHz; 15666b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen mNextOutput->mMsecsPerFrame = mMsecsPerFrame; 15674110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mNextOutput->mBytesWritten = mBytesWritten; 1568d791e094da5698c787f8db28ca5d5d490c512cf1Marco Nelissen mNextOutput->mFlags = mFlags; 15696b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 15706b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen} 15717ee8ac94bb1a724a481a7cddf10ce63d35df6296Marco Nelissen 157289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioOutput::write(const void* buffer, size_t size) 157389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 157420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber LOG_FATAL_IF(mCallback != NULL, "Don't call write if supplying a callback."); 157520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("write(%p, %u)", buffer, size); 157710dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen if (mTrack) { 157810dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen ssize_t ret = mTrack->write(buffer, size); 15794110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mBytesWritten += ret; 158010dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen return ret; 158110dbb8e97e7a81ca4867663b5517f048820b3094Marco Nelissen } 158289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 158389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 158489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 158589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::stop() 158689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stop"); 158889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->stop(); 158989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 159089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 159189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::flush() 159289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("flush"); 159489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->flush(); 159589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 159689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 159789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::pause() 159889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 15993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("pause"); 160089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) mTrack->pause(); 160189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 160289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 160389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::close() 160489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 16053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("close"); 160689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mTrack; 160789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack = 0; 160889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 160989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 161089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaPlayerService::AudioOutput::setVolume(float left, float right) 161189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 16123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVolume(%f, %f)", left, right); 161389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLeftVolume = left; 161489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRightVolume = right; 161589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTrack) { 161689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrack->setVolume(left, right); 161789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 161889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 161989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16207a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivistatus_t MediaPlayerService::AudioOutput::setPlaybackRatePermille(int32_t ratePermille) 16217a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi{ 16227a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi ALOGV("setPlaybackRatePermille(%d)", ratePermille); 16237a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi status_t res = NO_ERROR; 16247a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (mTrack) { 16257a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi res = mTrack->setSampleRate(ratePermille * mSampleRateHz / 1000); 16267a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } else { 16277a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi res = NO_INIT; 16287a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 16297a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mPlaybackRatePermille = ratePermille; 16307a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi if (mSampleRateHz != 0) { 16317a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi mMsecsPerFrame = mPlaybackRatePermille / (float) mSampleRateHz; 16327a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi } 16337a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi return res; 16347a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi} 16357a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi 16362beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::AudioOutput::setAuxEffectSendLevel(float level) 16372beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 16383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAuxEffectSendLevel(%f)", level); 16392beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mSendLevel = level; 16402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mTrack) { 16412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return mTrack->setAuxEffectSendLevel(level); 16422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent } 16432beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 16442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 16452beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 16462beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurentstatus_t MediaPlayerService::AudioOutput::attachAuxEffect(int effectId) 16472beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent{ 16483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("attachAuxEffect(%d)", effectId); 16492beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mAuxEffectId = effectId; 16502beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent if (mTrack) { 16512beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return mTrack->attachAuxEffect(effectId); 16522beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent } 16532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return NO_ERROR; 16542beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent} 16552beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 165620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 165720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaPlayerService::AudioOutput::CallbackWrapper( 1658d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kasten int event, void *cookie, void *info) { 16593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("callbackwrapper"); 166020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (event != AudioTrack::EVENT_MORE_DATA) { 166120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return; 166220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 166320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16646b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen CallbackData *data = (CallbackData*)cookie; 16656b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->lock(); 16666b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen AudioOutput *me = data->getOutput(); 166720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; 16686b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (me == NULL) { 16696b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // no output set, likely because the track was scheduled to be reused 16706b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen // by another player, but the format turned out to be incompatible. 16716b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->unlock(); 16726b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen buffer->size = 0; 16736b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen return; 16746b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen } 167520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16767d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t actualSize = (*me->mCallback)( 167720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber me, buffer->raw, buffer->size, me->mCallbackCookie); 16787d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 16796b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen if (actualSize == 0 && buffer->size > 0 && me->mNextOutput == NULL) { 168051c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber // We've reached EOS but the audio track is not stopped yet, 168151c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber // keep playing silence. 168251c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber 168351c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber memset(buffer->raw, 0, buffer->size); 168451c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber actualSize = buffer->size; 168551c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber } 16862e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber 168751c1e0e86a0ad95bf3d890a9a2f51e54b8ef9444Andreas Huber buffer->size = actualSize; 16886b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen data->unlock(); 168920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 169020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16914110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint MediaPlayerService::AudioOutput::getSessionId() const 16928c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent{ 16938c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent return mSessionId; 16948c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent} 16958c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent 169689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#undef LOG_TAG 169789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "AudioCache" 169889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaPlayerService::AudioCache::AudioCache(const char* name) : 169989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mChannelCount(0), mFrameCount(1024), mSampleRate(0), mSize(0), 170089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mError(NO_ERROR), mCommandComplete(false) 170189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 170289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create ashmem heap 170389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mHeap = new MemoryHeapBase(kDefaultHeapSize, 0, name); 170489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 170589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 170689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectuint32_t MediaPlayerService::AudioCache::latency () const 170789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 170889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 170989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 171089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 171189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectfloat MediaPlayerService::AudioCache::msecsPerFrame() const 171289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 171389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMsecsPerFrame; 171489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 171589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17164110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) const 1717342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent{ 1718342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (position == 0) return BAD_VALUE; 1719342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *position = mSize; 1720342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1721342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent} 1722342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 17234110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenstatus_t MediaPlayerService::AudioCache::getFramesWritten(uint32_t *written) const 17244110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen{ 17254110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (written == 0) return BAD_VALUE; 17264110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen *written = mSize; 17274110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen return NO_ERROR; 17284110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen} 17294110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 17307d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber//////////////////////////////////////////////////////////////////////////////// 17317d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17327d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberstruct CallbackThread : public Thread { 17337d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread(const wp<MediaPlayerBase::AudioSink> &sink, 17347d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback cb, 17357d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *cookie); 17367d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17377d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberprotected: 17387d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber virtual ~CallbackThread(); 17397d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17407d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber virtual bool threadLoop(); 17417d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17427d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberprivate: 17437d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber wp<MediaPlayerBase::AudioSink> mSink; 17447d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback mCallback; 17457d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *mCookie; 17467d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *mBuffer; 17477d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t mBufferSize; 17487d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17497d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread(const CallbackThread &); 17507d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber CallbackThread &operator=(const CallbackThread &); 17517d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber}; 17527d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17537d5b8a70c28c0d5746a600467b2887822dbff88eAndreas HuberCallbackThread::CallbackThread( 17547d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber const wp<MediaPlayerBase::AudioSink> &sink, 17557d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber MediaPlayerBase::AudioSink::AudioCallback cb, 17567d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber void *cookie) 17577d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber : mSink(sink), 17587d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallback(cb), 17597d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCookie(cookie), 17607d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer(NULL), 17617d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBufferSize(0) { 17627d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17637d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17647d5b8a70c28c0d5746a600467b2887822dbff88eAndreas HuberCallbackThread::~CallbackThread() { 17657d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mBuffer) { 17667d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber free(mBuffer); 17677d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer = NULL; 17687d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17697d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17707d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17717d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huberbool CallbackThread::threadLoop() { 17727d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber sp<MediaPlayerBase::AudioSink> sink = mSink.promote(); 17737d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (sink == NULL) { 17747d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber return false; 17757d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17767d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17777d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mBuffer == NULL) { 17787d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBufferSize = sink->bufferSize(); 17797d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mBuffer = malloc(mBufferSize); 17807d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17817d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17827d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber size_t actualSize = 17837d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber (*mCallback)(sink.get(), mBuffer, mBufferSize, mCookie); 17847d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17857d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (actualSize > 0) { 17867d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber sink->write(mBuffer, actualSize); 17877d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 17887d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17897d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber return true; 17907d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 17917d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 17927d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber//////////////////////////////////////////////////////////////////////////////// 17937d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 179420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t MediaPlayerService::AudioCache::open( 1795786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 1796786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi audio_format_t format, int bufferCount, 17971948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent AudioCallback cb, void *cookie, audio_output_flags_t flags) 179889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1799786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi ALOGV("open(%u, %d, 0x%x, %d, %d)", sampleRate, channelCount, channelMask, format, bufferCount); 18008eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks if (mHeap->getHeapID() < 0) { 18018eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks return NO_INIT; 18028eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks } 180320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 180489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSampleRate = sampleRate; 180589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mChannelCount = (uint16_t)channelCount; 1806e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten mFormat = format; 180789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMsecsPerFrame = 1.e3 / (float) sampleRate; 18087d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 18097d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (cb != NULL) { 18107d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread = new CallbackThread(this, cb, cookie); 18117d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 181289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 181389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 181489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18157d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubervoid MediaPlayerService::AudioCache::start() { 18167d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mCallbackThread != NULL) { 18177d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread->run("AudioCache callback"); 18187d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 18197d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 18207d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 18217d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Hubervoid MediaPlayerService::AudioCache::stop() { 18227d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber if (mCallbackThread != NULL) { 18237d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber mCallbackThread->requestExitAndWait(); 18247d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber } 18257d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber} 18267d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber 182789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) 182889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 18293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("write(%p, %u)", buffer, size); 183089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((buffer == 0) || (size == 0)) return size; 183189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 183289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint8_t* p = static_cast<uint8_t*>(mHeap->getBase()); 183389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (p == NULL) return NO_INIT; 183489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p += mSize; 18353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("memcpy(%p, %p, %u)", p, buffer, size); 183689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mSize + size > mHeap->getSize()) { 183729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize()); 183889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size = mHeap->getSize() - mSize; 183989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 184089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memcpy(p, buffer, size); 184189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSize += size; 184289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return size; 184389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 184489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 184589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// call with lock held 184689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaPlayerService::AudioCache::wait() 184789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 184889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 18494bbc0ba371c52951191eff1cba7c1ea5d27ee976Dave Sparks while (!mCommandComplete) { 185089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mSignal.wait(mLock); 185189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 185289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCommandComplete = false; 185389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 185489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mError == NO_ERROR) { 18553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait - success"); 185689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 18573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("wait - error"); 185889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 185989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mError; 186089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 186189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1862b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangvoid MediaPlayerService::AudioCache::notify( 1863b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang void* cookie, int msg, int ext1, int ext2, const Parcel *obj) 186489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 18653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); 186689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project AudioCache* p = static_cast<AudioCache*>(cookie); 186789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 186889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // ignore buffering messages 18698eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks switch (msg) 18708eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks { 18718eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_ERROR: 187229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Error %d, %d occurred", ext1, ext2); 187389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mError = ext1; 18748eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18758eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_PREPARED: 18763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepared"); 18778eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18788eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks case MEDIA_PLAYBACK_COMPLETE: 18793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("playback complete"); 18808eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks break; 18818eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks default: 18823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ignored"); 18838eb8011120a68a86199b9960cf1ae91a6ddc7e6dDave Sparks return; 188489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 188589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 188689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // wake up thread 1887fe4c6f01646de47d41bbe3aa6d17c6a0daa2b730Dave Sparks Mutex::Autolock lock(p->mLock); 188889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mCommandComplete = true; 188989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p->mSignal.signal(); 189089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 189189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18924110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissenint MediaPlayerService::AudioCache::getSessionId() const 18938c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent{ 18948c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent return 0; 18958c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent} 18968c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent 18977cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid MediaPlayerService::addBatteryData(uint32_t params) 18987cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang{ 18997cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Mutex::Autolock lock(mLock); 19009ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19019ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t time = systemTime() / 1000000L; 19029ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19039ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // change audio output devices. This notification comes from AudioFlinger 19049ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if ((params & kBatteryDataSpeakerOn) 19059ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang || (params & kBatteryDataOtherAudioDeviceOn)) { 19069ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19079ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int deviceOn[NUM_AUDIO_DEVICES]; 19089ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19099ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[i] = 0; 19109ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19119ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19129ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if ((params & kBatteryDataSpeakerOn) 19139ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang && (params & kBatteryDataOtherAudioDeviceOn)) { 19149ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[SPEAKER_AND_OTHER] = 1; 19159ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else if (params & kBatteryDataSpeakerOn) { 19169ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[SPEAKER] = 1; 19179ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else { 19189ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang deviceOn[OTHER_AUDIO_DEVICE] = 1; 19199ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19209ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19219ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19229ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i] != deviceOn[i]){ 19239ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19249ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount > 0) { // if playing audio 19259ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (!deviceOn[i]) { 19269ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] += time; 19279ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 19289ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 19299ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else { 19309ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0 - time; 19319ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19329ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19339ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19349ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.deviceOn[i] = deviceOn[i]; 19359ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19369ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19379ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19389ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19399ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19409ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // an sudio stream is started 19419ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (params & kBatteryDataAudioFlingerStart) { 19429ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // record the start time only if currently no other audio 19439ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // is being played 19449ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount == 0) { 19459ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19469ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i]) { 19479ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] -= time; 19489ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19499ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19509ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19519ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19529ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount ++; 19539ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19549ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19559ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } else if (params & kBatteryDataAudioFlingerStop) { 19569ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount <= 0) { 19575ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Battery track warning: refCount is <= 0"); 19589ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19599ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19609ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19619ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // record the stop time only if currently this is the only 19629ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // audio being played 19639ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.refCount == 1) { 19649ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 19659ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i]) { 19669ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] += time; 19679ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] += mBatteryAudio.lastTime[i]; 19689ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.lastTime[i] = 0; 19699ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19709ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19719ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19729ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19739ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.refCount --; 19749ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19759ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19769ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 19777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int uid = IPCThreadState::self()->getCallingUid(); 19787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (uid == AID_MEDIA) { 19797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 19807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int index = mBatteryData.indexOfKey(uid); 19827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (index < 0) { // create a new entry for this UID 19847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo info; 19857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime = 0; 19867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime = 0; 19877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime = 0; 19887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime = 0; 19897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount = 0; 19907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19919ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryData.add(uid, info) == NO_MEMORY) { 199229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Battery track error: no memory for new app"); 19939ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang return; 19949ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 19957cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 19967cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19977cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo &info = mBatteryData.editValueFor(uid); 19987cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 19997cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataCodecStarted) { 20007cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackAudio) { 20017cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime -= time; 20027cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount ++; 20037cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20047cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackVideo) { 20057cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime -= time; 20067cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount ++; 20077cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20087cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } else { 20097cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount == 0) { 20105ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Battery track warning: refCount is already 0"); 20117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 20127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } else if (info.refCount < 0) { 201329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Battery track error: refCount < 0"); 20147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang mBatteryData.removeItem(uid); 20157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return; 20167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackAudio) { 20197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime += time; 20207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount --; 20217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (params & kBatteryDataTrackVideo) { 20237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime += time; 20247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.refCount --; 20257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang // no stream is being played by this UID 20287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount == 0) { 20297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime += info.audioLastTime; 20307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioLastTime = 0; 20317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime += info.videoLastTime; 20327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoLastTime = 0; 20337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 20367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangstatus_t MediaPlayerService::pullBatteryData(Parcel* reply) { 20387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang Mutex::Autolock lock(mLock); 20399ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20409ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // audio output devices usage 20419ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t time = systemTime() / 1000000L; //in ms 20429ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t totalTime; 20439ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20449ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang for (int i = 0; i < NUM_AUDIO_DEVICES; i++) { 20459ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang totalTime = mBatteryAudio.totalTime[i]; 20469ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20479ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang if (mBatteryAudio.deviceOn[i] 20489ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang && (mBatteryAudio.lastTime[i] != 0)) { 20499ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang int32_t tmpTime = mBatteryAudio.lastTime[i] + time; 20509ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang totalTime += tmpTime; 20519ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 20529ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20539ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang reply->writeInt32(totalTime); 20549ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // reset the total time 20559ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang mBatteryAudio.totalTime[i] = 0; 20569ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang } 20579ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang 20589ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang // codec usage 20597cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang BatteryUsageInfo info; 20607cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int size = mBatteryData.size(); 20617cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20627cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(size); 20637cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang int i = 0; 20647cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20657cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang while (i < size) { 20667cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info = mBatteryData.valueAt(i); 20677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(mBatteryData.keyAt(i)); //UID 20697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(info.audioTotalTime); 20707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang reply->writeInt32(info.videoTotalTime); 20717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.audioTotalTime = 0; 20737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang info.videoTotalTime = 0; 20747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang 20757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang // remove the UID entry where no stream is being played 20767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang if (info.refCount <= 0) { 20777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang mBatteryData.removeItemsAt(i); 20787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang size --; 20797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang i --; 20807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang i++; 20827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang } 20837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang return NO_ERROR; 20847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang} 2085a64c8c79af1a15911c55306d83a797fa50969f77niko} // namespace android 2086