AudioSystem.cpp revision 25101b0b9a84571ead15b26e9f4cd9c4298d7823
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 26a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// ---------------------------------------------------------------------------- 27a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// the sim build doesn't have gettid 28a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 29a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#ifndef HAVE_GETTID 30a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent# define gettid getpid 31a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#endif 32a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 33a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// ---------------------------------------------------------------------------- 34a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// client singleton for AudioFlinger binder interface 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectMutex AudioSystem::gLock; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IAudioFlinger> AudioSystem::gAudioFlinger; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectaudio_error_callback AudioSystem::gAudioErrorCallback = NULL; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values 43a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<int, audio_io_handle_t> AudioSystem::gStreamOutputMap(0); 44a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentDefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(0); 45a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Cached values for recording queries 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t AudioSystem::gPrevInSamplingRate = 16000; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::gPrevInFormat = AudioSystem::PCM_16_BIT; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::gPrevInChannelCount = 1; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t AudioSystem::gInBuffSize = 0; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// establish binder interface to AudioFlinger service 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst sp<IAudioFlinger>& AudioSystem::get_audio_flinger() 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(gLock); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlinger.get() == 0) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> binder; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = sm->getService(String16("media.audio_flinger")); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (binder != 0) 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger not published, waiting..."); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usleep(500000); // 0.5 s 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while(true); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioFlingerClient == NULL) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlingerClient = new AudioFlingerClient(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(NO_ERROR); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder->linkToDeath(gAudioFlingerClient); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger = interface_cast<IAudioFlinger>(binder); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioFlinger->registerClient(gAudioFlingerClient); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE_IF(gAudioFlinger==0, "no AudioFlinger!?"); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioFlinger; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::muteMicrophone(bool state) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMicMute(state); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::isMicrophoneMuted(bool* state) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *state = af->getMicMute(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterVolume(float value) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterVolume(value); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMasterMute(bool mute) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setMasterMute(mute); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterVolume(float* volume) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *volume = af->masterVolume(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getMasterMute(bool* mute) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->masterMute(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::setStreamVolume(int stream, float value, int output) 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 133a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent af->setStreamVolume(stream, value, output); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setStreamMute(int stream, bool mute) 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project af->setStreamMute(stream, mute); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 146ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentstatus_t AudioSystem::getStreamVolume(int stream, float* volume, int output) 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 151a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *volume = af->streamVolume(stream, output); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getStreamMute(int stream, bool* mute) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mute = af->streamMute(stream); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::setMode(int mode) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode >= NUM_MODES) return BAD_VALUE; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return af->setMode(mode); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 172a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 175a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return af->setParameters(ioHandle, keyValuePairs); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 result = String8(""); 181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return result; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = af->getParameters(ioHandle, keys); 184a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// convert volume steps to natural log scale 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// change this value to change volume scaling 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBPerStep = 0.5f; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// shouldn't need to touch these 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvertInverse = 1.0f / dBConvert; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfloat AudioSystem::linearToLog(int volume) 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("linearToLog(%d)=%f", volume, v); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? exp(float(100 - volume) * dBConvert) : 0; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::logToLinear(float volume) 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("logTolinear(%d)=%f", v, volume); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 214a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 218a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 219a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 220a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 222a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 224a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 225a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 226a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 227a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 228ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 229a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 230a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 232a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = af->sampleRate(output); 233a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 234a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("getOutputSamplingRate() reading from output desc"); 235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = outputDesc->samplingRate; 236a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 237a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 238a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 239ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 246a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 247a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 248a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 249a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 251a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 253a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 254a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 255a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 256a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 257a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 258a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 260a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 261a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 262a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = af->frameCount(output); 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = outputDesc->frameCount; 267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2693547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 270ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 277a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 278a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 279a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 281a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 282a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 284a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 285a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 286a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 289a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 290a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 291a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 292a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 294a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = af->latency(output); 296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = outputDesc->latency; 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3003547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 301ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount, 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t* buffSize) 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values 310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (channelCount != gPrevInChannelCount)) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save the request params 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInSamplingRate = sampleRate; 314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gPrevInFormat = format; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInChannelCount = channelCount; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = 0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); 323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buffSize = gInBuffSize; 325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurentstatus_t AudioSystem::setVoiceVolume(float value) 330415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent{ 331415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 332415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent if (af == 0) return PERMISSION_DENIED; 333415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return af->setVoiceVolume(value); 334415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent} 335415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 3360986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurentstatus_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream) 3370986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent{ 3380986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3390986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (af == 0) return PERMISSION_DENIED; 3400986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 3410986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (stream == DEFAULT) { 3420986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent stream = MUSIC; 3430986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 3440986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 3450986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent return af->getRenderPosition(halFrames, dspFrames, getOutput((stream_type)stream)); 3460986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent} 3470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 34847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurentunsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { 34947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 35047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent unsigned int result = 0; 35147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent if (af == 0) return result; 352ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if (ioHandle == 0) return result; 35347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 35447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent result = af->getInputFramesLost(ioHandle); 35547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return result; 35647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent} 35747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 35865b65459e6ac59f8a257009df8014467ae0838eeEric Laurentint AudioSystem::newAudioSessionId() { 35965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 36065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (af == 0) return 0; 36165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return af->newAudioSessionId(); 36265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent} 36365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioFlinger.clear(); 370787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent // clear output handles and stream to output map caches 371787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gStreamOutputMap.clear(); 372787aa597d497ffd3019fb64c244a1e944a5f8453Eric Laurent AudioSystem::gOutputs.clear(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gAudioErrorCallback) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAudioErrorCallback(DEAD_OBJECT); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("AudioFlinger server died!"); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 380ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurentvoid AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) { 381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() event %d", event); 382a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *desc; 383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t stream; 384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 385ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (ioHandle == 0) return; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(AudioSystem::gLock); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (event) { 390a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case STREAM_CONFIG_CHANGED: 391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 392a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream = *(uint32_t *)param2; 393ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %d", stream, ioHandle); 394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.indexOfKey(stream) >= 0) { 395a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.replaceValueFor(stream, ioHandle); 396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_OPENED: { 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) >= 0) { 400ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() opening already existing output! %d", ioHandle); 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = new OutputDescriptor(*desc); 407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.add(ioHandle, outputDesc); 408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("ioConfigChanged() new output samplingRate %d, format %d channels %d frameCount %d latency %d", 409a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc->samplingRate, outputDesc->format, outputDesc->channels, outputDesc->frameCount, outputDesc->latency); 410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 411a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CLOSED: { 412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gOutputs.indexOfKey(ioHandle) < 0) { 413ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() closing unknow output! %d", ioHandle); 414a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 416ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() output %d closed", ioHandle); 417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 418a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.removeItem(ioHandle); 419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent for (int i = gStreamOutputMap.size() - 1; i >= 0 ; i--) { 420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gStreamOutputMap.valueAt(i) == ioHandle) { 421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gStreamOutputMap.removeItemsAt(i); 422a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 424a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OUTPUT_CONFIG_CHANGED: { 427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int index = gOutputs.indexOfKey(ioHandle); 428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (index < 0) { 429ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle); 430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (param2 == 0) break; 433a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc = (OutputDescriptor *)param2; 434a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 435ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("ioConfigChanged() new config for output %d samplingRate %d, format %d channels %d frameCount %d latency %d", 436a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ioHandle, desc->samplingRate, desc->format, 437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent desc->channels, desc->frameCount, desc->latency); 438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc = gOutputs.valueAt(index); 439a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent delete outputDesc; 440a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = new OutputDescriptor(*desc); 441a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gOutputs.replaceValueFor(ioHandle, outputDesc); 442a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 443a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_OPENED: 444a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CLOSED: 445a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case INPUT_CONFIG_CHANGED: 446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 4473547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::setErrorCallback(audio_error_callback cb) { 452a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioErrorCallback = cb; 454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AudioSystem::routedToA2dpOutput(int streamType) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(streamType) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MUSIC: 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VOICE_CALL: 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BLUETOOTH_SCO: 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SYSTEM: 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// client singleton for AudioPolicyService binder interface 470a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentsp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 472a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 473a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 474a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// establish binder interface to AudioFlinger service 475a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service() 476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyService.get() == 0) { 479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IServiceManager> sm = defaultServiceManager(); 480a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IBinder> binder; 481a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent do { 482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder = sm->getService(String16("media.audio_policy")); 483a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (binder != 0) 484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent break; 485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService not published, waiting..."); 486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent usleep(500000); // 0.5 s 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } while(true); 488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (gAudioPolicyServiceClient == NULL) { 489a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 490a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent binder->linkToDeath(gAudioPolicyServiceClient); 492a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 493a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 494a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 495a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 496a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 497a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return gAudioPolicyService; 498a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 499a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 500a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setDeviceConnectionState(audio_devices device, 501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent device_connection_state state, 502a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *device_address) 503a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 504a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setDeviceConnectionState(device, state, device_address); 508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioSystem::device_connection_state AudioSystem::getDeviceConnectionState(audio_devices device, 511a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *device_address) 512a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 514a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return DEVICE_STATE_UNAVAILABLE; 515a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 516a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getDeviceConnectionState(device, device_address); 517a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 518a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 519a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setPhoneState(int state) 520a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 521a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setPhoneState(state); 525a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 526a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setRingerMode(uint32_t mode, uint32_t mask) 528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 531a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setRingerMode(mode, mask); 532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setForceUse(force_use usage, forced_config config) 535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 536a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setForceUse(usage, config); 539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioSystem::forced_config AudioSystem::getForceUse(force_use usage) 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return FORCE_NONE; 545a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getForceUse(usage); 546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getOutput(stream_type stream, 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 553a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output_flags flags) 554a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 555ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent audio_io_handle_t output = 0; 556ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Do not use stream to output map cache if the direct output 557ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // flag is set or if we are likely to use a direct output 558ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // (e.g voice call stream @ 8kHz could use BT SCO device and be routed to 559ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // a direct output on some platforms). 560ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // TODO: the output cache and stream to output mapping implementation needs to 561ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // be reworked for proper operation with direct outputs. This code is too specific 562ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // to the first use case we want to cover (Voice Recognition and Voice Dialer over 563ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Bluetooth SCO 564ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0 && 565ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent ((stream != AudioSystem::VOICE_CALL && stream != AudioSystem::BLUETOOTH_SCO) || 566ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent channels != AudioSystem::CHANNEL_OUT_MONO || 567ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent (samplingRate != 8000 && samplingRate != 16000))) { 568a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = AudioSystem::gStreamOutputMap.valueFor(stream); 570ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream); 571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 572ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (output == 0) { 573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 574ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = aps->getOutput(stream, samplingRate, format, channels, flags); 576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0) { 577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gStreamOutputMap.add(stream, output); 579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 581a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return output; 582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::startOutput(audio_io_handle_t output, 5858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent AudioSystem::stream_type stream, 5868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 5908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->startOutput(output, stream, session); 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5938ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::stopOutput(audio_io_handle_t output, 5948ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent AudioSystem::stream_type stream, 5958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 5998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->stopOutput(output, stream, session); 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 602a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseOutput(audio_io_handle_t output) 603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseOutput(output); 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getInput(int inputSource, 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_in_acoustics acoustics) 614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 616ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getInput(inputSource, samplingRate, format, channels, acoustics); 618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::startInput(audio_io_handle_t input) 621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->startInput(input); 625a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::stopInput(audio_io_handle_t input) 628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->stopInput(input); 632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseInput(audio_io_handle_t input) 635a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseInput(input); 639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::initStreamVolume(stream_type stream, 642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMin, 643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMax) 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->initStreamVolume(stream, indexMin, indexMax); 648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index) 651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setStreamVolumeIndex(stream, index); 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getStreamVolumeIndex(stream_type stream, int *index) 658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getStreamVolumeIndex(stream, index); 662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 663a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6648ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentuint32_t AudioSystem::getStrategyForStream(AudioSystem::stream_type stream) 6658ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6668ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6678ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return 0; 6688ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getStrategyForStream(stream); 6698ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6708ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6718ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentaudio_io_handle_t AudioSystem::getOutputForEffect(effect_descriptor_t *desc) 6728ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6738ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6748ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6758ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getOutputForEffect(desc); 6768ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6778ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6788ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::registerEffect(effect_descriptor_t *desc, 6798ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent audio_io_handle_t output, 6808ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t strategy, 6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session, 6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int id) 6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->registerEffect(desc, output, strategy, session, id); 6878ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::unregisterEffect(int id) 6908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6918ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6928ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6938ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->unregisterEffect(id); 6948ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 69625101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurentstatus_t AudioSystem::isStreamActive(int stream, bool* state, uint32_t inPastMs) { 69725101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 69825101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent if (aps == 0) return PERMISSION_DENIED; 69925101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent *state = aps->isStreamActive(stream, inPastMs); 70025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent return NO_ERROR; 70125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent} 70225101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 70325101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurent 704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) { 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(AudioSystem::gLock); 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioPolicyService.clear(); 709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService server died!"); 711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 712a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// use emulated popcount optimization 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// http://www.df.lth.se/~john_e/gems/gem002d.html 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentuint32_t AudioSystem::popCount(uint32_t u) 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x55555555) + ((u>>1)&0x55555555)); 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x33333333) + ((u>>2)&0x33333333)); 722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f)); 723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff)); 724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ( u&0x0000ffff) + (u>>16); 725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return u; 726a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 727a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isOutputDevice(audio_devices device) 729a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ((device & ~AudioSystem::DEVICE_OUT_ALL) == 0)) { 732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isInputDevice(audio_devices device) 739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ((device & ~AudioSystem::DEVICE_IN_ALL) == 0)) { 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isA2dpDevice(audio_devices device) 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP | 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER))) { 754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 758a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 760a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isBluetoothScoDevice(audio_devices device) 761a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 763a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_SCO | 764a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 765c6ea35372854521ea059eccaba5958a920228959Eric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 766c6ea35372854521ea059eccaba5958a920228959Eric Laurent AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET))) { 767a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 768a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 769a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 770a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 771a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 772a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 773a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isLowVisibility(stream_type stream) 774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 775f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent if (stream == AudioSystem::SYSTEM || 776f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent stream == AudioSystem::NOTIFICATION || 777f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent stream == AudioSystem::RING) { 778a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 779a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 780a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 781a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 782a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 783a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 784a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isInputChannel(uint32_t channel) 785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 786a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((channel & ~AudioSystem::CHANNEL_IN_ALL) == 0) { 787a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 792a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isOutputChannel(uint32_t channel) 794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 795a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((channel & ~AudioSystem::CHANNEL_OUT_ALL) == 0) { 796a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 797a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 798a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 799a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 800a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 801a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 802a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isValidFormat(uint32_t format) 803a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 804a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (format & MAIN_FORMAT_MASK) { 805a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM: 806a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case MP3: 807a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AMR_NB: 808a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AMR_WB: 809a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AAC: 810a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case HE_AAC_V1: 811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case HE_AAC_V2: 812a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case VORBIS: 813a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 814a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent default: 815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 816a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 817a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 818a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 819a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isLinearPCM(uint32_t format) 820a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 821a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (format) { 822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM_16_BIT: 823a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM_8_BIT: 824a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent default: 826a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 827a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 828a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 829a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 830a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent//------------------------- AudioParameter class implementation --------------- 831a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 832a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyRouting = "routing"; 833a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keySamplingRate = "sampling_rate"; 834a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyFormat = "format"; 835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyChannels = "channels"; 836a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyFrameCount = "frame_count"; 8371a22bdb01ac4068c2876fe2d02f3c4c729669a1cJean-Michel Triviconst char *AudioParameter::keyInputSource = "input_source"; 838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioParameter::AudioParameter(const String8& keyValuePairs) 840a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char *str = new char[keyValuePairs.length()+1]; 842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mKeyValuePairs = keyValuePairs; 843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 844a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent strcpy(str, keyValuePairs.string()); 845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char *pair = strtok(str, ";"); 846a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent while (pair != NULL) { 847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (strlen(pair) != 0) { 848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t eqIdx = strcspn(pair, "="); 849a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 key = String8(pair, eqIdx); 850a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 value; 851a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (eqIdx == strlen(pair)) { 852a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = String8(""); 853a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 854a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = String8(pair + eqIdx + 1); 855a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 856a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) < 0) { 857a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.add(key, value); 858a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 859a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.replaceValueFor(key, value); 860a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 861a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 862a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("AudioParameter() cstor empty key value pair"); 863a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 864a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent pair = strtok(NULL, ";"); 865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent delete[] str; 868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioParameter::~AudioParameter() 871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.clear(); 873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioParameter::toString() 876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str = String8(""); 878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t size = mParameters.size(); 880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent for (size_t i = 0; i < size; i++) { 881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += mParameters.keyAt(i); 882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += "="; 883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += mParameters.valueAt(i); 884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (i < (size - 1)) str += ";"; 885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return str; 887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 889a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::add(const String8& key, const String8& value) 890a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 891a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) < 0) { 892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.add(key, value); 893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.replaceValueFor(key, value); 896a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return ALREADY_EXISTS; 897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 898a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 899a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 900a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::addInt(const String8& key, const int value) 901a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 902a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char str[12]; 903a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (snprintf(str, 12, "%d", value) > 0) { 904a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8 = String8(str); 905a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return add(key, str8); 906a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 907a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 908a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 910a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 911a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::addFloat(const String8& key, const float value) 912a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 913a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char str[23]; 914a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (snprintf(str, 23, "%.10f", value) > 0) { 915a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8 = String8(str); 916a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return add(key, str8); 917a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 918a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 919a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 920a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 921a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 922a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::remove(const String8& key) 923a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 924a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) >= 0) { 925a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.removeItem(key); 926a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 927a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 928a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 929a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 930a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 931a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 932a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::get(const String8& key, String8& value) 933a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 934a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) >= 0) { 935a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = mParameters.valueFor(key); 936a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 937a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 938a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 939a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 940a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 941a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 942a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::getInt(const String8& key, int& value) 943a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 944a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8; 945a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t result = get(key, str8); 946a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = 0; 947a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (result == NO_ERROR) { 948a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int val; 949a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (sscanf(str8.string(), "%d", &val) == 1) { 950a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = val; 951a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 952a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = INVALID_OPERATION; 953a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 954a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 955a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 956a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 957a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 958a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::getFloat(const String8& key, float& value) 959a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 960a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8; 961a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t result = get(key, str8); 962a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = 0; 963a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (result == NO_ERROR) { 964a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float val; 965a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (sscanf(str8.string(), "%f", &val) == 1) { 966a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = val; 967a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 968a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = INVALID_OPERATION; 969a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 970a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 971a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 972a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 974327c27be19ad333c4835c84397152a0b2cb33081Eric Laurentstatus_t AudioParameter::getAt(size_t index, String8& key, String8& value) 975327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent{ 976327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent if (mParameters.size() > index) { 977327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent key = mParameters.keyAt(index); 978327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent value = mParameters.valueAt(index); 979327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent return NO_ERROR; 980327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent } else { 981327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent return BAD_VALUE; 982327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent } 983327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent} 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 986