Loading media/libaudioclient/AudioEffect.cpp +14 −3 Original line number Diff line number Diff line Loading @@ -70,7 +70,8 @@ status_t AudioEffect::set(const effect_uuid_t *type, audio_session_t sessionId, audio_io_handle_t io, const AudioDeviceTypeAddr& device, bool probe) bool probe, bool notifyFramesProcessed) { sp<media::IEffect> iEffect; sp<IMemory> cblk; Loading Loading @@ -124,6 +125,7 @@ status_t AudioEffect::set(const effect_uuid_t *type, request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device)); request.attributionSource = mClientAttributionSource; request.probe = probe; request.notifyFramesProcessed = notifyFramesProcessed; media::CreateEffectResponse response; Loading Loading @@ -194,7 +196,8 @@ status_t AudioEffect::set(const char *typeStr, audio_session_t sessionId, audio_io_handle_t io, const AudioDeviceTypeAddr& device, bool probe) bool probe, bool notifyFramesProcessed) { effect_uuid_t type; effect_uuid_t *pType = nullptr; Loading @@ -211,7 +214,8 @@ status_t AudioEffect::set(const char *typeStr, pUuid = &uuid; } return set(pType, pUuid, priority, cbf, user, sessionId, io, device, probe); return set(pType, pUuid, priority, cbf, user, sessionId, io, device, probe, notifyFramesProcessed); } Loading Loading @@ -522,6 +526,13 @@ void AudioEffect::commandExecuted(int32_t cmdCode, } } void AudioEffect::framesProcessed(int32_t frames) { if (mCbf != NULL) { mCbf(EVENT_FRAMES_PROCESSED, mUserData, &frames); } } // ------------------------------------------------------------------------- status_t AudioEffect::queryNumberEffects(uint32_t *numEffects) Loading media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -37,4 +37,6 @@ parcelable CreateEffectRequest { AudioDevice device; AttributionSourceState attributionSource; boolean probe; /** true if a callback must be sent each time audio frames are processed */ boolean notifyFramesProcessed; } media/libaudioclient/aidl/android/media/IEffectClient.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -43,4 +43,10 @@ interface IEffectClient { * TODO(ytai): replace opaque byte arrays with strongly typed parameters. */ oneway void commandExecuted(int cmdCode, in byte[] cmdData, in byte[] replyData); /** * Called whenever audio frames have been processed by the effect engine. * @param frames number of frames processed. */ oneway void framesProcessed(int frames); } media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -383,6 +383,9 @@ struct EffectClient : public android::media::BnEffectClient { const std::vector<uint8_t> &replyData __unused) override { return binder::Status::ok(); } binder::Status framesProcessed(int32_t frames __unused) override { return binder::Status::ok(); } }; status_t AudioFlingerFuzzer::invokeAudioEffect() { Loading Loading @@ -424,6 +427,7 @@ status_t AudioFlingerFuzzer::invokeAudioEffect() { request.attributionSource.packageName = opPackageName; request.attributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(getpid())); request.probe = false; request.notifyFramesProcessed = false; media::CreateEffectResponse response{}; status_t status = af->createEffect(request, &response); Loading media/libaudioclient/include/media/AudioEffect.h +15 −3 Original line number Diff line number Diff line Loading @@ -283,7 +283,8 @@ public: EVENT_CONTROL_STATUS_CHANGED = 0, EVENT_ENABLE_STATUS_CHANGED = 1, EVENT_PARAMETER_CHANGED = 2, EVENT_ERROR = 3 EVENT_ERROR = 3, EVENT_FRAMES_PROCESSED = 4, }; /* Callback function notifying client application of a change in effect engine state or Loading Loading @@ -389,7 +390,8 @@ public: audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, const AudioDeviceTypeAddr& device = {}, bool probe = false); bool probe = false, bool notifyFramesProcessed = false); /* * Same as above but with type and uuid specified by character strings. */ Loading @@ -401,7 +403,8 @@ public: audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, const AudioDeviceTypeAddr& device = {}, bool probe = false); bool probe = false, bool notifyFramesProcessed = false); /* Result of constructing the AudioEffect. This must be checked * before using any AudioEffect API. Loading Loading @@ -552,6 +555,7 @@ protected: virtual void commandExecuted(int32_t cmdCode, const std::vector<uint8_t>& cmdData, const std::vector<uint8_t>& replyData); virtual void framesProcessed(int32_t frames); private: Loading Loading @@ -587,6 +591,14 @@ private: } return binder::Status::ok(); } binder::Status framesProcessed(int32_t frames) override { sp<AudioEffect> effect = mEffect.promote(); if (effect != 0) { effect->framesProcessed(frames); } return binder::Status::ok(); } // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& /*who*/) { Loading Loading
media/libaudioclient/AudioEffect.cpp +14 −3 Original line number Diff line number Diff line Loading @@ -70,7 +70,8 @@ status_t AudioEffect::set(const effect_uuid_t *type, audio_session_t sessionId, audio_io_handle_t io, const AudioDeviceTypeAddr& device, bool probe) bool probe, bool notifyFramesProcessed) { sp<media::IEffect> iEffect; sp<IMemory> cblk; Loading Loading @@ -124,6 +125,7 @@ status_t AudioEffect::set(const effect_uuid_t *type, request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device)); request.attributionSource = mClientAttributionSource; request.probe = probe; request.notifyFramesProcessed = notifyFramesProcessed; media::CreateEffectResponse response; Loading Loading @@ -194,7 +196,8 @@ status_t AudioEffect::set(const char *typeStr, audio_session_t sessionId, audio_io_handle_t io, const AudioDeviceTypeAddr& device, bool probe) bool probe, bool notifyFramesProcessed) { effect_uuid_t type; effect_uuid_t *pType = nullptr; Loading @@ -211,7 +214,8 @@ status_t AudioEffect::set(const char *typeStr, pUuid = &uuid; } return set(pType, pUuid, priority, cbf, user, sessionId, io, device, probe); return set(pType, pUuid, priority, cbf, user, sessionId, io, device, probe, notifyFramesProcessed); } Loading Loading @@ -522,6 +526,13 @@ void AudioEffect::commandExecuted(int32_t cmdCode, } } void AudioEffect::framesProcessed(int32_t frames) { if (mCbf != NULL) { mCbf(EVENT_FRAMES_PROCESSED, mUserData, &frames); } } // ------------------------------------------------------------------------- status_t AudioEffect::queryNumberEffects(uint32_t *numEffects) Loading
media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -37,4 +37,6 @@ parcelable CreateEffectRequest { AudioDevice device; AttributionSourceState attributionSource; boolean probe; /** true if a callback must be sent each time audio frames are processed */ boolean notifyFramesProcessed; }
media/libaudioclient/aidl/android/media/IEffectClient.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -43,4 +43,10 @@ interface IEffectClient { * TODO(ytai): replace opaque byte arrays with strongly typed parameters. */ oneway void commandExecuted(int cmdCode, in byte[] cmdData, in byte[] replyData); /** * Called whenever audio frames have been processed by the effect engine. * @param frames number of frames processed. */ oneway void framesProcessed(int frames); }
media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -383,6 +383,9 @@ struct EffectClient : public android::media::BnEffectClient { const std::vector<uint8_t> &replyData __unused) override { return binder::Status::ok(); } binder::Status framesProcessed(int32_t frames __unused) override { return binder::Status::ok(); } }; status_t AudioFlingerFuzzer::invokeAudioEffect() { Loading Loading @@ -424,6 +427,7 @@ status_t AudioFlingerFuzzer::invokeAudioEffect() { request.attributionSource.packageName = opPackageName; request.attributionSource.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(getpid())); request.probe = false; request.notifyFramesProcessed = false; media::CreateEffectResponse response{}; status_t status = af->createEffect(request, &response); Loading
media/libaudioclient/include/media/AudioEffect.h +15 −3 Original line number Diff line number Diff line Loading @@ -283,7 +283,8 @@ public: EVENT_CONTROL_STATUS_CHANGED = 0, EVENT_ENABLE_STATUS_CHANGED = 1, EVENT_PARAMETER_CHANGED = 2, EVENT_ERROR = 3 EVENT_ERROR = 3, EVENT_FRAMES_PROCESSED = 4, }; /* Callback function notifying client application of a change in effect engine state or Loading Loading @@ -389,7 +390,8 @@ public: audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, const AudioDeviceTypeAddr& device = {}, bool probe = false); bool probe = false, bool notifyFramesProcessed = false); /* * Same as above but with type and uuid specified by character strings. */ Loading @@ -401,7 +403,8 @@ public: audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, const AudioDeviceTypeAddr& device = {}, bool probe = false); bool probe = false, bool notifyFramesProcessed = false); /* Result of constructing the AudioEffect. This must be checked * before using any AudioEffect API. Loading Loading @@ -552,6 +555,7 @@ protected: virtual void commandExecuted(int32_t cmdCode, const std::vector<uint8_t>& cmdData, const std::vector<uint8_t>& replyData); virtual void framesProcessed(int32_t frames); private: Loading Loading @@ -587,6 +591,14 @@ private: } return binder::Status::ok(); } binder::Status framesProcessed(int32_t frames) override { sp<AudioEffect> effect = mEffect.promote(); if (effect != 0) { effect->framesProcessed(frames); } return binder::Status::ok(); } // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& /*who*/) { Loading