diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-09 14:29:08 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-09-09 14:29:08 -0700 |
commit | 8136cfae9c22ae8ff42eec9ed751833dda605444 (patch) | |
tree | b6e71058c48bcdd37046ddfa60e3da80b5cc1015 /services | |
parent | a041f2fce87fa7a0926365d8e8fbc66019ac0661 (diff) | |
parent | 8a910716892d17a2ac62c7e9884af0e9d75b26bc (diff) | |
download | frameworks_av-8136cfae9c22ae8ff42eec9ed751833dda605444.zip frameworks_av-8136cfae9c22ae8ff42eec9ed751833dda605444.tar.gz frameworks_av-8136cfae9c22ae8ff42eec9ed751833dda605444.tar.bz2 |
am 8a910716: am 6ca83fad: Merge "audioflinger: no effects on offloaded tracks" into klp-dev
* commit '8a910716892d17a2ac62c7e9884af0e9d75b26bc':
audioflinger: no effects on offloaded tracks
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 40 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.h | 6 | ||||
-rw-r--r-- | services/audioflinger/Effects.cpp | 34 | ||||
-rw-r--r-- | services/audioflinger/Effects.h | 4 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 12 |
5 files changed, 83 insertions, 13 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 4a7ddfd..fc98891 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -98,6 +98,11 @@ size_t AudioFlinger::mTeeSinkOutputFrames = kTeeSinkOutputFramesDefault; size_t AudioFlinger::mTeeSinkTrackFrames = kTeeSinkTrackFramesDefault; #endif +//TODO: remove when effect offload is implemented +// In order to avoid invalidating offloaded tracks each time a Visualizer is turned on and off +// we define a minimum time during which a global effect is considered enabled. +static const nsecs_t kMinGlobalEffectEnabletimeNs = seconds(7200); + // ---------------------------------------------------------------------------- static int load_audio_interface(const char *if_name, audio_hw_device_t **dev) @@ -141,7 +146,8 @@ AudioFlinger::AudioFlinger() mMode(AUDIO_MODE_INVALID), mBtNrecIsOff(false), mIsLowRamDevice(true), - mIsDeviceTypeKnown(false) + mIsDeviceTypeKnown(false), + mGlobalEffectEnableTime(0) { getpid_cached = getpid(); char value[PROPERTY_VALUE_MAX]; @@ -2314,6 +2320,38 @@ status_t AudioFlinger::moveEffectChain_l(int sessionId, return NO_ERROR; } +bool AudioFlinger::isGlobalEffectEnabled_l() +{ + if (mGlobalEffectEnableTime != 0 && + ((systemTime() - mGlobalEffectEnableTime) < kMinGlobalEffectEnabletimeNs)) { + return true; + } + + for (size_t i = 0; i < mPlaybackThreads.size(); i++) { + sp<EffectChain> ec = + mPlaybackThreads.valueAt(i)->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX); + if (ec != 0 && ec->isEnabled()) { + return true; + } + } + return false; +} + +void AudioFlinger::onGlobalEffectEnable() +{ + Mutex::Autolock _l(mLock); + + mGlobalEffectEnableTime = systemTime(); + + for (size_t i = 0; i < mPlaybackThreads.size(); i++) { + sp<PlaybackThread> t = mPlaybackThreads.valueAt(i); + if (t->mType == ThreadBase::OFFLOAD) { + t->invalidateTracks(AUDIO_STREAM_MUSIC); + } + } + +} + struct Entry { #define MAX_NAME 32 // %Y%m%d%H%M%S_%d.wav char mName[MAX_NAME]; diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 1269aa4..39cdec0 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -466,6 +466,10 @@ private: void removeClient_l(pid_t pid); void removeNotificationClient(pid_t pid); + //TODO: remove when effect offload is implemented + bool isGlobalEffectEnabled_l(); + void onGlobalEffectEnable(); + class AudioHwDevice { public: enum Flags { @@ -641,6 +645,8 @@ public: private: bool mIsLowRamDevice; bool mIsDeviceTypeKnown; + //TODO: remove when effect offload is implemented + nsecs_t mGlobalEffectEnableTime; // when a global effect was last enabled }; #undef INCLUDING_FROM_AUDIOFLINGER_H diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index 2a18104..fc45caa 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -594,17 +594,6 @@ status_t AudioFlinger::EffectModule::setEnabled_l(bool enabled) h->setEnabled(enabled); } } -//EL_FIXME not sure why this is needed? -// sp<ThreadBase> thread = mThread.promote(); -// if (thread == 0) { -// return NO_ERROR; -// } -// -// if ((thread->type() == ThreadBase::OFFLOAD) && (enabled)) { -// PlaybackThread *p = (PlaybackThread *)thread.get(); -// ALOGV("setEnabled: Offload, invalidate tracks"); -// p->invalidateTracks(AUDIO_STREAM_MUSIC); -// } } return NO_ERROR; } @@ -943,6 +932,17 @@ status_t AudioFlinger::EffectHandle::enable() thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId()); } mEnabled = false; + } else { + //TODO: remove when effect offload is implemented + if (thread != 0) { + if ((thread->type() == ThreadBase::OFFLOAD)) { + PlaybackThread *t = (PlaybackThread *)thread.get(); + t->invalidateTracks(AUDIO_STREAM_MUSIC); + } + if (mEffect->sessionId() == AUDIO_SESSION_OUTPUT_MIX) { + thread->mAudioFlinger->onGlobalEffectEnable(); + } + } } return status; } @@ -1729,4 +1729,16 @@ void AudioFlinger::EffectChain::checkSuspendOnEffectEnabled(const sp<EffectModul } } +bool AudioFlinger::EffectChain::isEnabled() +{ + Mutex::Autolock _l(mLock); + size_t size = mEffects.size(); + for (size_t i = 0; i < size; i++) { + if (mEffects[i]->isEnabled()) { + return true; + } + } + return false; +} + }; // namespace android diff --git a/services/audioflinger/Effects.h b/services/audioflinger/Effects.h index 0b7fb83..bac50f2 100644 --- a/services/audioflinger/Effects.h +++ b/services/audioflinger/Effects.h @@ -303,6 +303,10 @@ public: void clearInputBuffer(); + // At least one effect in the chain is enabled + bool isEnabled(); + + void dump(int fd, const Vector<String16>& args); protected: diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index e2dbb2c..7f58300 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -552,7 +552,17 @@ status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t ev sp<ThreadBase> thread = mThread.promote(); if (thread != 0) { - Mutex::Autolock _l(thread->mLock); + //TODO: remove when effect offload is implemented + if (isOffloaded()) { + Mutex::Autolock _laf(thread->mAudioFlinger->mLock); + Mutex::Autolock _lth(thread->mLock); + sp<EffectChain> ec = thread->getEffectChain_l(mSessionId); + if (thread->mAudioFlinger->isGlobalEffectEnabled_l() || (ec != 0 && ec->isEnabled())) { + invalidate(); + return PERMISSION_DENIED; + } + } + Mutex::Autolock _lth(thread->mLock); track_state state = mState; // here the track could be either new, or restarted // in both cases "unstop" the track |