12#include <freertos/FreeRTOS.h>
13#include <freertos/event_groups.h>
18namespace mixer_speaker {
47 void setup()
override;
50 size_t play(
const uint8_t *data,
size_t length, TickType_t ticks_to_wait)
override;
53 void start()
override;
75 TickType_t ticks_to_wait);
92 void send_command_(uint32_t command_bit,
bool wake_loop =
false);
103 static void duck_samples(int16_t *input_buffer, uint32_t input_samples_to_duck, int8_t *current_ducking_db_reduction,
104 uint32_t *ducking_transition_samples_remaining, uint32_t samples_per_ducking_step,
105 int8_t db_change_per_ducking_step);
136 void setup()
override;
137 void loop()
override;
187 uint32_t frames_to_mix);
Fixed-capacity vector - allocates once at runtime, never reallocates This avoids std::vector template...
esp_err_t start_task_()
Starts the mixer task after allocating memory for the task stack.
esp_err_t delete_task_()
If the task is stopped, it sets the task handle to the nullptr and deallocates its stack.
uint32_t get_frames_in_pipeline() const
Returns the current number of frames in the output pipeline (written but not yet played)
void dump_config() override
esp_err_t start(audio::AudioStreamInfo &stream_info)
Starts the mixer task.
void set_output_channels(uint8_t output_channels)
void add_source_speaker(SourceSpeaker *source_speaker)
FixedVector< SourceSpeaker * > source_speakers_
void set_task_stack_in_psram(bool task_stack_in_psram)
speaker::Speaker * get_output_speaker() const
void set_output_speaker(speaker::Speaker *speaker)
StackType_t * task_stack_buffer_
static void mix_audio_samples(const int16_t *primary_buffer, audio::AudioStreamInfo primary_stream_info, const int16_t *secondary_buffer, audio::AudioStreamInfo secondary_stream_info, int16_t *output_buffer, audio::AudioStreamInfo output_stream_info, uint32_t frames_to_mix)
Mixes the primary and secondary streams taking into account the number of channels in each stream.
bool task_stack_in_psram_
TaskHandle_t task_handle_
void set_queue_mode(bool queue_mode)
static void copy_frames(const int16_t *input_buffer, audio::AudioStreamInfo input_stream_info, int16_t *output_buffer, audio::AudioStreamInfo output_stream_info, uint32_t frames_to_transfer)
Copies audio frames from the input buffer to the output buffer taking into account the number of chan...
std::atomic< uint32_t > frames_in_pipeline_
static void audio_mixer_task(void *params)
EventGroupHandle_t event_group_
speaker::Speaker * output_speaker_
void init_source_speakers(size_t count)
optional< audio::AudioStreamInfo > audio_stream_info_
uint32_t buffer_duration_ms_
std::shared_ptr< audio::AudioSourceTransferBuffer > transfer_buffer_
optional< uint32_t > timeout_ms_
float get_volume() override
void set_mute_state(bool mute_state) override
Mute state changes are passed to the parent's output speaker.
int8_t current_ducking_db_reduction_
void set_buffer_duration(uint32_t buffer_duration_ms)
static void duck_samples(int16_t *input_buffer, uint32_t input_samples_to_duck, int8_t *current_ducking_db_reduction, uint32_t *ducking_transition_samples_remaining, uint32_t samples_per_ducking_step, int8_t db_change_per_ducking_step)
Ducks audio samples by a specified amount.
void send_command_(uint32_t command_bit, bool wake_loop=false)
bool get_pause_state() const override
std::weak_ptr< audio::AudioSourceTransferBuffer > get_transfer_buffer()
bool get_mute_state() override
uint32_t samples_per_ducking_step_
void set_timeout(uint32_t ms)
std::atomic< uint32_t > playback_delay_frames_
uint32_t stopping_start_ms_
void apply_ducking(uint8_t decibel_reduction, uint32_t duration)
Sets the ducking level for the source speaker.
std::weak_ptr< RingBuffer > ring_buffer_
size_t play(const uint8_t *data, size_t length) override
int8_t target_ducking_db_reduction_
size_t play(const uint8_t *data, size_t length, TickType_t ticks_to_wait) override
uint32_t ducking_transition_samples_remaining_
void set_parent(MixerSpeaker *parent)
size_t process_data_from_source(std::shared_ptr< audio::AudioSourceTransferBuffer > &transfer_buffer, TickType_t ticks_to_wait)
Transfers audio from the ring buffer into the transfer buffer.
std::atomic< bool > has_contributed_
void dump_config() override
void enter_stopping_state_()
int8_t db_change_per_ducking_step_
void set_volume(float volume) override
Volume state changes are passed to the parent's output speaker.
bool has_buffered_data() const override
uint32_t last_seen_data_ms_
void set_pause_state(bool pause_state) override
EventGroupHandle_t event_group_
std::atomic< uint32_t > pending_playback_frames_
Providing packet encoding functions for exchanging data with a remote host.