From de070137f11d346fba77605bd76a44c040a618fc Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 13 Jul 2010 04:45:46 -0700 Subject: Audio policy manager changes for audio effects Added methods for audio effects management by audio policy manager. - control of total CPU load and memory used by effect engines - selection of output stream for global effects - added audio session id in parameter list for startOutput() and stopOutput(). this is not used in default audio policy manager implementation. Modifications of audio effect framework in AudioFlinger to allow moving and reconfiguring effect engines from one output mixer thread to another when audio tracks in the same session are moved or when requested by audio policy manager. Also fixed mutex deadlock problem with effect chains locks. Change-Id: Ida43484b06e9b890d6b9e53c13958d042720ebdb --- services/audioflinger/AudioFlinger.h | 50 ++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 17 deletions(-) (limited to 'services/audioflinger/AudioFlinger.h') diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 99816f9..a8c9a92 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -168,8 +168,7 @@ public: int *id, int *enabled); - status_t registerEffectResource_l(effect_descriptor_t *desc); - void unregisterEffectResource_l(effect_descriptor_t *desc); + virtual status_t moveEffects(int session, int srcOutput, int dstOutput); enum hardware_call_state { AUDIO_HW_IDLE = 0, @@ -619,15 +618,22 @@ private: sp getEffectChain_l(int sessionId); status_t addEffectChain_l(const sp& chain); size_t removeEffectChain_l(const sp& chain); - void lockEffectChains_l(); - void unlockEffectChains(); + void lockEffectChains_l(Vector >& effectChains); + void unlockEffectChains(Vector >& effectChains); sp getEffect_l(int sessionId, int effectId); void detachAuxEffect_l(int effectId); - status_t attachAuxEffect(const sp track, int EffectId); - status_t attachAuxEffect_l(const sp track, int EffectId); + status_t attachAuxEffect(const sp track, + int EffectId); + status_t attachAuxEffect_l(const sp track, + int EffectId); void setMode(uint32_t mode); + status_t addEffect_l(const sp< EffectModule>& effect); + void removeEffect_l(const sp< EffectModule>& effect); + + uint32_t getStrategyForSession_l(int sessionId); + struct stream_type_t { stream_type_t() : volume(1.0f), @@ -690,7 +696,10 @@ private: class MixerThread : public PlaybackThread { public: - MixerThread (const sp& audioFlinger, AudioStreamOut* output, int id, uint32_t device); + MixerThread (const sp& audioFlinger, + AudioStreamOut* output, + int id, + uint32_t device); virtual ~MixerThread(); // Thread virtuals @@ -701,7 +710,8 @@ private: virtual status_t dumpInternals(int fd, const Vector& args); protected: - uint32_t prepareTracks_l(const SortedVector< wp >& activeTracks, Vector< sp > *tracksToRemove); + uint32_t prepareTracks_l(const SortedVector< wp >& activeTracks, + Vector< sp > *tracksToRemove); virtual int getTrackName_l(); virtual void deleteTrackName_l(int name); virtual uint32_t activeSleepTimeUs(); @@ -764,6 +774,9 @@ private: void audioConfigChanged_l(int event, int ioHandle, void *param2); int nextUniqueId(); + status_t moveEffectChain_l(int session, + AudioFlinger::PlaybackThread *srcThread, + AudioFlinger::PlaybackThread *dstThread); friend class AudioBuffer; @@ -931,6 +944,9 @@ private: uint32_t status() { return mStatus; } + int sessionId() { + return mSessionId; + } status_t setEnabled(bool enabled); bool isEnabled(); @@ -938,6 +954,8 @@ private: int16_t *inBuffer() { return mConfig.inputCfg.buffer.s16; } void setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; } int16_t *outBuffer() { return mConfig.outputCfg.buffer.s16; } + void setChain(const wp& chain) { mChain = chain; } + void setThread(const wp& thread) { mThread = thread; } status_t addHandle(sp& handle); void disconnect(const wp& handle); @@ -1061,19 +1079,19 @@ private: mLock.unlock(); } - status_t addEffect_l(sp& handle); + status_t addEffect_l(const sp& handle); size_t removeEffect_l(const sp& handle); int sessionId() { return mSessionId; } + sp getEffectFromDesc_l(effect_descriptor_t *descriptor); sp getEffectFromId_l(int id); bool setVolume_l(uint32_t *left, uint32_t *right); void setDevice_l(uint32_t device); void setMode_l(uint32_t mode); - void setInBuffer(int16_t *buffer, bool ownsBuffer = false) { mInBuffer = buffer; mOwnInBuffer = ownsBuffer; @@ -1092,6 +1110,10 @@ private: void stopTrack() {mActiveTrackCnt--;} int activeTracks() { return mActiveTrackCnt;} + uint32_t strategy() { return mStrategy; } + void setStrategy(uint32_t strategy) + { mStrategy = strategy; } + status_t dump(int fd, const Vector& args); protected: @@ -1112,7 +1134,7 @@ private: uint32_t mRightVolume; // previous volume on right channel uint32_t mNewLeftVolume; // new volume on left channel uint32_t mNewRightVolume; // new volume on right channel - + uint32_t mStrategy; // strategy for this effect chain }; friend class RecordThread; @@ -1142,12 +1164,6 @@ private: #endif uint32_t mMode; - // Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units - static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000; - // Maximum memory allocated to audio effects in KB - static const uint32_t MAX_EFFECTS_MEMORY = 512; - uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects - uint32_t mTotalEffectsMemory; // current memory used by effects }; // ---------------------------------------------------------------------------- -- cgit v1.1