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.
45 lines
1.4 KiB
C++
45 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2025, Ryszard Goc <ryszardgoc@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "PlaybackStream.h"
|
|
#include <AK/Error.h>
|
|
#include <AK/NonnullRefPtr.h>
|
|
|
|
namespace Audio {
|
|
|
|
class PlaybackStreamWASAPI final : public PlaybackStream {
|
|
public:
|
|
static NonnullRefPtr<CreatePromise> create(OutputState initial_output_state, u32 target_latency_ms, AudioDataRequestCallback&&);
|
|
|
|
virtual SampleSpecification sample_specification() const override;
|
|
|
|
// The overrun callback must be realtime safe. The buffer size might be small.
|
|
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:
|
|
struct AudioState;
|
|
|
|
explicit PlaybackStreamWASAPI(NonnullRefPtr<AudioState>);
|
|
|
|
static ALWAYS_INLINE AK::Duration total_time_played_with_com_initialized(AudioState& state);
|
|
~PlaybackStreamWASAPI();
|
|
|
|
NonnullRefPtr<AudioState> m_state;
|
|
};
|
|
|
|
}
|