AudioSystem.cpp revision 34bb419e5946ab28112e9e27a4d1b3928d31e0e2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "AudioSystem" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioSystem.h> 23a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#include <media/IAudioPolicyService.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2634bb419e5946ab28112e9e27a4d1b3928d31e0e2Dima Zavin#include <system/audio.h> 2724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin 28a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// ---------------------------------------------------------------------------- 29a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// the sim build doesn't have gettid 30a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 31a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#ifndef HAVE_GETTID 32a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent# define gettid getpid 33a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#endif 34a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 35a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// ---------------------------------------------------------------------------- 36a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// client singleton for AudioFlinger binder interface 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectMutex AudioSystem::gLock; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IAudioFlinger> AudioSystem::gAudioFlinger; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectaudio_error_callback AudioSystem::gAudioErrorCallback = NULL; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values 45a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<int, audio_io_handle_t> AudioSystem::gStreamOutputMap(0); 46a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(0); 47a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values for recording queries 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t AudioSystem::gPrevInSamplingRate = 16000; 5024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinint AudioSystem::gPrevInFormat = AUDIO_FORMAT_PCM_16_BIT; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::gPrevInChannelCount = 1; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t AudioSystem::gInBuffSize = 0; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// establish binder interface to AudioFlinger service 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst sp<IAudioFlinger>& AudioSystem::get_audio_flinger() 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(gLock); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlinger.get() == 0) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> binder; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = sm->getService(String16("media.audio_flinger")); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (binder != 0) 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger not published, waiting..."); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usleep(500000); // 0.5 s 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while(true); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlingerClient == NULL) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlingerClient = new AudioFlingerClient(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(NO_ERROR); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder->linkToDeath(gAudioFlingerClient); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger = interface_cast<IAudioFlinger>(binder); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger->registerClient(gAudioFlingerClient); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE_IF(gAudioFlinger==0, "no AudioFlinger!?"); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioFlinger; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::muteMicrophone(bool state) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMicMute(state); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::isMicrophoneMuted(bool* state) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *state = af->getMicMute(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterVolume(float value) 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterVolume(value); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterMute(bool mute) 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterMute(mute); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterVolume(float* volume) 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *volume = af->masterVolume(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterMute(bool* mute) 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->masterMute(); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 130ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::setStreamVolume(int stream, float value, int output) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 135a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent af->setStreamVolume(stream, value, output); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setStreamMute(int stream, bool mute) 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setStreamMute(stream, mute); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 148ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::getStreamVolume(int stream, float* volume, int output) 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 153a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *volume = af->streamVolume(stream, output); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getStreamMute(int stream, bool* mute) 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->streamMute(stream); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMode(int mode) 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (mode >= AUDIO_MODE_CNT) return BAD_VALUE; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMode(mode); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 174a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 177a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return af->setParameters(ioHandle, keyValuePairs); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 182a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 result = String8(""); 183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return result; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 185a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = af->getParameters(ioHandle, keys); 186a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// convert volume steps to natural log scale 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// change this value to change volume scaling 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBPerStep = 0.5f; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// shouldn't need to touch these 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvertInverse = 1.0f / dBConvert; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfloat AudioSystem::linearToLog(int volume) 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("linearToLog(%d)=%f", volume, v); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? exp(float(100 - volume) * dBConvert) : 0; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::logToLinear(float volume) 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("logTolinear(%d)=%f", v, volume); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 21824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 21924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 220a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 22224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 224a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 225a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 226a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 227a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 228a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 229a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 230ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 232a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 233a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 234a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = af->sampleRate(output); 235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 236a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("getOutputSamplingRate() reading from output desc"); 237a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = outputDesc->samplingRate; 238a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 239a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 240a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 241ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 248a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 249a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 25124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 25224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 253a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 256a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 257a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 258a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 260a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 261a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 262a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = af->frameCount(output); 267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = outputDesc->frameCount; 269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 270a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2713547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 272ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 279a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 281a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 28224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 28324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 284a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 289a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 290a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 291a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 292a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 294a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = af->latency(output); 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = outputDesc->latency; 300a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3023547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 303ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount, 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t* buffSize) 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values 312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (channelCount != gPrevInChannelCount)) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save the request params 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInSamplingRate = sampleRate; 316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gPrevInFormat = format; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInChannelCount = channelCount; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = 0; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); 325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buffSize = gInBuffSize; 327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 331415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurentstatus_t AudioSystem::setVoiceVolume(float value) 332415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent{ 333415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 334415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent if (af == 0) return PERMISSION_DENIED; 335415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return af->setVoiceVolume(value); 336415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent} 337415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 3380986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurentstatus_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream) 3390986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent{ 3400986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3410986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (af == 0) return PERMISSION_DENIED; 3420986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 34324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (stream == AUDIO_STREAM_DEFAULT) { 34424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin stream = AUDIO_STREAM_MUSIC; 3450986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 3460986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 34724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return af->getRenderPosition(halFrames, dspFrames, getOutput((audio_stream_type_t)stream)); 3480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent} 3490986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 35047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurentunsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { 35147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 35247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent unsigned int result = 0; 35347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent if (af == 0) return result; 354ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if (ioHandle == 0) return result; 35547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 35647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent result = af->getInputFramesLost(ioHandle); 35747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return result; 35847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent} 35947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 36065b65459e6ac59f8a257009df8014467ae0838eeEric Laurentint AudioSystem::newAudioSessionId() { 36165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 36265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (af == 0) return 0; 36365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return af->newAudioSessionId(); 36465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent} 36565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioFlinger.clear(); 372787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent // clear output handles and stream to output map caches 373787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gStreamOutputMap.clear(); 374787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gOutputs.clear(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(DEAD_OBJECT); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger server died!"); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 382ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentvoid AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) { 383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() event %d", event); 384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *desc; 385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t stream; 386a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 387ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (ioHandle == 0) return; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (event) { 392a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case STREAM_CONFIG_CHANGED: 393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream = *(uint32_t *)param2; 395ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %d", stream, ioHandle); 396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.indexOfKey(stream) >= 0) { 397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.replaceValueFor(stream, ioHandle); 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_OPENED: { 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) >= 0) { 402ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() opening already existing output! %d", ioHandle); 403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = new OutputDescriptor(*desc); 409a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.add(ioHandle, outputDesc); 410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() new output samplingRate %d, format %d channels %d frameCount %d latency %d", 411a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc->samplingRate, outputDesc->format, outputDesc->channels, outputDesc->frameCount, outputDesc->latency); 412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CLOSED: { 414a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) < 0) { 415ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() closing unknow output! %d", ioHandle); 416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 418ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() output %d closed", ioHandle); 419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.removeItem(ioHandle); 421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent for (int i = gStreamOutputMap.size() - 1; i >= 0 ; i--) { 422a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.valueAt(i) == ioHandle) { 423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.removeItemsAt(i); 424a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CONFIG_CHANGED: { 429a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int index = gOutputs.indexOfKey(ioHandle); 430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (index < 0) { 431ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle); 432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 433a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 434a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 435a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 436a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 437ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() new config for output %d samplingRate %d, format %d channels %d frameCount %d latency %d", 438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ioHandle, desc->samplingRate, desc->format, 439a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc->channels, desc->frameCount, desc->latency); 440a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = gOutputs.valueAt(index); 441a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent delete outputDesc; 442a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = new OutputDescriptor(*desc); 443a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.replaceValueFor(ioHandle, outputDesc); 444a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 445a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_OPENED: 446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CLOSED: 447a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CONFIG_CHANGED: 448a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 4493547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::setErrorCallback(audio_error_callback cb) { 454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioErrorCallback = cb; 456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AudioSystem::routedToA2dpOutput(int streamType) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(streamType) { 46024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_MUSIC: 46124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_VOICE_CALL: 46224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_BLUETOOTH_SCO: 46324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_SYSTEM: 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// client singleton for AudioPolicyService binder interface 472a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 473a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 474a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 475a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// establish binder interface to AudioFlinger service 477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service() 478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 480a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyService.get() == 0) { 481a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IServiceManager> sm = defaultServiceManager(); 482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IBinder> binder; 483a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent do { 484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder = sm->getService(String16("media.audio_policy")); 485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (binder != 0) 486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService not published, waiting..."); 488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent usleep(500000); // 0.5 s 489a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } while(true); 490a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyServiceClient == NULL) { 491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 492a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 493a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder->linkToDeath(gAudioPolicyServiceClient); 494a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 495a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 496a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 497a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 498a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 499a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioPolicyService; 500a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 50224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setDeviceConnectionState(audio_devices_t device, 50324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_policy_dev_state_t state, 50424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin const char *device_address) 505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setDeviceConnectionState(device, state, device_address); 510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 511a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 51224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device, 513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *device_address) 514a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 515a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 51624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 517a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 518a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getDeviceConnectionState(device, device_address); 519a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 520a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 521a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setPhoneState(int state) 522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 525a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 526a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setPhoneState(state); 527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setRingerMode(uint32_t mode, uint32_t mask) 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 531a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setRingerMode(mode, mask); 534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 53624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setForceUse(usage, config); 541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 54324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) 544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 545a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 54624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (aps == 0) return AUDIO_POLICY_FORCE_NONE; 547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getForceUse(usage); 548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 55124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream, 552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 553a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 554a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 55524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_policy_output_flags_t flags) 556a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 557ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent audio_io_handle_t output = 0; 558ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Do not use stream to output map cache if the direct output 559ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // flag is set or if we are likely to use a direct output 560ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // (e.g voice call stream @ 8kHz could use BT SCO device and be routed to 561ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // a direct output on some platforms). 562ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // TODO: the output cache and stream to output mapping implementation needs to 563ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // be reworked for proper operation with direct outputs. This code is too specific 564ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // to the first use case we want to cover (Voice Recognition and Voice Dialer over 565ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Bluetooth SCO 56624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if ((flags & AUDIO_POLICY_OUTPUT_FLAG_DIRECT) == 0 && 56724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin ((stream != AUDIO_STREAM_VOICE_CALL && stream != AUDIO_STREAM_BLUETOOTH_SCO) || 56824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin channels != AUDIO_CHANNEL_OUT_MONO || 569ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent (samplingRate != 8000 && samplingRate != 16000))) { 570a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = AudioSystem::gStreamOutputMap.valueFor(stream); 572ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream); 573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 574ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (output == 0) { 575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 576ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = aps->getOutput(stream, samplingRate, format, channels, flags); 57824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if ((flags & AUDIO_POLICY_OUTPUT_FLAG_DIRECT) == 0) { 579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gStreamOutputMap.add(stream, output); 581a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return output; 584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::startOutput(audio_io_handle_t output, 58724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t stream, 5888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 5928ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->startOutput(output, stream, session); 593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::stopOutput(audio_io_handle_t output, 59624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t stream, 5978ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 6018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->stopOutput(output, stream, session); 602a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseOutput(audio_io_handle_t output) 605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseOutput(output); 609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getInput(int inputSource, 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 61524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_in_acoustics_t acoustics) 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 618ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getInput(inputSource, samplingRate, format, channels, acoustics); 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::startInput(audio_io_handle_t input) 623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 625a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->startInput(input); 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::stopInput(audio_io_handle_t input) 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->stopInput(input); 634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 635a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseInput(audio_io_handle_t input) 637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseInput(input); 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 64324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::initStreamVolume(audio_stream_type_t stream, 644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMin, 645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMax) 646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 647a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->initStreamVolume(stream, indexMin, indexMax); 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 65224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index) 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setStreamVolumeIndex(stream, index); 657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 65924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream, int *index) 660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 663a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getStreamVolumeIndex(stream, index); 664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 66624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinuint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) 6678ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6688ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6698ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return 0; 6708ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getStrategyForStream(stream); 6718ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6728ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 67324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinuint32_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) 6748b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten{ 6758b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6768b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten if (aps == 0) return 0; 6778b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return aps->getDevicesForStream(stream); 6788b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten} 6798b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 6808ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentaudio_io_handle_t AudioSystem::getOutputForEffect(effect_descriptor_t *desc) 6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getOutputForEffect(desc); 6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6878ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::registerEffect(effect_descriptor_t *desc, 6888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent audio_io_handle_t output, 6898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t strategy, 6908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session, 6918ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int id) 6928ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6938ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6948ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->registerEffect(desc, output, strategy, session, id); 6968ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6978ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6988ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::unregisterEffect(int id) 6998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 7008ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 7018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 7028ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->unregisterEffect(id); 7038ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 7048ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 70525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurentstatus_t AudioSystem::isStreamActive(int stream, bool* state, uint32_t inPastMs) { 70625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 70725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent if (aps == 0) return PERMISSION_DENIED; 70825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent *state = aps->isStreamActive(stream, inPastMs); 70925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return NO_ERROR; 71025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent} 71125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 71225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) { 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(AudioSystem::gLock); 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioPolicyService.clear(); 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService server died!"); 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 724