/* * Copyright (c) 2021, kleines Filmröllchen * Copyright (c) 2021, JJ Roberts-White * * SPDX-License-Identifier: BSD-2-Clause */ #include "AudioPlayerLoop.h" #include "TrackManager.h" // Converts Piano-internal data to an Audio::Buffer that AudioServer receives static NonnullRefPtr music_samples_to_buffer(Array samples) { Vector frames; frames.ensure_capacity(sample_count); for (auto sample : samples) { Audio::Frame frame = { sample.left / (double)NumericLimits::max(), sample.right / (double)NumericLimits::max() }; frames.unchecked_append(frame); } return Audio::Buffer::create_with_samples(frames); } AudioPlayerLoop::AudioPlayerLoop(TrackManager& track_manager, bool& need_to_write_wav, Audio::WavWriter& wav_writer) : m_track_manager(track_manager) , m_need_to_write_wav(need_to_write_wav) , m_wav_writer(wav_writer) { m_audio_client = Audio::ClientConnection::construct(); m_audio_client->on_finish_playing_buffer = [this](int buffer_id) { (void)buffer_id; enqueue_audio(); }; } void AudioPlayerLoop::enqueue_audio() { m_track_manager.fill_buffer(m_buffer); NonnullRefPtr audio_buffer = music_samples_to_buffer(m_buffer); m_audio_client->async_enqueue(audio_buffer); // FIXME: This should be done somewhere else. if (m_need_to_write_wav) { m_need_to_write_wav = false; m_track_manager.reset(); m_track_manager.set_should_loop(false); do { m_track_manager.fill_buffer(m_buffer); m_wav_writer.write_samples(reinterpret_cast(m_buffer.data()), buffer_size); } while (m_track_manager.time()); m_track_manager.reset(); m_track_manager.set_should_loop(true); m_wav_writer.finalize(); } } void AudioPlayerLoop::toggle_paused() { m_should_play_audio = !m_should_play_audio; m_audio_client->set_paused(!m_should_play_audio); }