ladybird/Libraries/LibMedia/Processors/AudioMixer.h
Zaggy1024 eeff03c980 LibMedia: Rename some folders/identifiers for the upcoming refactor
- Provider -> producer
- (Audio|Video)DataProvider -> Decoded(Audio|Video)Producer
- MediaTimeProvider remains suffixed Provider, moves out of the
  Providers folder to the root of LibMedia

This brings the naming more in line with the intended split
functionality split between different nodes in the pipeline.
2026-05-13 02:05:35 -05:00

65 lines
1.8 KiB
C++

/*
* Copyright (c) 2026-present, the Ladybird developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Atomic.h>
#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/NonnullRefPtr.h>
#include <AK/RefPtr.h>
#include <LibCore/EventLoop.h>
#include <LibMedia/Audio/Forward.h>
#include <LibMedia/Audio/SampleSpecification.h>
#include <LibMedia/AudioBlock.h>
#include <LibMedia/Export.h>
#include <LibMedia/Forward.h>
#include <LibMedia/Producers/DecodedAudioProducer.h>
#include <LibMedia/Sinks/AudioSink.h>
#include <LibMedia/Track.h>
#include <LibSync/Mutex.h>
namespace Media {
class MEDIA_API AudioMixer final : public AudioSink {
public:
static ErrorOr<NonnullRefPtr<AudioMixer>> try_create();
AudioMixer();
virtual ~AudioMixer() override = default;
virtual void set_producer(Track const&, RefPtr<DecodedAudioProducer> const&) override;
virtual RefPtr<DecodedAudioProducer> producer(Track const&) const override;
void set_sample_specification(Audio::SampleSpecification);
Audio::SampleSpecification sample_specification() const;
bool mix_one_block_into(AudioBlock& out_block);
void reset_to_sample_position(i64 sample_position);
Function<void(Track const&)> on_start_buffering;
private:
struct TrackMixingData {
TrackMixingData(NonnullRefPtr<DecodedAudioProducer> const& producer)
: producer(producer)
{
}
NonnullRefPtr<DecodedAudioProducer> producer;
AudioBlock current_block;
bool buffering { false };
};
Core::EventLoop& m_main_thread_event_loop;
mutable Sync::Mutex m_mutex;
Audio::SampleSpecification m_sample_specification;
HashMap<Track, TrackMixingData> m_track_mixing_datas;
i64 m_next_sample_to_write { 0 };
};
}