AudioSystem.cpp revision f613d42b12389335b2ecf06df18d0d095d6bfd44
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "AudioSystem" 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 217562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioSystem.h> 231ab85ec401801ef9a9184650d0f5a1639b45eeb9Glenn Kasten#include <media/IAudioFlinger.h> 24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <math.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2764760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 28fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 29c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 30c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// client singleton for AudioFlinger binder interface 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMutex AudioSystem::gLock; 35f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric LaurentMutex AudioSystem::gLockCache; 36d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn KastenMutex AudioSystem::gLockAPS; 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<IAudioFlinger> AudioSystem::gAudioFlinger; 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectsp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectaudio_error_callback AudioSystem::gAudioErrorCallback = NULL; 40f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trividynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL; 41211eeaf17e5565b68447d29799dbf158a33cf4cfGlenn Kasten 422301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten// Cached values for output handles 439ea65d0f4a564478343b1a722fae4ce5883670c3Glenn KastenDefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(NULL); 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 45f8c1a6f7ef515810356816b50bfe18af95f3ec32Glenn Kasten// Cached values for recording queries, all protected by gLock 465446e541367061b53f45f3fd4600f9060680bca3Glenn Kastenuint32_t AudioSystem::gPrevInSamplingRate; 475446e541367061b53f45f3fd4600f9060680bca3Glenn Kastenaudio_format_t AudioSystem::gPrevInFormat; 485446e541367061b53f45f3fd4600f9060680bca3Glenn Kastenaudio_channel_mask_t AudioSystem::gPrevInChannelMask; 495446e541367061b53f45f3fd4600f9060680bca3Glenn Kastensize_t AudioSystem::gInBuffSize = 0; // zero indicates cache is invalid 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// establish binder interface to AudioFlinger service 520ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurentconst sp<IAudioFlinger> AudioSystem::get_audio_flinger() 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 540ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IAudioFlinger> af; 550ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<AudioFlingerClient> afc; 560ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent { 570ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent Mutex::Autolock _l(gLock); 580ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (gAudioFlinger == 0) { 590ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IServiceManager> sm = defaultServiceManager(); 600ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IBinder> binder; 610ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent do { 620ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent binder = sm->getService(String16("media.audio_flinger")); 630ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (binder != 0) 640ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent break; 650ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent ALOGW("AudioFlinger not published, waiting..."); 660ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent usleep(500000); // 0.5 s 670ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } while (true); 680ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (gAudioFlingerClient == NULL) { 690ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent gAudioFlingerClient = new AudioFlingerClient(); 700ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } else { 710ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (gAudioErrorCallback) { 720ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent gAudioErrorCallback(NO_ERROR); 730ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 750ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent binder->linkToDeath(gAudioFlingerClient); 760ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent gAudioFlinger = interface_cast<IAudioFlinger>(binder); 770ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0); 780ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent afc = gAudioFlingerClient; 79e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 800ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent af = gAudioFlinger; 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 820ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (afc != 0) { 830ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent af->registerClient(afc); 840ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } 850ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent return af; 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8846291616486979986cba3ab83e894728ef53063fEric Laurent/* static */ status_t AudioSystem::checkAudioFlinger() 8946291616486979986cba3ab83e894728ef53063fEric Laurent{ 9046291616486979986cba3ab83e894728ef53063fEric Laurent if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) { 9146291616486979986cba3ab83e894728ef53063fEric Laurent return NO_ERROR; 9246291616486979986cba3ab83e894728ef53063fEric Laurent } 9346291616486979986cba3ab83e894728ef53063fEric Laurent return DEAD_OBJECT; 9446291616486979986cba3ab83e894728ef53063fEric Laurent} 9546291616486979986cba3ab83e894728ef53063fEric Laurent 964944acb7355b3aa25748fd25945a363a69d65444Glenn Kastenstatus_t AudioSystem::muteMicrophone(bool state) 974944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return af->setMicMute(state); 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1034944acb7355b3aa25748fd25945a363a69d65444Glenn Kastenstatus_t AudioSystem::isMicrophoneMuted(bool* state) 1044944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *state = af->getMicMute(); 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t AudioSystem::setMasterVolume(float value) 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project af->setMasterVolume(value); 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t AudioSystem::setMasterMute(bool mute) 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project af->setMasterMute(mute); 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t AudioSystem::getMasterVolume(float* volume) 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *volume = af->masterVolume(); 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t AudioSystem::getMasterMute(bool* mute) 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *mute = af->masterMute(); 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kastenstatus_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value, 14472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 146fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent af->setStreamVolume(stream, value, output); 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 155fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project af->setStreamMute(stream, mute); 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kastenstatus_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume, 16372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 165fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *volume = af->streamVolume(stream, output); 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 172fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute) 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 174fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *mute = af->streamMute(stream); 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 181f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kastenstatus_t AudioSystem::setMode(audio_mode_t mode) 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 183930f4caa1e311ef7ff538c421a324396157eb24fGlenn Kasten if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE; 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return af->setMode(mode); 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1894944acb7355b3aa25748fd25945a363a69d65444Glenn Kastenstatus_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 1904944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (af == 0) return PERMISSION_DENIED; 193c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return af->setParameters(ioHandle, keyValuePairs); 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1964944acb7355b3aa25748fd25945a363a69d65444Glenn KastenString8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) 1974944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 result = String8(""); 200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (af == 0) return result; 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 202c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent result = af->getParameters(ioHandle, keys); 203c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return result; 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 206c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kastenstatus_t AudioSystem::setParameters(const String8& keyValuePairs) 207c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten{ 208142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs); 209c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten} 210c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten 211c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn KastenString8 AudioSystem::getParameters(const String8& keys) 212c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten{ 213142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten return getParameters(AUDIO_IO_HANDLE_NONE, keys); 214c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten} 215c23885ebb142b9da31543789ecc3f7cf7111bc67Glenn Kasten 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// convert volume steps to natural log scale 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// change this value to change volume scaling 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic const float dBPerStep = 0.5f; 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// shouldn't need to touch these 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic const float dBConvertInverse = 1.0f / dBConvert; 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectfloat AudioSystem::linearToLog(int volume) 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 227b8a805261bf0282e992d3608035e47d05a898710Steve Block // ALOGD("linearToLog(%d)=%f", volume, v); 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // return v; 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return volume ? exp(float(100 - volume) * dBConvert) : 0; 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint AudioSystem::logToLinear(float volume) 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 235b8a805261bf0282e992d3608035e47d05a898710Steve Block // ALOGD("logTolinear(%d)=%f", v, volume); 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // return v; 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2403b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kastenstatus_t AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType) 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 242c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output; 243c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 244fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 245fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin streamType = AUDIO_STREAM_MUSIC; 246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 248fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten output = getOutput(streamType); 249c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (output == 0) { 250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return PERMISSION_DENIED; 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 253b7f24b101d43139b4c747129bfbc4ecf5c468b86Jean-Michel Trivi return getSamplingRate(output, samplingRate); 2541a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent} 2551a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 2561a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurentstatus_t AudioSystem::getSamplingRate(audio_io_handle_t output, 2573b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten uint32_t* samplingRate) 2581a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent{ 259f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 260f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent if (af == 0) return PERMISSION_DENIED; 261f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent 262f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 2631a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 264f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent OutputDescriptor *outputDesc = AudioSystem::gOutputs.valueFor(output); 265a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (outputDesc == NULL) { 2663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 267f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.unlock(); 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *samplingRate = af->sampleRate(output); 269f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.lock(); 270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else { 2713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getOutputSamplingRate() reading from output desc"); 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *samplingRate = outputDesc->samplingRate; 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 274f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten if (*samplingRate == 0) { 275b7f24b101d43139b4c747129bfbc4ecf5c468b86Jean-Michel Trivi ALOGE("AudioSystem::getSamplingRate failed for output %d", output); 276f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten return BAD_VALUE; 277f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten } 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 279b7f24b101d43139b4c747129bfbc4ecf5c468b86Jean-Michel Trivi ALOGV("getSamplingRate() output %d, sampling rate %u", output, *samplingRate); 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 284e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kastenstatus_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType) 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output; 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 288fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 289fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin streamType = AUDIO_STREAM_MUSIC; 290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 292fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten output = getOutput(streamType); 293142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten if (output == AUDIO_IO_HANDLE_NONE) { 294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return PERMISSION_DENIED; 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 297b7f24b101d43139b4c747129bfbc4ecf5c468b86Jean-Michel Trivi return getFrameCount(output, frameCount); 2981a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent} 2991a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 3001a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurentstatus_t AudioSystem::getFrameCount(audio_io_handle_t output, 301e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t* frameCount) 3021a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent{ 303f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 304f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent if (af == 0) return PERMISSION_DENIED; 305f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent 306f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 3071a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 308f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent OutputDescriptor *outputDesc = AudioSystem::gOutputs.valueFor(output); 309a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (outputDesc == NULL) { 310f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.unlock(); 311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *frameCount = af->frameCount(output); 312f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.lock(); 313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else { 314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *frameCount = outputDesc->frameCount; 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 316f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten if (*frameCount == 0) { 317b7f24b101d43139b4c747129bfbc4ecf5c468b86Jean-Michel Trivi ALOGE("AudioSystem::getFrameCount failed for output %d", output); 318f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten return BAD_VALUE; 319f94006ca0f30c27868c284e553f57bf467ae92bcGlenn Kasten } 32048f7f5e8359909ddfc6492a79a8b9c44759ca6c3Eric Laurent 32134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn ALOGV("getFrameCount() output %d, frameCount %zu", output, *frameCount); 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 326fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output; 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 330fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (streamType == AUDIO_STREAM_DEFAULT) { 331fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin streamType = AUDIO_STREAM_MUSIC; 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 334fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten output = getOutput(streamType); 335142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten if (output == AUDIO_IO_HANDLE_NONE) { 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return PERMISSION_DENIED; 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 339241618f1b286f9e7e02fe61e96d9194e2e1e8a7aGlenn Kasten return getLatency(output, latency); 3401a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent} 3411a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 3421a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurentstatus_t AudioSystem::getLatency(audio_io_handle_t output, 3431a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent uint32_t* latency) 3441a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent{ 345f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 346f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent if (af == 0) return PERMISSION_DENIED; 347f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent 348f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 3491a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent 350f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent OutputDescriptor *outputDesc = AudioSystem::gOutputs.valueFor(output); 351a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (outputDesc == NULL) { 352f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.unlock(); 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *latency = af->latency(output); 354f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.lock(); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else { 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *latency = outputDesc->latency; 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 35848f7f5e8359909ddfc6492a79a8b9c44759ca6c3Eric Laurent 359241618f1b286f9e7e02fe61e96d9194e2e1e8a7aGlenn Kasten ALOGV("getLatency() output %d, latency %d", output, *latency); 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 364dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kastenstatus_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format, 365dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, size_t* buffSize) 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 367f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 368f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent if (af == 0) { 369f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent return PERMISSION_DENIED; 370f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent } 371f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values 373f8c1a6f7ef515810356816b50bfe18af95f3ec32Glenn Kasten size_t inBuffSize = gInBuffSize; 374f8c1a6f7ef515810356816b50bfe18af95f3ec32Glenn Kasten if ((inBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) 375dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten || (channelMask != gPrevInChannelMask)) { 376f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.unlock(); 377dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask); 378f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent gLockCache.lock(); 3795446e541367061b53f45f3fd4600f9060680bca3Glenn Kasten if (inBuffSize == 0) { 380cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %x", 3815446e541367061b53f45f3fd4600f9060680bca3Glenn Kasten sampleRate, format, channelMask); 3825446e541367061b53f45f3fd4600f9060680bca3Glenn Kasten return BAD_VALUE; 3835446e541367061b53f45f3fd4600f9060680bca3Glenn Kasten } 3845446e541367061b53f45f3fd4600f9060680bca3Glenn Kasten // A benign race is possible here: we could overwrite a fresher cache entry 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // save the request params 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project gPrevInSamplingRate = sampleRate; 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent gPrevInFormat = format; 388dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten gPrevInChannelMask = channelMask; 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 390f8c1a6f7ef515810356816b50bfe18af95f3ec32Glenn Kasten gInBuffSize = inBuffSize; 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 392f8c1a6f7ef515810356816b50bfe18af95f3ec32Glenn Kasten *buffSize = inBuffSize; 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 397f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurentstatus_t AudioSystem::setVoiceVolume(float value) 398f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent{ 399f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 400f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent if (af == 0) return PERMISSION_DENIED; 401f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return af->setVoiceVolume(value); 402f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent} 403f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 404377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETITstatus_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t *halFrames, 4050ed19594452c901c3c8665d06610fffe46895d06Glenn Kasten uint32_t *dspFrames) 406342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent{ 407342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 408342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (af == 0) return PERMISSION_DENIED; 409342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 410ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald return af->getRenderPosition(halFrames, dspFrames, output); 411342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent} 412342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 4134944acb7355b3aa25748fd25945a363a69d65444Glenn Kastenuint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) 4144944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 41505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 4165f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten uint32_t result = 0; 41705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent if (af == 0) return result; 418142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten if (ioHandle == AUDIO_IO_HANDLE_NONE) return result; 41905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 42005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent result = af->getInputFramesLost(ioHandle); 42105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return result; 42205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent} 42305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 424de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurentaudio_unique_id_t AudioSystem::newAudioUniqueId() 4254944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 426be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 427de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE; 428de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent return af->newAudioUniqueId(); 429be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent} 430be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 431d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissenvoid AudioSystem::acquireAudioSessionId(int audioSession, pid_t pid) 4324944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 4333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 4343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen if (af != 0) { 435d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen af->acquireAudioSessionId(audioSession, pid); 4363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 4373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen} 4383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 439d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissenvoid AudioSystem::releaseAudioSessionId(int audioSession, pid_t pid) 4404944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 4413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 4423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen if (af != 0) { 443d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen af->releaseAudioSessionId(audioSession, pid); 4443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 4453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen} 4463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 44793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurentaudio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) 44893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent{ 44993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 45093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (af == 0) return AUDIO_HW_SYNC_INVALID; 45193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return af->getAudioHwSyncForSession(sessionId); 45293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent} 45393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// --------------------------------------------------------------------------- 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4564944acb7355b3aa25748fd25945a363a69d65444Glenn Kastenvoid AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused) 4574944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 458f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent audio_error_callback cb = NULL; 459f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent { 460f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(AudioSystem::gLock); 461f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent AudioSystem::gAudioFlinger.clear(); 462f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent cb = gAudioErrorCallback; 463f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent } 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 465f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent { 466f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent // clear output handles and stream to output map caches 467f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 468f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent AudioSystem::gOutputs.clear(); 469f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent } 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 471f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent if (cb) { 472f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent cb(DEAD_OBJECT); 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 4745ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AudioFlinger server died!"); 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 47772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kastenvoid AudioSystem::AudioFlingerClient::ioConfigChanged(int event, audio_io_handle_t ioHandle, 478b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten const void *param2) { 4793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ioConfigChanged() event %d", event); 480b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten const OutputDescriptor *desc; 481c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 482142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten if (ioHandle == AUDIO_IO_HANDLE_NONE) return; 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 484f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(AudioSystem::gLockCache); 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent switch (event) { 487c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STREAM_CONFIG_CHANGED: 488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent break; 489c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OUTPUT_OPENED: { 490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (gOutputs.indexOfKey(ioHandle) >= 0) { 4913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ioConfigChanged() opening already existing output! %d", ioHandle); 492c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent break; 493c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 494a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (param2 == NULL) break; 495b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten desc = (const OutputDescriptor *)param2; 496c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 497c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OutputDescriptor *outputDesc = new OutputDescriptor(*desc); 498c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent gOutputs.add(ioHandle, outputDesc); 499b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten ALOGV("ioConfigChanged() new output samplingRate %u, format %#x channel mask %#x " 500b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten "frameCount %zu latency %d", 501fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten outputDesc->samplingRate, outputDesc->format, outputDesc->channelMask, 50285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten outputDesc->frameCount, outputDesc->latency); 503c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 504c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OUTPUT_CLOSED: { 505c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (gOutputs.indexOfKey(ioHandle) < 0) { 50685007a9bd3c310f96fed47208dfee566fd00351fGlenn Kasten ALOGW("ioConfigChanged() closing unknown output! %d", ioHandle); 507c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent break; 508c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 5093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ioConfigChanged() output %d closed", ioHandle); 510c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 511c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent gOutputs.removeItem(ioHandle); 512c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 513c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 514c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OUTPUT_CONFIG_CHANGED: { 515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = gOutputs.indexOfKey(ioHandle); 516c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index < 0) { 51785007a9bd3c310f96fed47208dfee566fd00351fGlenn Kasten ALOGW("ioConfigChanged() modifying unknown output! %d", ioHandle); 518c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent break; 519c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 520a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (param2 == NULL) break; 521b81cc8c6f3eec9edb255ea99b6a6f243585b1e38Glenn Kasten desc = (const OutputDescriptor *)param2; 522c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 523b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten ALOGV("ioConfigChanged() new config for output %d samplingRate %u, format %#x " 524b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten "channel mask %#x frameCount %zu latency %d", 525c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent ioHandle, desc->samplingRate, desc->format, 526fad226abd12435dbcd232f7de396f1a097b2bd5fGlenn Kasten desc->channelMask, desc->frameCount, desc->latency); 527c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OutputDescriptor *outputDesc = gOutputs.valueAt(index); 528c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent delete outputDesc; 529c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent outputDesc = new OutputDescriptor(*desc); 530c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent gOutputs.replaceValueFor(ioHandle, outputDesc); 531c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 532c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INPUT_OPENED: 533c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INPUT_CLOSED: 534c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INPUT_CONFIG_CHANGED: 535c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent break; 53648f7f5e8359909ddfc6492a79a8b9c44759ca6c3Eric Laurent 53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 540f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi/*static*/ void AudioSystem::setErrorCallback(audio_error_callback cb) 5414944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 542c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Mutex::Autolock _l(gLock); 543c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent gAudioErrorCallback = cb; 544c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 545c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 546f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi/*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) 547f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi{ 548f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi Mutex::Autolock _l(gLock); 549f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi gDynPolicyCallback = cb; 550f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi} 551f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi 552c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// client singleton for AudioPolicyService binder interface 553d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten// protected by gLockAPS 554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentsp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 555c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentsp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 556c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 557c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 55818a6d9029e18a93748d3d9c33f04c1b360aeb7aeGlenn Kasten// establish binder interface to AudioPolicy service 5590ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurentconst sp<IAudioPolicyService> AudioSystem::get_audio_policy_service() 5600ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent{ 5610ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IAudioPolicyService> ap; 5620ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<AudioPolicyServiceClient> apc; 5630ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent { 5640ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent Mutex::Autolock _l(gLockAPS); 5650ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (gAudioPolicyService == 0) { 5660ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IServiceManager> sm = defaultServiceManager(); 5670ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent sp<IBinder> binder; 5680ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent do { 5690ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent binder = sm->getService(String16("media.audio_policy")); 5700ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (binder != 0) 5710ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent break; 5720ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent ALOGW("AudioPolicyService not published, waiting..."); 5730ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent usleep(500000); // 0.5 s 5740ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } while (true); 5750ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (gAudioPolicyServiceClient == NULL) { 5760ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 5770ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } 5780ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent binder->linkToDeath(gAudioPolicyServiceClient); 5790ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 5800ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0); 5810ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent apc = gAudioPolicyServiceClient; 582c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 5830ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent ap = gAudioPolicyService; 5840ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent } 5850ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent if (apc != 0) { 5860ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent ap->registerClient(apc); 587c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 588d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten 5890ebd5f95b68a3a5c9e5509f21938c9e51e74d71bEric Laurent return ap; 590c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 591c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 592fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten// --------------------------------------------------------------------------- 593fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten 594fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinstatus_t AudioSystem::setDeviceConnectionState(audio_devices_t device, 595fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 596e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 597e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 598c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 599c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 60071b63e3ef687c379368be6b02e70bd2feb0b6b8dEric Laurent const char *address = ""; 601e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *name = ""; 60271b63e3ef687c379368be6b02e70bd2feb0b6b8dEric Laurent 603c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 604c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 60571b63e3ef687c379368be6b02e70bd2feb0b6b8dEric Laurent if (device_address != NULL) { 60671b63e3ef687c379368be6b02e70bd2feb0b6b8dEric Laurent address = device_address; 60771b63e3ef687c379368be6b02e70bd2feb0b6b8dEric Laurent } 608e743a47f445f02a0612018fa5640301304844fbfPaul McLean if (device_name != NULL) { 609e743a47f445f02a0612018fa5640301304844fbfPaul McLean name = device_name; 610e743a47f445f02a0612018fa5640301304844fbfPaul McLean } 611e743a47f445f02a0612018fa5640301304844fbfPaul McLean return aps->setDeviceConnectionState(device, state, address, name); 612c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 613c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 614fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinaudio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device, 615c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 616c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 617c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 618fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 619c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 620c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return aps->getDeviceConnectionState(device, device_address); 621c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 622c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 623f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kastenstatus_t AudioSystem::setPhoneState(audio_mode_t state) 624c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 625347966c827883711d1ec631f204e4a6ab74e9d99Glenn Kasten if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE; 626c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 627c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 628c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 629c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return aps->setPhoneState(state); 630c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 631c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 632fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinstatus_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 633c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 634c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 635c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 636c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return aps->setForceUse(usage, config); 637c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 638c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 639fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinaudio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) 640c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 641c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 642fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin if (aps == 0) return AUDIO_POLICY_FORCE_NONE; 643c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return aps->getForceUse(usage); 644c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 645c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 647fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinaudio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream, 648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 64958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 650254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 651ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 652ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 6541a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 6551a9ed11a472493cac7f6dfcbfac2064526a493edEric Laurent if (aps == 0) return 0; 656ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald return aps->getOutput(stream, samplingRate, format, channelMask, flags, offloadInfo); 657c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 658c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 659e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioSystem::getOutputForAttr(const audio_attributes_t *attr, 660e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 661e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 662e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 663e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 664e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 665e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 666e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 667aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId, 668e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 6695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi{ 6705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 671e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (aps == 0) return NO_INIT; 672e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return aps->getOutputForAttr(attr, output, session, stream, 673e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 674aa9811945f575614b3482d09e4d969792701cebbPaul McLean flags, selectedDeviceId, offloadInfo); 6755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi} 6765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 677de070137f11d346fba77605bd76a44c040a618fcEric Laurentstatus_t AudioSystem::startOutput(audio_io_handle_t output, 678fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 679e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 683de070137f11d346fba77605bd76a44c040a618fcEric Laurent return aps->startOutput(output, stream, session); 684c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 686de070137f11d346fba77605bd76a44c040a618fcEric Laurentstatus_t AudioSystem::stopOutput(audio_io_handle_t output, 687fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 688e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 692de070137f11d346fba77605bd76a44c040a618fcEric Laurent return aps->stopOutput(output, stream, session); 693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 694c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 695e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioSystem::releaseOutput(audio_io_handle_t output, 696e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 697e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 698c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return; 701e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent aps->releaseOutput(output, stream, session); 702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 704caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurentstatus_t AudioSystem::getInputForAttr(const audio_attributes_t *attr, 705caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 706caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 707caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 708caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 709caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 710caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_input_flags_t flags) 711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 713caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (aps == 0) return NO_INIT; 714caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return aps->getInputForAttr(attr, input, session, samplingRate, format, channelMask, flags); 715c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 716c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 7174dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioSystem::startInput(audio_io_handle_t input, 7184dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 7224dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent return aps->startInput(input, session); 723c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 724c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 7254dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioSystem::stopInput(audio_io_handle_t input, 7264dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 727c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 7304dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent return aps->stopInput(input, session); 731c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 732c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 7334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioSystem::releaseInput(audio_io_handle_t input, 7344dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return; 7384dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent aps->releaseInput(input, session); 739c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 740c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 741fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinstatus_t AudioSystem::initStreamVolume(audio_stream_type_t stream, 742c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 744c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 745c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 746c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 747c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return aps->initStreamVolume(stream, indexMin, indexMax); 748c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 749c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 75083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurentstatus_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, 75183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 75283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 754c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 755c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 75683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent return aps->setStreamVolumeIndex(stream, index, device); 757c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 75983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurentstatus_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream, 76083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 76183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 762c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 764c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (aps == 0) return PERMISSION_DENIED; 76583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent return aps->getStreamVolumeIndex(stream, index, device); 766c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 768fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavinuint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) 769de070137f11d346fba77605bd76a44c040a618fcEric Laurent{ 770de070137f11d346fba77605bd76a44c040a618fcEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 771de070137f11d346fba77605bd76a44c040a618fcEric Laurent if (aps == 0) return 0; 772de070137f11d346fba77605bd76a44c040a618fcEric Laurent return aps->getStrategyForStream(stream); 773de070137f11d346fba77605bd76a44c040a618fcEric Laurent} 774de070137f11d346fba77605bd76a44c040a618fcEric Laurent 7756374252107fd6539397598195ea6defd5870fafbEric Laurentaudio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) 7766b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten{ 7776b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 77845faf7e02791993a487d6e038d16ff46395f1975Glenn Kasten if (aps == 0) return AUDIO_DEVICE_NONE; 7796b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return aps->getDevicesForStream(stream); 7806b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten} 7816b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 78258e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kastenaudio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc) 783de070137f11d346fba77605bd76a44c040a618fcEric Laurent{ 784de070137f11d346fba77605bd76a44c040a618fcEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 785efa6ea97022780b68e595e5326e30dbe2a799202Glenn Kasten // FIXME change return type to status_t, and return PERMISSION_DENIED here 786142f519aa1acd5804d111e60d100f170fed28405Glenn Kasten if (aps == 0) return AUDIO_IO_HANDLE_NONE; 787de070137f11d346fba77605bd76a44c040a618fcEric Laurent return aps->getOutputForEffect(desc); 788de070137f11d346fba77605bd76a44c040a618fcEric Laurent} 789de070137f11d346fba77605bd76a44c040a618fcEric Laurent 79058e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kastenstatus_t AudioSystem::registerEffect(const effect_descriptor_t *desc, 7917c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 792de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 793de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 794de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 795de070137f11d346fba77605bd76a44c040a618fcEric Laurent{ 796de070137f11d346fba77605bd76a44c040a618fcEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 797de070137f11d346fba77605bd76a44c040a618fcEric Laurent if (aps == 0) return PERMISSION_DENIED; 7987c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent return aps->registerEffect(desc, io, strategy, session, id); 799de070137f11d346fba77605bd76a44c040a618fcEric Laurent} 800de070137f11d346fba77605bd76a44c040a618fcEric Laurent 801de070137f11d346fba77605bd76a44c040a618fcEric Laurentstatus_t AudioSystem::unregisterEffect(int id) 802de070137f11d346fba77605bd76a44c040a618fcEric Laurent{ 803de070137f11d346fba77605bd76a44c040a618fcEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 804de070137f11d346fba77605bd76a44c040a618fcEric Laurent if (aps == 0) return PERMISSION_DENIED; 805de070137f11d346fba77605bd76a44c040a618fcEric Laurent return aps->unregisterEffect(id); 806de070137f11d346fba77605bd76a44c040a618fcEric Laurent} 807de070137f11d346fba77605bd76a44c040a618fcEric Laurent 808db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurentstatus_t AudioSystem::setEffectEnabled(int id, bool enabled) 809db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent{ 810db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 811db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent if (aps == 0) return PERMISSION_DENIED; 812db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return aps->setEffectEnabled(id, enabled); 813db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent} 814db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 815fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kastenstatus_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) 8167c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent{ 817eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 818eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent if (aps == 0) return PERMISSION_DENIED; 8197c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent if (state == NULL) return BAD_VALUE; 820eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent *state = aps->isStreamActive(stream, inPastMs); 821eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 822eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent} 823eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 824272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivistatus_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state, 825272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs) 826272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi{ 827272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 828272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi if (aps == 0) return PERMISSION_DENIED; 829272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi if (state == NULL) return BAD_VALUE; 830272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi *state = aps->isStreamActiveRemotely(stream, inPastMs); 831272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 832272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi} 833272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 834d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivistatus_t AudioSystem::isSourceActive(audio_source_t stream, bool* state) 835d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi{ 836d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 837d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi if (aps == 0) return PERMISSION_DENIED; 838d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi if (state == NULL) return BAD_VALUE; 839d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi *state = aps->isSourceActive(stream); 840d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 841d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi} 842d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 8433b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kastenuint32_t AudioSystem::getPrimaryOutputSamplingRate() 844cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten{ 845cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 846cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten if (af == 0) return 0; 847cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return af->getPrimaryOutputSamplingRate(); 848cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten} 849cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 850e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kastensize_t AudioSystem::getPrimaryOutputFrameCount() 851cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten{ 852cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 853cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten if (af == 0) return 0; 854cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return af->getPrimaryOutputFrameCount(); 855cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten} 856eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 8574182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kastenstatus_t AudioSystem::setLowRamDevice(bool isLowRamDevice) 8584182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten{ 8594182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 8604182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten if (af == 0) return PERMISSION_DENIED; 8614182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return af->setLowRamDevice(isLowRamDevice); 8624182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten} 8634182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten 8649f6530f53ae9eda43f4e7c1cb30d2379db00aa00Eric Laurentvoid AudioSystem::clearAudioConfigCache() 8659f6530f53ae9eda43f4e7c1cb30d2379db00aa00Eric Laurent{ 866d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances 8673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("clearAudioConfigCache()"); 868d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten { 869f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLockCache); 870d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten gOutputs.clear(); 871f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent } 872f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent { 873f6778fd0c72ab54328f0e9f5ecf0017b73e99dd8Eric Laurent Mutex::Autolock _l(gLock); 874d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten gAudioFlinger.clear(); 875d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten } 876d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten { 877d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten Mutex::Autolock _l(gLockAPS); 878d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten gAudioPolicyService.clear(); 879d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten } 8809f6530f53ae9eda43f4e7c1cb30d2379db00aa00Eric Laurent} 8819f6530f53ae9eda43f4e7c1cb30d2379db00aa00Eric Laurent 882ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgeraldbool AudioSystem::isOffloadSupported(const audio_offload_info_t& info) 883ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald{ 884ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald ALOGV("isOffloadSupported()"); 885ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 886ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald if (aps == 0) return false; 887ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald return aps->isOffloadSupported(info); 888ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald} 889ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 890203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::listAudioPorts(audio_port_role_t role, 891203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 892203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 893203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 894203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 895203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 896203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 897203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 898203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->listAudioPorts(role, type, num_ports, ports, generation); 899203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 900203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 901203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::getAudioPort(struct audio_port *port) 902203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 903203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 904203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 905203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->getAudioPort(port); 906203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 907203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 908203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::createAudioPatch(const struct audio_patch *patch, 909203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 910203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 911203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 912203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 913203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->createAudioPatch(patch, handle); 914203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 915203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 916203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle) 917203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 918203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 919203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 920203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->releaseAudioPatch(handle); 921203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 922203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 923203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::listAudioPatches(unsigned int *num_patches, 924203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 925203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 926203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 927203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 928203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 929203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->listAudioPatches(num_patches, patches, generation); 930203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 931203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 932203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config) 933203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 934203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 935203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (aps == 0) return PERMISSION_DENIED; 936203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return aps->setAudioPortConfig(config); 937203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 938203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 939b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurentstatus_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callBack) 940b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{ 941b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 942b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (aps == 0) return PERMISSION_DENIED; 943b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent 944b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(gLockAPS); 945b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (gAudioPolicyServiceClient == 0) { 946b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return NO_INIT; 947b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 948b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return gAudioPolicyServiceClient->addAudioPortCallback(callBack); 949b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent} 950b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 951f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi/*static*/ 952b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurentstatus_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callBack) 953b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent{ 954b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 955b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (aps == 0) return PERMISSION_DENIED; 956b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent 957b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(gLockAPS); 958b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (gAudioPolicyServiceClient == 0) { 959b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return NO_INIT; 960b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 961b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return gAudioPolicyServiceClient->removeAudioPortCallback(callBack); 962b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent} 963b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent 964df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session, 965df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 966df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 967df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 968df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 969df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (aps == 0) return PERMISSION_DENIED; 970df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return aps->acquireSoundTriggerSession(session, ioHandle, device); 971df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 972df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 973df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) 974df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 975df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 976df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (aps == 0) return PERMISSION_DENIED; 977df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return aps->releaseSoundTriggerSession(session); 978df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 979bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 980bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurentaudio_mode_t AudioSystem::getPhoneState() 981bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent{ 982bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 983bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (aps == 0) return AUDIO_MODE_INVALID; 984bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return aps->getPhoneState(); 985bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent} 986bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 987baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioSystem::registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 988baac183f3808d7b68f184647a97bd381620415feEric Laurent{ 989baac183f3808d7b68f184647a97bd381620415feEric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 990baac183f3808d7b68f184647a97bd381620415feEric Laurent if (aps == 0) return PERMISSION_DENIED; 991baac183f3808d7b68f184647a97bd381620415feEric Laurent return aps->registerPolicyMixes(mixes, registration); 992baac183f3808d7b68f184647a97bd381620415feEric Laurent} 993bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 994554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioSystem::startAudioSource(const struct audio_port_config *source, 995554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 996554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 997554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 998554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 999554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (aps == 0) return PERMISSION_DENIED; 1000554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return aps->startAudioSource(source, attributes, handle); 1001554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 1002554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1003554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioSystem::stopAudioSource(audio_io_handle_t handle) 1004554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 1005554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1006554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (aps == 0) return PERMISSION_DENIED; 1007554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return aps->stopAudioSource(handle); 1008554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 1009554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// --------------------------------------------------------------------------- 1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1012b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurentstatus_t AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( 1013b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent const sp<AudioPortCallback>& callBack) 10144944acb7355b3aa25748fd25945a363a69d65444Glenn Kasten{ 1015b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(mLock); 1016b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1017b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (mAudioPortCallbacks[i] == callBack) { 1018b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return INVALID_OPERATION; 1019d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten } 1020d2d089fc86c62843992e7d5b371ee9227189a1e6Glenn Kasten } 1021b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent mAudioPortCallbacks.add(callBack); 1022b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return NO_ERROR; 1023b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent} 1024c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1025b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurentstatus_t AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( 1026b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent const sp<AudioPortCallback>& callBack) 1027b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent{ 1028b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(mLock); 1029b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent size_t i; 1030b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent for (i = 0; i < mAudioPortCallbacks.size(); i++) { 1031b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (mAudioPortCallbacks[i] == callBack) { 1032b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent break; 1033b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1034b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1035b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent if (i == mAudioPortCallbacks.size()) { 1036b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return INVALID_OPERATION; 1037b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1038b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent mAudioPortCallbacks.removeAt(i); 1039b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent return NO_ERROR; 1040c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1041c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1042b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentvoid AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() 1043b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{ 1044b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(mLock); 1045b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1046b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent mAudioPortCallbacks[i]->onAudioPortListUpdate(); 1047b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 1048b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent} 1049b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 1050b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurentvoid AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() 1051b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent{ 1052b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(mLock); 1053b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1054b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent mAudioPortCallbacks[i]->onAudioPatchListUpdate(); 1055b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1056b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent} 1057b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent 1058de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivivoid AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate( 1059de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi String8 regId, int32_t state) 1060de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi{ 1061f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.string(), state); 1062f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi dynamic_policy_callback cb = NULL; 1063f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi { 1064f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi Mutex::Autolock _l(AudioSystem::gLock); 1065f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi cb = gDynPolicyCallback; 1066f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi } 1067f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi 1068f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi if (cb != NULL) { 1069f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regId, state); 1070f613d42b12389335b2ecf06df18d0d095d6bfd44Jean-Michel Trivi } 1071de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi} 1072de80105c3f2db0eabd47640c49387ea3b44d4782Jean-Michel Trivi 1073b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurentvoid AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) 1074b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent{ 1075b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent { 1076b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(mLock); 1077b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1078b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent mAudioPortCallbacks[i]->onServiceDied(); 1079b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1080b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent } 1081b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent { 1082b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent Mutex::Autolock _l(gLockAPS); 1083b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent AudioSystem::gAudioPolicyService.clear(); 1084b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 1085b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent 1086b28753e19550e5051cd02e6af72ab06e4eff04e0Eric Laurent ALOGW("AudioPolicyService server died!"); 1087b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent} 1088b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent 108940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1090