This gives us a cheap way to wake up all PlaybackStream implementations when they are sleeping due to an underrun. The new function is meant to be very cheap so that it can be unconditionally called when new data is ready to be written. This will allow the audio sink to rely on streams to track the time in written audio frames instead of writing silence when data isn't ready. The WASAPI implementation was actually polling for new data every 10ms after hitting an underrun, so now it drains the buffers and stops when entering the underrun-paused state.
44 lines
1.3 KiB
C++
44 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
|
|
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
|
* Copyright (c) 2025, Gregory Bertilson <gregory@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "PlaybackStream.h"
|
|
#include <AK/Error.h>
|
|
#include <AK/NonnullRefPtr.h>
|
|
|
|
namespace Audio {
|
|
|
|
class AudioState;
|
|
|
|
class PlaybackStreamAudioUnit final : public PlaybackStream {
|
|
public:
|
|
static NonnullRefPtr<CreatePromise> create(OutputState initial_output_state, u32 target_latency_ms, AudioDataRequestCallback&&);
|
|
|
|
virtual SampleSpecification sample_specification() const override;
|
|
|
|
virtual void set_underrun_callback(Function<void()>) override;
|
|
|
|
virtual NonnullRefPtr<Core::ThreadedPromise<AK::Duration>> resume() override;
|
|
virtual NonnullRefPtr<Core::ThreadedPromise<void>> drain_buffer_and_suspend() override;
|
|
virtual NonnullRefPtr<Core::ThreadedPromise<void>> discard_buffer_and_suspend() override;
|
|
|
|
virtual void notify_data_available() override;
|
|
|
|
virtual AK::Duration total_time_played() const override;
|
|
|
|
virtual NonnullRefPtr<Core::ThreadedPromise<void>> set_volume(double) override;
|
|
|
|
private:
|
|
explicit PlaybackStreamAudioUnit(NonnullRefPtr<AudioState>);
|
|
~PlaybackStreamAudioUnit();
|
|
|
|
NonnullRefPtr<AudioState> m_state;
|
|
};
|
|
|
|
}
|