| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_BIN_MEDIA_AUDIO_SERVER_MIXER_FX_PROCESSOR_H_ |
| #define GARNET_BIN_MEDIA_AUDIO_SERVER_MIXER_FX_PROCESSOR_H_ |
| |
| #include <zircon/types.h> |
| #include <vector> |
| |
| #include "garnet/bin/media/audio_core/mixer/fx_loader.h" |
| #include "lib/media/audio_dfx/audio_device_fx.h" |
| |
| namespace media { |
| namespace audio { |
| |
| // FxProcessor represents a chain of active effect instances, attached to a |
| // specific device instance. It manages creation and sequencing of instances and |
| // allows callers to make a single Process or Flush call at media runtime. |
| // |
| // Internally, FxProcessor maintains a vector of effect instances. They all |
| // originate from the same .SO library (hence share a single FxLoader) and run |
| // at the same frame rate. This class is designed to be used synchronously and |
| // is not explicitly multi-thread-safe. |
| class FxProcessor { |
| public: |
| FxProcessor(FxLoader* loader, uint32_t frame_rate) |
| : fx_loader_(loader), frame_rate_(frame_rate) {} |
| ~FxProcessor(); |
| |
| // This maps to the corresponding Create ABI call, inserting it at [position]. |
| fx_token_t CreateFx(uint32_t effect_id, uint16_t channels_in, |
| uint16_t channels_out, uint8_t position); |
| |
| // Returns the number of active instances in the enclosed effect chain. |
| uint16_t GetNumFx(); |
| |
| // Returns the instance at the specified (zero-based) position in the chain. |
| fx_token_t GetFxAt(uint16_t position); |
| |
| // Move this instance from its current location in the chain to new_position. |
| // If the instance moves "leftward", all effects between it and new_position |
| // (including the one currently at new_position) will move "rightward" by one. |
| // If instance moves "rightward", all effects between it and new_position |
| // (including the instance currently at new_position) move "leftward" by one. |
| // Either way, afterward this instance resides at [new_position] in the chain. |
| zx_status_t ReorderFx(fx_token_t token, uint8_t new_position); |
| |
| // This removes instance from the chain and directly calls the DeleteFx ABI. |
| zx_status_t DeleteFx(fx_token_t fx_token); |
| |
| // This maps directly to the corresponding ABI call, for each instance. |
| zx_status_t ProcessInPlace(uint32_t num_frames, float* audio_buff_in_out); |
| |
| // This maps directly to the corresponding ABI call, for each instance. |
| zx_status_t Flush(); |
| |
| // |
| // Not yet implemented -- these five map directly to corresponding ABI calls. |
| // |
| // zx_status_t GetParameters(fx_token_t token,fuchsia_audio_dfx_parameters* |
| // params); |
| // zx_status_t Process(uint32_t num_frames,const float* audio_buff_in,float* |
| // audio_buff_out); |
| // zx_status_t GetControlValue(fx_token_t token, uint16_t ctrl_num, float* |
| // val_out); |
| // zx_status_t SetControlValue(fx_token_t token, uint16_t ctrl_num, float |
| // val); |
| // zx_status_t Reset(fx_token_t token); |
| |
| private: |
| // Used internally, this inserts an already-created instance into the chain. |
| zx_status_t InsertFx(fx_token_t fx_token, uint8_t position); |
| |
| // Used internally, this removes an already-created instance from the chain. |
| zx_status_t RemoveFx(fx_token_t fx_token); |
| |
| ::media::audio::FxLoader* fx_loader_; |
| uint32_t frame_rate_; |
| |
| std::vector<fx_token_t> fx_chain_; |
| }; |
| |
| } // namespace audio |
| } // namespace media |
| |
| #endif // GARNET_BIN_MEDIA_AUDIO_SERVER_MIXER_FX_PROCESSOR_H_ |