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 Laurent 17323f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurentstatus_t AudioSystem::isStreamActive(int stream, bool* state) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 17623f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent *state = af->isStreamActive(stream); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 184a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return af->setParameters(ioHandle, keyValuePairs); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 187a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 189a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 result = String8(""); 190a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return result; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = af->getParameters(ioHandle, keys); 193a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// convert volume steps to natural log scale 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// change this value to change volume scaling 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBPerStep = 0.5f; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// shouldn't need to touch these 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const float dBConvertInverse = 1.0f / dBConvert; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfloat AudioSystem::linearToLog(int volume) 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("linearToLog(%d)=%f", volume, v); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? exp(float(100 - volume) * dBConvert) : 0; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AudioSystem::logToLinear(float volume) 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGD("logTolinear(%d)=%f", v, volume); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return v; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 222a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 224a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 225a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 226a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 227a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 228a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 229a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 230a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 232a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 233a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 234a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 236a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 237ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 238a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 239a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 240a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 241a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = af->sampleRate(output); 242a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 243a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("getOutputSamplingRate() reading from output desc"); 244a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *samplingRate = outputDesc->samplingRate; 245a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 246a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 247a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 248ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 255a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 256a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 257a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 258a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 260a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 262a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 270a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 271a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 272a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 273a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = af->frameCount(output); 274a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 275a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *frameCount = outputDesc->frameCount; 276a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 277a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2783547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 279ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 286a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputDescriptor *outputDesc; 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t output; 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 289a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (streamType == DEFAULT) { 290a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent streamType = MUSIC; 291a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = getOutput((stream_type)streamType); 294a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (output == 0) { 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return PERMISSION_DENIED; 296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.lock(); 299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent outputDesc = AudioSystem::gOutputs.valueFor(output); 300a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (outputDesc == 0) { 301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 303a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (af == 0) return PERMISSION_DENIED; 304a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = af->latency(output); 305a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent *latency = outputDesc->latency; 307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gLock.unlock(); 308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3093547cc01246059ef52d36e0cc6d4c3877a94d6edEric Laurent 310ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount, 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t* buffSize) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values 319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (channelCount != gPrevInChannelCount)) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save the request params 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInSamplingRate = sampleRate; 323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent gPrevInFormat = format; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPrevInChannelCount = channelCount; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = 0; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (af == 0) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); 332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buffSize = gInBuffSize; 334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 338415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurentstatus_t AudioSystem::setVoiceVolume(float value) 339415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent{ 340415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 341415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent if (af == 0) return PERMISSION_DENIED; 342415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return af->setVoiceVolume(value); 343415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent} 344415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 3450986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurentstatus_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream) 3460986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent{ 3470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 3480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (af == 0) return PERMISSION_DENIED; 3490986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 3500986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (stream == DEFAULT) { 3510986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent stream = MUSIC; 3520986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 3530986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 3540986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent return af->getRenderPosition(halFrames, dspFrames, getOutput((stream_type)stream)); 3550986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent} 3560986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 35747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurentunsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { 35847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 35947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent unsigned int result = 0; 36047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent if (af == 0) return result; 361ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if (ioHandle == 0) return result; 36247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 36347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent result = af->getInputFramesLost(ioHandle); 36447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return result; 36547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent} 36647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 36765b65459e6ac59f8a257009df8014467ae0838eeEric Laurentint AudioSystem::newAudioSessionId() { 36865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 36965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (af == 0) return 0; 37065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return af->newAudioSessionId(); 37165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent} 37265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 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) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MUSIC: 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VOICE_CALL: 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BLUETOOTH_SCO: 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 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 509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setDeviceConnectionState(audio_devices device, 510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent device_connection_state state, 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 PERMISSION_DENIED; 515a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 516a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setDeviceConnectionState(device, state, device_address); 517a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 518a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 519a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioSystem::device_connection_state AudioSystem::getDeviceConnectionState(audio_devices device, 520a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *device_address) 521a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return DEVICE_STATE_UNAVAILABLE; 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 525a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getDeviceConnectionState(device, device_address); 526a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setPhoneState(int state) 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 531a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setPhoneState(state); 534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 536a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setRingerMode(uint32_t mode, uint32_t mask) 537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setRingerMode(mode, mask); 541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setForceUse(force_use usage, forced_config config) 544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 545a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setForceUse(usage, config); 548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioSystem::forced_config AudioSystem::getForceUse(force_use usage) 551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 553a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return FORCE_NONE; 554a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getForceUse(usage); 555a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 556a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getOutput(stream_type stream, 559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output_flags flags) 563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 564ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent audio_io_handle_t output = 0; 565ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Do not use stream to output map cache if the direct output 566ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // flag is set or if we are likely to use a direct output 567ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // (e.g voice call stream @ 8kHz could use BT SCO device and be routed to 568ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // a direct output on some platforms). 569ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // TODO: the output cache and stream to output mapping implementation needs to 570ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // be reworked for proper operation with direct outputs. This code is too specific 571ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // to the first use case we want to cover (Voice Recognition and Voice Dialer over 572ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent // Bluetooth SCO 573ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0 && 574ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent ((stream != AudioSystem::VOICE_CALL && stream != AudioSystem::BLUETOOTH_SCO) || 575ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent channels != AudioSystem::CHANNEL_OUT_MONO || 576ef9500fe53b6ec67b610207832b52f8bfbb20cd5Eric Laurent (samplingRate != 8000 && samplingRate != 16000))) { 577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = AudioSystem::gStreamOutputMap.valueFor(stream); 579ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream); 580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 581ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (output == 0) { 582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 583ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent output = aps->getOutput(stream, samplingRate, format, channels, flags); 585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0) { 586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(gLock); 587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gStreamOutputMap.add(stream, output); 588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return output; 591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5938ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::startOutput(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->startOutput(output, stream, session); 600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6028ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::stopOutput(audio_io_handle_t output, 6038ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent AudioSystem::stream_type stream, 6048ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session) 605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 6088ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->stopOutput(output, stream, session); 609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseOutput(audio_io_handle_t output) 612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseOutput(output); 616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentaudio_io_handle_t AudioSystem::getInput(int inputSource, 619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate, 620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format, 621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels, 622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_in_acoustics acoustics) 623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 625ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent if (aps == 0) return 0; 626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->getInput(inputSource, samplingRate, format, channels, acoustics); 627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::startInput(audio_io_handle_t input) 630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->startInput(input); 634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 635a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::stopInput(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->stopInput(input); 641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::releaseInput(audio_io_handle_t input) 644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return; 647a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent aps->releaseInput(input); 648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::initStreamVolume(stream_type stream, 651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMin, 652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int indexMax) 653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->initStreamVolume(stream, indexMin, indexMax); 657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index) 660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (aps == 0) return PERMISSION_DENIED; 663a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return aps->setStreamVolumeIndex(stream, index); 664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 666a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioSystem::getStreamVolumeIndex(stream_type 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->getStreamVolumeIndex(stream, index); 671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6738ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentuint32_t AudioSystem::getStrategyForStream(AudioSystem::stream_type stream) 6748ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6758ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6768ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return 0; 6778ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getStrategyForStream(stream); 6788ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6798ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6808ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentaudio_io_handle_t AudioSystem::getOutputForEffect(effect_descriptor_t *desc) 6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->getOutputForEffect(desc); 6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6878ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::registerEffect(effect_descriptor_t *desc, 6888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent audio_io_handle_t output, 6898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t strategy, 6908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session, 6918ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int id) 6928ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 6938ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6948ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 6958ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->registerEffect(desc, output, strategy, session, id); 6968ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 6978ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6988ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurentstatus_t AudioSystem::unregisterEffect(int id) 6998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent{ 7008ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 7018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent if (aps == 0) return PERMISSION_DENIED; 7028ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return aps->unregisterEffect(id); 7038ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent} 7048ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentvoid AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who) { 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Mutex::Autolock _l(AudioSystem::gLock); 709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::gAudioPolicyService.clear(); 710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGW("AudioPolicyService server died!"); 712a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// --------------------------------------------------------------------------- 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// use emulated popcount optimization 718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent// http://www.df.lth.se/~john_e/gems/gem002d.html 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentuint32_t AudioSystem::popCount(uint32_t u) 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x55555555) + ((u>>1)&0x55555555)); 722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x33333333) + ((u>>2)&0x33333333)); 723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f)); 724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff)); 725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent u = ( u&0x0000ffff) + (u>>16); 726a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return u; 727a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 729a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isOutputDevice(audio_devices device) 730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ((device & ~AudioSystem::DEVICE_OUT_ALL) == 0)) { 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isInputDevice(audio_devices device) 740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ((device & ~AudioSystem::DEVICE_IN_ALL) == 0)) { 743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isA2dpDevice(audio_devices device) 750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP | 753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER))) { 755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 758a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 760a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 761a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isBluetoothScoDevice(audio_devices device) 762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 763a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((popCount(device) == 1 ) && 764a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent (device & (AudioSystem::DEVICE_OUT_BLUETOOTH_SCO | 765a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 76636d41b8103a525a9a581c01740428ec9f9c782a2Eric Laurent AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 76736d41b8103a525a9a581c01740428ec9f9c782a2Eric Laurent AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET))) { 768a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 769a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 770a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 771a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 772a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 773a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isLowVisibility(stream_type stream) 775a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 776f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent if (stream == AudioSystem::SYSTEM || 777f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent stream == AudioSystem::NOTIFICATION || 778f5fe3949f5db69b19ce3fac7abce2088106f2e2bEric Laurent stream == AudioSystem::RING) { 779a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 780a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 781a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 782a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 783a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 784a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isInputChannel(uint32_t channel) 786a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 787a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((channel & ~AudioSystem::CHANNEL_IN_ALL) == 0) { 788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 792a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isOutputChannel(uint32_t channel) 795a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 796a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if ((channel & ~AudioSystem::CHANNEL_OUT_ALL) == 0) { 797a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 798a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 799a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 800a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 801a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 802a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 803a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isValidFormat(uint32_t format) 804a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 805a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (format & MAIN_FORMAT_MASK) { 806a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM: 807a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case MP3: 808a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AMR_NB: 809a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AMR_WB: 810a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case AAC: 811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case HE_AAC_V1: 812a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case HE_AAC_V2: 813a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case VORBIS: 814a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent default: 816a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 817a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 818a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 819a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 820a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentbool AudioSystem::isLinearPCM(uint32_t format) 821a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent switch (format) { 823a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM_16_BIT: 824a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case PCM_8_BIT: 825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return true; 826a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent default: 827a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return false; 828a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 829a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 830a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 831a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent//------------------------- AudioParameter class implementation --------------- 832a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 833a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyRouting = "routing"; 834a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keySamplingRate = "sampling_rate"; 835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyFormat = "format"; 836a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyChannels = "channels"; 837a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentconst char *AudioParameter::keyFrameCount = "frame_count"; 8382ba92c71b5684dce700cf848bf157153c156df1dJean-Michel Triviconst char *AudioParameter::keyInputSource = "input_source"; 839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 840a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioParameter::AudioParameter(const String8& keyValuePairs) 841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char *str = new char[keyValuePairs.length()+1]; 843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mKeyValuePairs = keyValuePairs; 844a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent strcpy(str, keyValuePairs.string()); 846a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char *pair = strtok(str, ";"); 847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent while (pair != NULL) { 848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (strlen(pair) != 0) { 849a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t eqIdx = strcspn(pair, "="); 850a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 key = String8(pair, eqIdx); 851a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 value; 852a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (eqIdx == strlen(pair)) { 853a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = String8(""); 854a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 855a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = String8(pair + eqIdx + 1); 856a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 857a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) < 0) { 858a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.add(key, value); 859a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 860a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.replaceValueFor(key, value); 861a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 862a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 863a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("AudioParameter() cstor empty key value pair"); 864a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent pair = strtok(NULL, ";"); 866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent delete[] str; 869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentAudioParameter::~AudioParameter() 872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.clear(); 874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric LaurentString8 AudioParameter::toString() 877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str = String8(""); 879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t size = mParameters.size(); 881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent for (size_t i = 0; i < size; i++) { 882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += mParameters.keyAt(i); 883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += "="; 884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent str += mParameters.valueAt(i); 885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (i < (size - 1)) str += ";"; 886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return str; 888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 889a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 890a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::add(const String8& key, const String8& value) 891a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) < 0) { 893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.add(key, value); 894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 896a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.replaceValueFor(key, value); 897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return ALREADY_EXISTS; 898a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 899a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 900a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 901a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::addInt(const String8& key, const int value) 902a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 903a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char str[12]; 904a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (snprintf(str, 12, "%d", value) > 0) { 905a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8 = String8(str); 906a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return add(key, str8); 907a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 908a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 910a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 911a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 912a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::addFloat(const String8& key, const float value) 913a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 914a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent char str[23]; 915a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (snprintf(str, 23, "%.10f", value) > 0) { 916a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8 = String8(str); 917a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return add(key, str8); 918a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 919a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 920a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 921a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 922a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 923a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::remove(const String8& key) 924a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 925a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) >= 0) { 926a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mParameters.removeItem(key); 927a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 928a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 929a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 930a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 931a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 932a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 933a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::get(const String8& key, String8& value) 934a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 935a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (mParameters.indexOfKey(key) >= 0) { 936a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = mParameters.valueFor(key); 937a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 938a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 939a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return BAD_VALUE; 940a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 941a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 942a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 943a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::getInt(const String8& key, int& value) 944a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 945a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8; 946a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t result = get(key, str8); 947a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = 0; 948a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (result == NO_ERROR) { 949a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int val; 950a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (sscanf(str8.string(), "%d", &val) == 1) { 951a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = val; 952a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 953a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = INVALID_OPERATION; 954a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 955a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 956a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 957a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 958a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 959a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatus_t AudioParameter::getFloat(const String8& key, float& value) 960a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 961a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 str8; 962a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t result = get(key, str8); 963a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = 0; 964a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (result == NO_ERROR) { 965a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float val; 966a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (sscanf(str8.string(), "%f", &val) == 1) { 967a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent value = val; 968a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } else { 969a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent result = INVALID_OPERATION; 970a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 971a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 972a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return result; 973a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 975327c27be19ad333c4835c84397152a0b2cb33081Eric Laurentstatus_t AudioParameter::getAt(size_t index, String8& key, String8& value) 976327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent{ 977327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent if (mParameters.size() > index) { 978327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent key = mParameters.keyAt(index); 979327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent value = mParameters.valueAt(index); 980327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent return NO_ERROR; 981327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent } else { 982327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent return BAD_VALUE; 983327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent } 984327c27be19ad333c4835c84397152a0b2cb33081Eric Laurent} 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 987