diff options
Diffstat (limited to 'services/audioflinger/AudioPolicyService.cpp')
-rw-r--r-- | services/audioflinger/AudioPolicyService.cpp | 100 |
1 files changed, 54 insertions, 46 deletions
diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp index 6be669b..1dddbb3 100644 --- a/services/audioflinger/AudioPolicyService.cpp +++ b/services/audioflinger/AudioPolicyService.cpp @@ -31,7 +31,6 @@ #include <utils/threads.h> #include "AudioPolicyService.h" #include <cutils/properties.h> -#include <dlfcn.h> #include <hardware_legacy/power.h> #include <media/AudioEffect.h> #include <media/EffectsFactoryApi.h> @@ -44,11 +43,11 @@ namespace android { -static const char *kDeadlockedString = "AudioPolicyService may be deadlocked\n"; -static const char *kCmdDeadlockedString = "AudioPolicyService command thread may be deadlocked\n"; +static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n"; +static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n"; static const int kDumpLockRetries = 50; -static const int kDumpLockSleep = 20000; +static const int kDumpLockSleepUs = 20000; static bool checkPermission() { if (getpid() == IPCThreadState::self()->getCallingPid()) return true; @@ -145,9 +144,9 @@ AudioPolicyService::~AudioPolicyService() } mInputs.clear(); - if (mpAudioPolicy && mpAudioPolicyDev) + if (mpAudioPolicy != NULL && mpAudioPolicyDev != NULL) mpAudioPolicyDev->destroy_audio_policy(mpAudioPolicyDev, mpAudioPolicy); - if (mpAudioPolicyDev) + if (mpAudioPolicyDev != NULL) audio_policy_dev_close(mpAudioPolicyDev); } @@ -186,7 +185,7 @@ audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState( device_address); } -status_t AudioPolicyService::setPhoneState(int state) +status_t AudioPolicyService::setPhoneState(audio_mode_t state) { if (mpAudioPolicy == NULL) { return NO_INIT; @@ -194,7 +193,7 @@ status_t AudioPolicyService::setPhoneState(int state) if (!checkPermission()) { return PERMISSION_DENIED; } - if (state < 0 || state >= AUDIO_MODE_CNT) { + if (uint32_t(state) >= AUDIO_MODE_CNT) { return BAD_VALUE; } @@ -208,19 +207,6 @@ status_t AudioPolicyService::setPhoneState(int state) return NO_ERROR; } -status_t AudioPolicyService::setRingerMode(uint32_t mode, uint32_t mask) -{ - if (mpAudioPolicy == NULL) { - return NO_INIT; - } - if (!checkPermission()) { - return PERMISSION_DENIED; - } - - mpAudioPolicy->set_ringer_mode(mpAudioPolicy, mode, mask); - return NO_ERROR; -} - status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) { @@ -255,7 +241,7 @@ audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, uint32_t samplingRate, - uint32_t format, + audio_format_t format, uint32_t channels, audio_policy_output_flags_t flags) { @@ -301,9 +287,9 @@ void AudioPolicyService::releaseOutput(audio_io_handle_t output) mpAudioPolicy->release_output(mpAudioPolicy, output); } -audio_io_handle_t AudioPolicyService::getInput(int inputSource, +audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource, uint32_t samplingRate, - uint32_t format, + audio_format_t format, uint32_t channels, audio_in_acoustics_t acoustics, int audioSession) @@ -311,6 +297,10 @@ audio_io_handle_t AudioPolicyService::getInput(int inputSource, if (mpAudioPolicy == NULL) { return 0; } + // already checked by client, but double-check in case the client wrapper is bypassed + if (uint32_t(inputSource) >= AUDIO_SOURCE_CNT) { + return 0; + } Mutex::Autolock _l(mLock); audio_io_handle_t input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate, format, channels, acoustics); @@ -319,7 +309,7 @@ audio_io_handle_t AudioPolicyService::getInput(int inputSource, return input; } // create audio pre processors according to input source - ssize_t index = mInputSources.indexOfKey((audio_source_t)inputSource); + ssize_t index = mInputSources.indexOfKey(inputSource); if (index < 0) { return input; } @@ -401,14 +391,16 @@ status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, if (!checkPermission()) { return PERMISSION_DENIED; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax); return NO_ERROR; } -status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, int index) +status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, + int index, + audio_devices_t device) { if (mpAudioPolicy == NULL) { return NO_INIT; @@ -416,22 +408,38 @@ status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, in if (!checkPermission()) { return PERMISSION_DENIED; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } - return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index); + if (mpAudioPolicy->set_stream_volume_index_for_device) { + return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy, + stream, + index, + device); + } else { + return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index); + } } -status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, int *index) +status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, + int *index, + audio_devices_t device) { if (mpAudioPolicy == NULL) { return NO_INIT; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } - return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index); + if (mpAudioPolicy->get_stream_volume_index_for_device) { + return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy, + stream, + index, + device); + } else { + return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index); + } } uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) @@ -487,7 +495,7 @@ status_t AudioPolicyService::setEffectEnabled(int id, bool enabled) return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled); } -bool AudioPolicyService::isStreamActive(int stream, uint32_t inPastMs) const +bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const { if (mpAudioPolicy == NULL) { return 0; @@ -546,7 +554,7 @@ static bool tryLock(Mutex& mutex) locked = true; break; } - usleep(kDumpLockSleep); + usleep(kDumpLockSleepUs); } return locked; } @@ -570,7 +578,7 @@ status_t AudioPolicyService::dumpInternals(int fd) status_t AudioPolicyService::dump(int fd, const Vector<String16>& args) { - if (checkCallingPermission(String16("android.permission.DUMP")) == false) { + if (!checkCallingPermission(String16("android.permission.DUMP"))) { dumpPermissionDenial(fd); } else { bool locked = tryLock(mLock); @@ -641,7 +649,7 @@ AudioPolicyService::AudioCommandThread::~AudioCommandThread() release_wake_lock(mName.string()); } mAudioCommands.clear(); - if (mpToneGenerator != NULL) delete mpToneGenerator; + delete mpToneGenerator; } void AudioPolicyService::AudioCommandThread::onFirstRef() @@ -674,8 +682,7 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() ToneData *data = (ToneData *)command->mParam; ALOGV("AudioCommandThread() processing start tone %d on stream %d", data->mType, data->mStream); - if (mpToneGenerator != NULL) - delete mpToneGenerator; + delete mpToneGenerator; mpToneGenerator = new ToneGenerator(data->mStream, 1.0); mpToneGenerator->startTone(data->mType); delete data; @@ -782,7 +789,8 @@ status_t AudioPolicyService::AudioCommandThread::dump(int fd) return NO_ERROR; } -void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stream) +void AudioPolicyService::AudioCommandThread::startToneCommand(ToneGenerator::tone_type type, + audio_stream_type_t stream) { AudioCommand *command = new AudioCommand(); command->mCommand = START_TONE; @@ -809,7 +817,7 @@ void AudioPolicyService::AudioCommandThread::stopToneCommand() mWaitWorkCV.signal(); } -status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, +status_t AudioPolicyService::AudioCommandThread::volumeCommand(audio_stream_type_t stream, float volume, int output, int delayMs) @@ -1020,7 +1028,7 @@ int AudioPolicyService::setStreamVolume(audio_stream_type_t stream, audio_io_handle_t output, int delayMs) { - return (int)mAudioCommandThread->volumeCommand((int)stream, volume, + return (int)mAudioCommandThread->volumeCommand(stream, volume, (int)output, delayMs); } @@ -1052,7 +1060,7 @@ int AudioPolicyService::setVoiceVolume(float volume, int delayMs) // Audio pre-processing configuration // ---------------------------------------------------------------------------- -const char *AudioPolicyService::kInputSourceNames[AUDIO_SOURCE_CNT -1] = { +/*static*/ const char * const AudioPolicyService::kInputSourceNames[AUDIO_SOURCE_CNT -1] = { MIC_SRC_TAG, VOICE_UL_SRC_TAG, VOICE_DL_SRC_TAG, @@ -1152,7 +1160,7 @@ effect_param_t *AudioPolicyService::loadEffectParameter(cnode *root) if (param == NULL && value == NULL) { // try to parse simple parameter form {int int} param = root->first_child; - if (param) { + if (param != NULL) { // Note: that a pair of random strings is read as 0 0 int *ptr = (int *)fx_param->data; int *ptr2 = (int *)((char *)param + sizeof(effect_param_t)); @@ -1348,7 +1356,7 @@ extern "C" { static audio_io_handle_t aps_open_output(void *service, uint32_t *pDevices, uint32_t *pSamplingRate, - uint32_t *pFormat, + audio_format_t *pFormat, uint32_t *pChannels, uint32_t *pLatencyMs, audio_policy_output_flags_t flags) @@ -1409,9 +1417,9 @@ static int aps_restore_output(void *service, audio_io_handle_t output) static audio_io_handle_t aps_open_input(void *service, uint32_t *pDevices, uint32_t *pSamplingRate, - uint32_t *pFormat, + audio_format_t *pFormat, uint32_t *pChannels, - uint32_t acoustics) + audio_in_acoustics_t acoustics) { sp<IAudioFlinger> af = AudioSystem::get_audio_flinger(); if (af == NULL) { |