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 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// client singleton for AudioFlinger binder interface 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectMutex AudioSystem::gLock; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IAudioFlinger> AudioSystem::gAudioFlinger; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectaudio_error_callback AudioSystem::gAudioErrorCallback = NULL; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values 38a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<int, audio_io_handle_t> AudioSystem::gStreamOutputMap(0); 39a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(0); 40a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values for recording queries 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t AudioSystem::gPrevInSamplingRate = 16000; 4324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinint AudioSystem::gPrevInFormat = AUDIO_FORMAT_PCM_16_BIT; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::gPrevInChannelCount = 1; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t AudioSystem::gInBuffSize = 0; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// establish binder interface to AudioFlinger service 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst sp<IAudioFlinger>& AudioSystem::get_audio_flinger() 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(gLock); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlinger.get() == 0) { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> binder; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = sm->getService(String16("media.audio_flinger")); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (binder != 0) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger not published, waiting..."); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usleep(500000); // 0.5 s 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while(true); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlingerClient == NULL) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlingerClient = new AudioFlingerClient(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(NO_ERROR); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder->linkToDeath(gAudioFlingerClient); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger = interface_cast<IAudioFlinger>(binder); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger->registerClient(gAudioFlingerClient); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE_IF(gAudioFlinger==0, "no AudioFlinger!?"); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioFlinger; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::muteMicrophone(bool state) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMicMute(state); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::isMicrophoneMuted(bool* state) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *state = af->getMicMute(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterVolume(float value) 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterVolume(value); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterMute(bool mute) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterMute(mute); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterVolume(float* volume) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *volume = af->masterVolume(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterMute(bool* mute) 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->masterMute(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 123ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::setStreamVolume(int stream, float value, int output) 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent af->setStreamVolume(stream, value, output); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setStreamMute(int stream, bool mute) 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setStreamMute(stream, mute); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 141ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::getStreamVolume(int stream, float* volume, int output) 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 146a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *volume = af->streamVolume(stream, output); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getStreamMute(int stream, bool* mute) 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->streamMute(stream); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMode(int mode) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (mode >= AUDIO_MODE_CNT) return BAD_VALUE; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMode(mode); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 167a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 170a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return af->setParameters(ioHandle, keyValuePairs); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 173a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 175a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 result = String8(""); 176a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return result; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = af->getParameters(ioHandle, keys); 179a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// convert volume steps to natural log scale 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// change this value to change volume scaling 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBPerStep = 0.5f; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// shouldn't need to touch these 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvertInverse = 1.0f / dBConvert; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfloat AudioSystem::linearToLog(int volume) 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("linearToLog(%d)=%f", volume, v); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? exp(float(100 - volume) * dBConvert) : 0; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::logToLinear(float volume) 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("logTolinear(%d)=%f", v, volume); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 21124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 21224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 214a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 21524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 218a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 219a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 220a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 222a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 223ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 224a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 225a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 226a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 227a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = af->sampleRate(output); 228a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 229a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("getOutputSamplingRate() reading from output desc"); 230a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = outputDesc->samplingRate; 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 232a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 233a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 234ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 241a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 242a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 243a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 24424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 24524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 246a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 249a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 251a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 252a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 253a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 254a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 255a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 256a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 257a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 258a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = af->frameCount(output); 260a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 261a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = outputDesc->frameCount; 262a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2643547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 265ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 272a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 273a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 274a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 27524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 27624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin streamType = AUDIO_STREAM_MUSIC; 277a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin output = getOutput((audio_stream_type_t)streamType); 280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 281a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 282a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 283a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 284a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 285a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 286a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 289a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 290a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = af->latency(output); 291a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 292a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = outputDesc->latency; 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 294a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2953547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 296ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount, 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t* buffSize) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values 305a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (channelCount != gPrevInChannelCount)) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save the request params 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInSamplingRate = sampleRate; 309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gPrevInFormat = format; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInChannelCount = channelCount; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = 0; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); 318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buffSize = gInBuffSize; 320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 324415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurentstatus_t AudioSystem::setVoiceVolume(float value) 325415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent{ 326415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 327415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent if (af == 0) return PERMISSION_DENIED; 328415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return af->setVoiceVolume(value); 329415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent} 330415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 3310986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurentstatus_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream) 3320986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent{ 3330986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3340986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (af == 0) return PERMISSION_DENIED; 3350986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 33624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (stream == AUDIO_STREAM_DEFAULT) { 33724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin stream = AUDIO_STREAM_MUSIC; 3380986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 3390986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 34024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return af->getRenderPosition(halFrames, dspFrames, getOutput((audio_stream_type_t)stream)); 3410986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent} 3420986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 34347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurentunsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { 34447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 34547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent unsigned int result = 0; 34647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent if (af == 0) return result; 347ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if (ioHandle == 0) return result; 34847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 34947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent result = af->getInputFramesLost(ioHandle); 35047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return result; 35147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent} 35247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 35365b65459e6ac59f8a257009df8014467ae0838eeEric Laurentint AudioSystem::newAudioSessionId() { 35465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 35565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (af == 0) return 0; 35665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return af->newAudioSessionId(); 35765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent} 35865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 359c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissenvoid AudioSystem::acquireAudioSessionId(int audioSession) { 360c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 361c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen if (af != 0) { 362c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen af->acquireAudioSessionId(audioSession); 363c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen } 364c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen} 365c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen 366c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissenvoid AudioSystem::releaseAudioSessionId(int audioSession) { 367c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 368c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen if (af != 0) { 369c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen af->releaseAudioSessionId(audioSession); 370c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen } 371c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen} 372c74b93fdf3ddb6fdab7878edab4d304fb14917f9Marco Nelissen 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioFlinger.clear(); 379787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent // clear output handles and stream to output map caches 380787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gStreamOutputMap.clear(); 381787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gOutputs.clear(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(DEAD_OBJECT); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger server died!"); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentvoid AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) { 390a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() event %d", event); 391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *desc; 392a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t stream; 393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 394ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (ioHandle == 0) return; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (event) { 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case STREAM_CONFIG_CHANGED: 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream = *(uint32_t *)param2; 402ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %d", stream, ioHandle); 403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.indexOfKey(stream) >= 0) { 404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.replaceValueFor(stream, ioHandle); 405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_OPENED: { 408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) >= 0) { 409ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() opening already existing output! %d", ioHandle); 410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 411a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 414a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = new OutputDescriptor(*desc); 416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.add(ioHandle, outputDesc); 417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() new output samplingRate %d, format %d channels %d frameCount %d latency %d", 418a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc->samplingRate, outputDesc->format, outputDesc->channels, outputDesc->frameCount, outputDesc->latency); 419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CLOSED: { 421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) < 0) { 422ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() closing unknow output! %d", ioHandle); 423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 424a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 425ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() output %d closed", ioHandle); 426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.removeItem(ioHandle); 428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent for (int i = gStreamOutputMap.size() - 1; i >= 0 ; i--) { 429a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.valueAt(i) == ioHandle) { 430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.removeItemsAt(i); 431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 433a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 434a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 435a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CONFIG_CHANGED: { 436a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int index = gOutputs.indexOfKey(ioHandle); 437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (index < 0) { 438ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle); 439a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 440a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 441a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 442a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 443a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 444ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() new config for output %d samplingRate %d, format %d channels %d frameCount %d latency %d", 445a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ioHandle, desc->samplingRate, desc->format, 446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc->channels, desc->frameCount, desc->latency); 447a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = gOutputs.valueAt(index); 448a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent delete outputDesc; 449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = new OutputDescriptor(*desc); 450a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.replaceValueFor(ioHandle, outputDesc); 451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 452a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_OPENED: 453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CLOSED: 454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CONFIG_CHANGED: 455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 4563547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 460a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::setErrorCallback(audio_error_callback cb) { 461a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioErrorCallback = cb; 463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 464a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AudioSystem::routedToA2dpOutput(int streamType) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(streamType) { 46724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_MUSIC: 46824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_VOICE_CALL: 46924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_BLUETOOTH_SCO: 47024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin case AUDIO_STREAM_SYSTEM: 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// client singleton for AudioPolicyService binder interface 479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 480a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 481a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 483a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// establish binder interface to AudioFlinger service 484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service() 485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyService.get() == 0) { 488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IServiceManager> sm = defaultServiceManager(); 489a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IBinder> binder; 490a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent do { 491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder = sm->getService(String16("media.audio_policy")); 492a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (binder != 0) 493a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 494a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService not published, waiting..."); 495a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent usleep(500000); // 0.5 s 496a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } while(true); 497a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyServiceClient == NULL) { 498a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 499a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 500a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder->linkToDeath(gAudioPolicyServiceClient); 501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 502a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 503a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 504a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioPolicyService; 507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 50924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setDeviceConnectionState(audio_devices_t device, 51024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_policy_dev_state_t state, 51124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin const char *device_address) 512a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 514dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent const char *address = ""; 515dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent 516a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 517a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 518dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent if (device_address != NULL) { 519dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent address = device_address; 520dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent } 521dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent 522dca56b9432e2cc851d1a58920071fed2e1e3d142Eric Laurent return aps->setDeviceConnectionState(device, state, address); 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 52524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device, 526a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *device_address) 527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 52924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 531a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getDeviceConnectionState(device, device_address); 532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setPhoneState(int state) 535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 536a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setPhoneState(state); 540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setRingerMode(uint32_t mode, uint32_t mask) 543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 545a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setRingerMode(mode, mask); 547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 54924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 553a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setForceUse(usage, config); 554a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 555a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 55624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) 557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 55924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if (aps == 0) return AUDIO_POLICY_FORCE_NONE; 560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getForceUse(usage); 561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 56424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinaudio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream, 565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 567a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 56824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_policy_output_flags_t flags) 569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 570ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent audio_io_handle_t output = 0; 571ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Do not use stream to output map cache if the direct output 572ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // flag is set or if we are likely to use a direct output 573ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // (e.g voice call stream @ 8kHz could use BT SCO device and be routed to 574ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // a direct output on some platforms). 575ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // TODO: the output cache and stream to output mapping implementation needs to 576ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // be reworked for proper operation with direct outputs. This code is too specific 577ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // to the first use case we want to cover (Voice Recognition and Voice Dialer over 578ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Bluetooth SCO 57924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if ((flags & AUDIO_POLICY_OUTPUT_FLAG_DIRECT) == 0 && 58024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin ((stream != AUDIO_STREAM_VOICE_CALL && stream != AUDIO_STREAM_BLUETOOTH_SCO) || 58124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin channels != AUDIO_CHANNEL_OUT_MONO || 582ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent (samplingRate != 8000 && samplingRate != 16000))) { 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = AudioSystem::gStreamOutputMap.valueFor(stream); 585ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream); 586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 587ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (output == 0) { 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 589ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = aps->getOutput(stream, samplingRate, format, channels, flags); 59124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin if ((flags & AUDIO_POLICY_OUTPUT_FLAG_DIRECT) == 0) { 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gStreamOutputMap.add(stream, output); 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return output; 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::startOutput(audio_io_handle_t output, 60024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t stream, 6018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 602a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 6058ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->startOutput(output, stream, session); 606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6088ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::stopOutput(audio_io_handle_t output, 60924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin audio_stream_type_t stream, 6108ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 6148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->stopOutput(output, stream, session); 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseOutput(audio_io_handle_t output) 618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseOutput(output); 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getInput(int inputSource, 625a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 628464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent audio_in_acoustics_t acoustics, 629464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent int sessionId) 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 632ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 633464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent return aps->getInput(inputSource, samplingRate, format, channels, acoustics, sessionId); 634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 635a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::startInput(audio_io_handle_t input) 637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->startInput(input); 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::stopInput(audio_io_handle_t input) 644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 647a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->stopInput(input); 648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseInput(audio_io_handle_t input) 651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseInput(input); 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 65724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::initStreamVolume(audio_stream_type_t stream, 658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMin, 659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMax) 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->initStreamVolume(stream, indexMin, indexMax); 664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 66624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index) 667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 668a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 669a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 670a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setStreamVolumeIndex(stream, index); 671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 67324fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinstatus_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream, int *index) 674a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 675a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getStreamVolumeIndex(stream, index); 678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 68024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinuint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) 6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return 0; 6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getStrategyForStream(stream); 6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 68724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavinuint32_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) 6888b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten{ 6898b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6908b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten if (aps == 0) return 0; 6918b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten return aps->getDevicesForStream(stream); 6928b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten} 6938b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 6948ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentaudio_io_handle_t AudioSystem::getOutputForEffect(effect_descriptor_t *desc) 6958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6968ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6978ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6988ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getOutputForEffect(desc); 6998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 7008ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 7018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::registerEffect(effect_descriptor_t *desc, 702464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent audio_io_handle_t io, 7038ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t strategy, 7048ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session, 7058ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int id) 7068ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 7078ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 7088ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 709464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent return aps->registerEffect(desc, io, strategy, session, id); 7108ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 7118ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 7128ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::unregisterEffect(int id) 7138ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 7148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 7158ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 7168ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->unregisterEffect(id); 7178ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 7188ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 7196752ec80b25cb1f39507d18745c7e62323772cdaEric Laurentstatus_t AudioSystem::setEffectEnabled(int id, bool enabled) 7206752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent{ 7216752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 7226752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent if (aps == 0) return PERMISSION_DENIED; 7236752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent return aps->setEffectEnabled(id, enabled); 7246752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent} 7256752ec80b25cb1f39507d18745c7e62323772cdaEric Laurent 726464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurentstatus_t AudioSystem::isStreamActive(int stream, bool* state, uint32_t inPastMs) 727464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent{ 72825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 72925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent if (aps == 0) return PERMISSION_DENIED; 730464d5b3da21c84ba13dc69c611d40f6bed49badbEric Laurent if (state == NULL) return BAD_VALUE; 73125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent *state = aps->isStreamActive(stream, inPastMs); 73225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return NO_ERROR; 73325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent} 73425101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 73525101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 73605ce0941649c3cdd7f8034496719e607977fc005Eric Laurentvoid AudioSystem::clearAudioConfigCache() 73705ce0941649c3cdd7f8034496719e607977fc005Eric Laurent{ 73805ce0941649c3cdd7f8034496719e607977fc005Eric Laurent Mutex::Autolock _l(gLock); 73905ce0941649c3cdd7f8034496719e607977fc005Eric Laurent LOGV("clearAudioConfigCache()"); 74005ce0941649c3cdd7f8034496719e607977fc005Eric Laurent gStreamOutputMap.clear(); 74105ce0941649c3cdd7f8034496719e607977fc005Eric Laurent gOutputs.clear(); 74205ce0941649c3cdd7f8034496719e607977fc005Eric Laurent} 74305ce0941649c3cdd7f8034496719e607977fc005Eric Laurent 744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) { 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(AudioSystem::gLock); 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioPolicyService.clear(); 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService server died!"); 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 755