- 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.
65 lines
1.8 KiB
C++
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 };
|
|
};
|
|
|
|
}
|