11#include <freertos/event_groups.h>
12#include <freertos/FreeRTOS.h>
15namespace mixer_speaker {
42 void setup()
override;
45 size_t play(
const uint8_t *data,
size_t length, TickType_t ticks_to_wait)
override;
48 void start()
override;
95 static void duck_samples(int16_t *input_buffer, uint32_t input_samples_to_duck, int8_t *current_ducking_db_reduction,
96 uint32_t *ducking_transition_samples_remaining, uint32_t samples_per_ducking_step,
97 int8_t db_change_per_ducking_step);
123 void setup()
override;
124 void loop()
override;
172 uint32_t frames_to_mix);
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.
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)
void set_task_stack_in_psram(bool task_stack_in_psram)
speaker::Speaker * get_output_speaker() const
std::vector< SourceSpeaker * > source_speakers_
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...
static void audio_mixer_task(void *params)
EventGroupHandle_t event_group_
speaker::Speaker * output_speaker_
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.
size_t process_data_from_source(TickType_t ticks_to_wait)
Transfers audio from the ring buffer into the transfer buffer.
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)
uint32_t pending_playback_frames_
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)
void dump_config() override
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
Providing packet encoding functions for exchanging data with a remote host.