Loading include/media/AudioSystem.h +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ public: static status_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount, size_t* buffSize); static status_t setVoiceVolume(float volume); // // AudioPolicyService interface Loading include/media/IAudioFlinger.h +4 −2 Original line number Diff line number Diff line Loading @@ -128,6 +128,8 @@ public: virtual status_t closeInput(int input) = 0; virtual status_t setStreamOutput(uint32_t stream, int output) = 0; virtual status_t setVoiceVolume(float volume) = 0; }; Loading libs/audioflinger/AudioFlinger.cpp +18 −29 Original line number Diff line number Diff line Loading @@ -482,38 +482,17 @@ status_t AudioFlinger::setStreamVolume(int stream, float value, int output) } } status_t ret = NO_ERROR; if (stream == AudioSystem::VOICE_CALL || stream == AudioSystem::BLUETOOTH_SCO) { float hwValue; if (stream == AudioSystem::VOICE_CALL) { hwValue = (float)AudioSystem::logToLinear(value)/100.0f; // offset value to reflect actual hardware volume that never reaches 0 // 1% corresponds roughly to first step in VOICE_CALL stream volume setting (see AudioService.java) value = 0.01 + 0.99 * value; } else { // (type == AudioSystem::BLUETOOTH_SCO) hwValue = 1.0f; } AutoMutex lock(mHardwareLock); mHardwareStatus = AUDIO_SET_VOICE_VOLUME; ret = mAudioHardware->setVoiceVolume(hwValue); mHardwareStatus = AUDIO_HW_IDLE; } mStreamTypes[stream].volume = value; if (thread == NULL) { for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) { mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value); } } else { thread->setStreamVolume(stream, value); } return ret; return NO_ERROR; } status_t AudioFlinger::setStreamMute(int stream, bool muted) Loading Loading @@ -553,11 +532,6 @@ float AudioFlinger::streamVolume(int stream, int output) const volume = mStreamTypes[stream].volume; } // remove correction applied by setStreamVolume() if (stream == AudioSystem::VOICE_CALL) { volume = (volume - 0.01) / 0.99 ; } return volume; } Loading Loading @@ -644,6 +618,21 @@ size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, int format, int cha return mAudioHardware->getInputBufferSize(sampleRate, format, channelCount); } status_t AudioFlinger::setVoiceVolume(float value) { // check calling permissions if (!settingsAllowed()) { return PERMISSION_DENIED; } AutoMutex lock(mHardwareLock); mHardwareStatus = AUDIO_SET_VOICE_VOLUME; status_t ret = mAudioHardware->setVoiceVolume(value); mHardwareStatus = AUDIO_HW_IDLE; return ret; } void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client) { Loading libs/audioflinger/AudioFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,8 @@ public: virtual status_t setStreamOutput(uint32_t stream, int output); virtual status_t setVoiceVolume(float volume); // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& who); Loading libs/audioflinger/AudioPolicyService.cpp +44 −4 Original line number Diff line number Diff line Loading @@ -495,6 +495,10 @@ status_t AudioPolicyService::stopTone() return NO_ERROR; } status_t AudioPolicyService::setVoiceVolume(float volume, int delayMs) { return mAudioCommandThread->voiceVolumeCommand(volume, delayMs); } // ----------- AudioPolicyService::AudioCommandThread implementation ---------- Loading Loading @@ -577,6 +581,16 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() } delete data; }break; case SET_VOICE_VOLUME: { VoiceVolumeData *data = (VoiceVolumeData *)command->mParam; LOGV("AudioCommandThread() processing set voice volume volume %f", data->mVolume); command->mStatus = AudioSystem::setVoiceVolume(data->mVolume); if (command->mWaitStatus) { command->mCond.signal(); mWaitWorkCV.wait(mLock); } delete data; }break; default: LOGW("AudioCommandThread() unknown command %d", command->mCommand); } Loading @@ -597,7 +611,6 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stream) { Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = START_TONE; ToneData *data = new ToneData(); Loading @@ -605,6 +618,7 @@ void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stre data->mStream = stream; command->mParam = (void *)data; command->mWaitStatus = false; Mutex::Autolock _l(mLock); insertCommand_l(command); LOGV("AudioCommandThread() adding tone start type %d, stream %d", type, stream); mWaitWorkCV.signal(); Loading @@ -612,11 +626,11 @@ void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stre void AudioPolicyService::AudioCommandThread::stopToneCommand() { Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = STOP_TONE; command->mParam = NULL; command->mWaitStatus = false; Mutex::Autolock _l(mLock); insertCommand_l(command); LOGV("AudioCommandThread() adding tone stop"); mWaitWorkCV.signal(); Loading @@ -626,7 +640,6 @@ status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float { status_t status = NO_ERROR; Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = SET_VOLUME; VolumeData *data = new VolumeData(); Loading @@ -639,6 +652,7 @@ status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set volume stream %d, volume %f, output %d", stream, volume, output); mWaitWorkCV.signal(); Loading @@ -654,7 +668,6 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, { status_t status = NO_ERROR; Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = SET_PARAMETERS; ParametersData *data = new ParametersData(); Loading @@ -666,6 +679,7 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set parameter string %s, io %d ,delay %d", keyValuePairs.string(), ioHandle, delayMs); mWaitWorkCV.signal(); Loading @@ -677,6 +691,32 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, return status; } status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume, int delayMs) { status_t status = NO_ERROR; AudioCommand *command = new AudioCommand(); command->mCommand = SET_VOICE_VOLUME; VoiceVolumeData *data = new VoiceVolumeData(); data->mVolume = volume; command->mParam = data; if (delayMs == 0) { command->mWaitStatus = true; } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set voice volume volume %f", volume); mWaitWorkCV.signal(); if (command->mWaitStatus) { command->mCond.wait(mLock); status = command->mStatus; mWaitWorkCV.signal(); } return status; } // insertCommand_l() must be called with mLock held void AudioPolicyService::AudioCommandThread::insertCommand_l(AudioCommand *command, int delayMs) { Loading Loading
include/media/AudioSystem.h +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ public: static status_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount, size_t* buffSize); static status_t setVoiceVolume(float volume); // // AudioPolicyService interface Loading
include/media/IAudioFlinger.h +4 −2 Original line number Diff line number Diff line Loading @@ -128,6 +128,8 @@ public: virtual status_t closeInput(int input) = 0; virtual status_t setStreamOutput(uint32_t stream, int output) = 0; virtual status_t setVoiceVolume(float volume) = 0; }; Loading
libs/audioflinger/AudioFlinger.cpp +18 −29 Original line number Diff line number Diff line Loading @@ -482,38 +482,17 @@ status_t AudioFlinger::setStreamVolume(int stream, float value, int output) } } status_t ret = NO_ERROR; if (stream == AudioSystem::VOICE_CALL || stream == AudioSystem::BLUETOOTH_SCO) { float hwValue; if (stream == AudioSystem::VOICE_CALL) { hwValue = (float)AudioSystem::logToLinear(value)/100.0f; // offset value to reflect actual hardware volume that never reaches 0 // 1% corresponds roughly to first step in VOICE_CALL stream volume setting (see AudioService.java) value = 0.01 + 0.99 * value; } else { // (type == AudioSystem::BLUETOOTH_SCO) hwValue = 1.0f; } AutoMutex lock(mHardwareLock); mHardwareStatus = AUDIO_SET_VOICE_VOLUME; ret = mAudioHardware->setVoiceVolume(hwValue); mHardwareStatus = AUDIO_HW_IDLE; } mStreamTypes[stream].volume = value; if (thread == NULL) { for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) { mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value); } } else { thread->setStreamVolume(stream, value); } return ret; return NO_ERROR; } status_t AudioFlinger::setStreamMute(int stream, bool muted) Loading Loading @@ -553,11 +532,6 @@ float AudioFlinger::streamVolume(int stream, int output) const volume = mStreamTypes[stream].volume; } // remove correction applied by setStreamVolume() if (stream == AudioSystem::VOICE_CALL) { volume = (volume - 0.01) / 0.99 ; } return volume; } Loading Loading @@ -644,6 +618,21 @@ size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, int format, int cha return mAudioHardware->getInputBufferSize(sampleRate, format, channelCount); } status_t AudioFlinger::setVoiceVolume(float value) { // check calling permissions if (!settingsAllowed()) { return PERMISSION_DENIED; } AutoMutex lock(mHardwareLock); mHardwareStatus = AUDIO_SET_VOICE_VOLUME; status_t ret = mAudioHardware->setVoiceVolume(value); mHardwareStatus = AUDIO_HW_IDLE; return ret; } void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client) { Loading
libs/audioflinger/AudioFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,8 @@ public: virtual status_t setStreamOutput(uint32_t stream, int output); virtual status_t setVoiceVolume(float volume); // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& who); Loading
libs/audioflinger/AudioPolicyService.cpp +44 −4 Original line number Diff line number Diff line Loading @@ -495,6 +495,10 @@ status_t AudioPolicyService::stopTone() return NO_ERROR; } status_t AudioPolicyService::setVoiceVolume(float volume, int delayMs) { return mAudioCommandThread->voiceVolumeCommand(volume, delayMs); } // ----------- AudioPolicyService::AudioCommandThread implementation ---------- Loading Loading @@ -577,6 +581,16 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() } delete data; }break; case SET_VOICE_VOLUME: { VoiceVolumeData *data = (VoiceVolumeData *)command->mParam; LOGV("AudioCommandThread() processing set voice volume volume %f", data->mVolume); command->mStatus = AudioSystem::setVoiceVolume(data->mVolume); if (command->mWaitStatus) { command->mCond.signal(); mWaitWorkCV.wait(mLock); } delete data; }break; default: LOGW("AudioCommandThread() unknown command %d", command->mCommand); } Loading @@ -597,7 +611,6 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stream) { Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = START_TONE; ToneData *data = new ToneData(); Loading @@ -605,6 +618,7 @@ void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stre data->mStream = stream; command->mParam = (void *)data; command->mWaitStatus = false; Mutex::Autolock _l(mLock); insertCommand_l(command); LOGV("AudioCommandThread() adding tone start type %d, stream %d", type, stream); mWaitWorkCV.signal(); Loading @@ -612,11 +626,11 @@ void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stre void AudioPolicyService::AudioCommandThread::stopToneCommand() { Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = STOP_TONE; command->mParam = NULL; command->mWaitStatus = false; Mutex::Autolock _l(mLock); insertCommand_l(command); LOGV("AudioCommandThread() adding tone stop"); mWaitWorkCV.signal(); Loading @@ -626,7 +640,6 @@ status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float { status_t status = NO_ERROR; Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = SET_VOLUME; VolumeData *data = new VolumeData(); Loading @@ -639,6 +652,7 @@ status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set volume stream %d, volume %f, output %d", stream, volume, output); mWaitWorkCV.signal(); Loading @@ -654,7 +668,6 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, { status_t status = NO_ERROR; Mutex::Autolock _l(mLock); AudioCommand *command = new AudioCommand(); command->mCommand = SET_PARAMETERS; ParametersData *data = new ParametersData(); Loading @@ -666,6 +679,7 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set parameter string %s, io %d ,delay %d", keyValuePairs.string(), ioHandle, delayMs); mWaitWorkCV.signal(); Loading @@ -677,6 +691,32 @@ status_t AudioPolicyService::AudioCommandThread::parametersCommand(int ioHandle, return status; } status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume, int delayMs) { status_t status = NO_ERROR; AudioCommand *command = new AudioCommand(); command->mCommand = SET_VOICE_VOLUME; VoiceVolumeData *data = new VoiceVolumeData(); data->mVolume = volume; command->mParam = data; if (delayMs == 0) { command->mWaitStatus = true; } else { command->mWaitStatus = false; } Mutex::Autolock _l(mLock); insertCommand_l(command, delayMs); LOGV("AudioCommandThread() adding set voice volume volume %f", volume); mWaitWorkCV.signal(); if (command->mWaitStatus) { command->mCond.wait(mLock); status = command->mStatus; mWaitWorkCV.signal(); } return status; } // insertCommand_l() must be called with mLock held void AudioPolicyService::AudioCommandThread::insertCommand_l(AudioCommand *command, int delayMs) { Loading