1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 10:17:35 +00:00

Piano: Overhaul AudioPlayerLoop and throw out event loops

The audio player loop uses custom IPC plumbing to safely bypass any
event loop shenanigans. There is still work to be done, but this already
improves the realtime capabilities of Piano.
This commit is contained in:
kleines Filmröllchen 2022-11-13 18:06:03 +01:00 committed by Andrew Kaster
parent f1d486bcde
commit b7eea03103
4 changed files with 148 additions and 42 deletions

View file

@ -15,6 +15,7 @@
#include <LibCore/Event.h>
#include <LibCore/Object.h>
#include <LibDSP/Music.h>
#include <LibThreading/Thread.h>
class TrackManager;
@ -23,23 +24,30 @@ class TrackManager;
class AudioPlayerLoop final : public Core::Object {
C_OBJECT(AudioPlayerLoop)
public:
virtual ~AudioPlayerLoop() override;
void enqueue_audio();
void toggle_paused();
bool is_playing() const { return m_should_play_audio; }
private:
AudioPlayerLoop(TrackManager& track_manager, bool& need_to_write_wav, Audio::WavWriter& wav_writer);
AudioPlayerLoop(TrackManager& track_manager, Atomic<bool>& need_to_write_wav, Threading::MutexProtected<Audio::WavWriter>& wav_writer);
virtual void timer_event(Core::TimerEvent&) override;
intptr_t pipeline_thread_main();
ErrorOr<void> send_audio_to_server();
void write_wav_if_needed();
TrackManager& m_track_manager;
FixedArray<DSP::Sample> m_buffer;
Optional<Audio::ResampleHelper<DSP::Sample>> m_resampler;
RefPtr<Audio::ConnectionToServer> m_audio_client;
NonnullRefPtr<Threading::Thread> m_pipeline_thread;
Vector<Audio::Sample, Audio::AUDIO_BUFFER_SIZE> m_remaining_samples {};
bool m_should_play_audio = true;
Atomic<bool> m_should_play_audio { true };
Atomic<bool> m_exit_requested { false };
bool& m_need_to_write_wav;
Audio::WavWriter& m_wav_writer;
Atomic<bool>& m_need_to_write_wav;
Threading::MutexProtected<Audio::WavWriter>& m_wav_writer;
};