diff options
author | Eric Laurent <elaurent@google.com> | 2010-07-29 23:43:43 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2010-08-09 05:48:20 -0700 |
commit | 2a6b80bc65c4782b5a7168b300e1dc5ec9f617ee (patch) | |
tree | fc777c3694d8739aba7a44caedc867c7b87b88a9 | |
parent | 8fb2e6e4720385961083a150a3e848ccaef544ae (diff) | |
download | frameworks_base-2a6b80bc65c4782b5a7168b300e1dc5ec9f617ee.zip frameworks_base-2a6b80bc65c4782b5a7168b300e1dc5ec9f617ee.tar.gz frameworks_base-2a6b80bc65c4782b5a7168b300e1dc5ec9f617ee.tar.bz2 |
Fixed several audio effects problems.
- Fixed constant inversions in AudioEffect.java
- Do not return error when enabling an already enabled effect
- Update cached effect state in native AudioEffect class when effect is enabled/disabled by command() method
- Remove click when restarting effect during disable sequence
- Fixed problem in master mute management when volume control is delegated to effect.
Change-Id: I6df4ce9fcc54fdc7345df858f639d20d802d6712
-rw-r--r-- | api/current.xml | 4 | ||||
-rw-r--r-- | media/java/android/media/AudioEffect.java | 13 | ||||
-rw-r--r-- | media/libmedia/AudioEffect.cpp | 25 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 13 |
4 files changed, 38 insertions, 17 deletions
diff --git a/api/current.xml b/api/current.xml index 197e2cd..841aa21 100644 --- a/api/current.xml +++ b/api/current.xml @@ -85290,7 +85290,7 @@ type="int" transient="false" volatile="false" - value="1" + value="0" static="true" final="true" deprecated="not deprecated" @@ -85301,7 +85301,7 @@ type="int" transient="false" volatile="false" - value="0" + value="1" static="true" final="true" deprecated="not deprecated" diff --git a/media/java/android/media/AudioEffect.java b/media/java/android/media/AudioEffect.java index aed29c3..35038fa 100644 --- a/media/java/android/media/AudioEffect.java +++ b/media/java/android/media/AudioEffect.java @@ -101,15 +101,15 @@ public class AudioEffect { public static final int STATE_INITIALIZED = 1; // to keep in sync with - // frameworks/base/media/jni/audioeffect/android_media_AudioEffect.cpp + // frameworks/base/include/media/AudioEffect.h /** - * Event id for engine state change notification. + * Event id for engine control ownership change notification. */ - public static final int NATIVE_EVENT_ENABLED_STATUS = 0; + public static final int NATIVE_EVENT_CONTROL_STATUS = 0; /** - * Event id for engine control ownership change notification. + * Event id for engine state change notification. */ - public static final int NATIVE_EVENT_CONTROL_STATUS = 1; + public static final int NATIVE_EVENT_ENABLED_STATUS = 1; /** * Event id for engine parameter change notification. */ @@ -795,7 +795,7 @@ public class AudioEffect { // Interface definitions // -------------------- /** - * The OnParameterChangeListener interface defines a method called by the AudioEffect + * The OnEnableStatusChangeListener interface defines a method called by the AudioEffect * when a the enabled state of the effect engine was changed by the controlling application. */ public interface OnEnableStatusChangeListener { @@ -922,7 +922,6 @@ public class AudioEffect { if (effect == null) { return; } - if (effect.mNativeEventHandler != null) { Message m = effect.mNativeEventHandler.obtainMessage(what, arg1, arg2, obj); diff --git a/media/libmedia/AudioEffect.cpp b/media/libmedia/AudioEffect.cpp index 3cdf48a..0f3e245 100644 --- a/media/libmedia/AudioEffect.cpp +++ b/media/libmedia/AudioEffect.cpp @@ -218,7 +218,7 @@ status_t AudioEffect::setEnabled(bool enabled) return mIEffect->disable(); } } - return INVALID_OPERATION; + return NO_ERROR; } status_t AudioEffect::command(uint32_t cmdCode, @@ -231,7 +231,22 @@ status_t AudioEffect::command(uint32_t cmdCode, return INVALID_OPERATION; } - return mIEffect->command(cmdCode, cmdSize, cmdData, replySize, replyData); + status_t status = mIEffect->command(cmdCode, cmdSize, cmdData, replySize, replyData); + if (status != NO_ERROR) { + return status; + } + status = *(status_t *)replyData; + if (status != NO_ERROR) { + return status; + } + + if (cmdCode == EFFECT_CMD_ENABLE) { + android_atomic_or(1, &mEnabled); + } + if (cmdCode == EFFECT_CMD_DISABLE) { + android_atomic_and(~1, &mEnabled); + } + return status; } @@ -347,7 +362,11 @@ void AudioEffect::enableStatusChanged(bool enabled) { LOGV("enableStatusChanged %p enabled %d mCbf %p", this, enabled, mCbf); if (mStatus == ALREADY_EXISTS) { - mEnabled = enabled; + if (enabled) { + android_atomic_or(1, &mEnabled); + } else { + android_atomic_and(~1, &mEnabled); + } if (mCbf) { mCbf(EVENT_ENABLE_STATUS_CHANGED, mUserData, &enabled); } diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 252b42a..1c7faa4 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1696,7 +1696,10 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track // Delegate master volume control to effect in output mix effect chain if needed sp<EffectChain> chain = getEffectChain_l(AudioSystem::SESSION_OUTPUT_MIX); if (chain != 0) { - uint32_t v = (uint32_t)(masterVolume * (1 << 24)); + uint32_t v = 0; + if (!masterMute) { + v = (uint32_t)(masterVolume * (1 << 24)); + } chain->setVolume_l(&v, &v); masterVolume = (float)((v + (1 << 23)) >> 24); chain.clear(); @@ -1750,7 +1753,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track // compute volume for this track int16_t left, right, aux; - if (track->isMuted() || masterMute || track->isPausing() || + if (track->isMuted() || track->isPausing() || mStreamTypes[track->type()].mute) { left = right = aux = 0; if (track->isPausing()) { @@ -5351,7 +5354,7 @@ void AudioFlinger::EffectModule::process() return; } - if (mState == ACTIVE || mState == STOPPING || mState == STOPPED) { + if (mState == ACTIVE || mState == STOPPING || mState == STOPPED || mState == RESTART) { // do 32 bit to 16 bit conversion for auxiliary effect input buffer if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { AudioMixer::ditherAndClamp(mConfig.inputCfg.buffer.s32, @@ -6032,8 +6035,8 @@ void AudioFlinger::EffectHandle::dump(char* buffer, size_t size) AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread, int sessionId) : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mOwnInBuffer(false), - mVolumeCtrlIdx(-1), mLeftVolume(0), mRightVolume(0), - mNewLeftVolume(0), mNewRightVolume(0) + mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX), + mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX) { mStrategy = AudioSystem::getStrategyForStream(AudioSystem::MUSIC); } |