Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/util/audio_stream.h
7427 views
1
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#pragma once
5
6
#include "common/types.h"
7
8
#include <memory>
9
10
class Error;
11
12
enum class AudioBackend : u8
13
{
14
Null,
15
#ifndef __ANDROID__
16
Cubeb,
17
SDL,
18
#else
19
AAudio,
20
OpenSLES,
21
#endif
22
Count
23
};
24
25
class AudioStreamSource
26
{
27
public:
28
using SampleType = s16;
29
30
virtual void ReadFrames(SampleType* samples, u32 num_frames) = 0;
31
};
32
33
class AudioStream
34
{
35
public:
36
using SampleType = AudioStreamSource::SampleType;
37
38
#ifndef __ANDROID__
39
static constexpr AudioBackend DEFAULT_BACKEND = AudioBackend::Cubeb;
40
#else
41
static constexpr AudioBackend DEFAULT_BACKEND = AudioBackend::AAudio;
42
#endif
43
44
struct DeviceInfo
45
{
46
std::string name;
47
std::string display_name;
48
u32 minimum_latency_frames;
49
50
DeviceInfo(std::string name_, std::string display_name_, u32 minimum_latency_);
51
~DeviceInfo();
52
};
53
54
virtual ~AudioStream();
55
56
static std::optional<AudioBackend> ParseBackendName(const char* str);
57
static const char* GetBackendName(AudioBackend backend);
58
static const char* GetBackendDisplayName(AudioBackend backend);
59
60
static u32 FramesToMS(u32 sample_rate, u32 frames);
61
62
/// Returns a list of available driver names for the specified backend.
63
static std::vector<std::pair<std::string, std::string>> GetDriverNames(AudioBackend backend);
64
65
/// Returns a list of available output devices for the specified backend and driver.
66
static std::vector<DeviceInfo> GetOutputDevices(AudioBackend backend, std::string_view driver, u32 sample_rate);
67
68
/// Creates an audio stream with the specified parameters.
69
static std::unique_ptr<AudioStream> CreateStream(AudioBackend backend, u32 sample_rate, u32 channels,
70
u32 output_latency_frames, bool output_latency_minimal,
71
std::string_view driver_name, std::string_view device_name,
72
AudioStreamSource* source, bool auto_start, Error* error);
73
74
/// Starts the stream, allowing it to request data.
75
virtual bool Start(Error* error) = 0;
76
77
/// Temporarily pauses the stream, preventing it from requesting data.
78
virtual bool Stop(Error* error) = 0;
79
80
protected:
81
AudioStream();
82
83
private:
84
#ifndef __ANDROID__
85
static std::vector<std::pair<std::string, std::string>> GetCubebDriverNames();
86
static std::vector<DeviceInfo> GetCubebOutputDevices(std::string_view driver, u32 sample_rate);
87
static std::unique_ptr<AudioStream> CreateCubebAudioStream(u32 sample_rate, u32 channels, u32 output_latency_frames,
88
bool output_latency_minimal, std::string_view driver_name,
89
std::string_view device_name, AudioStreamSource* source,
90
bool auto_start, Error* error);
91
static std::unique_ptr<AudioStream> CreateSDLAudioStream(u32 sample_rate, u32 channels, u32 output_latency_frames,
92
bool output_latency_minimal, AudioStreamSource* source,
93
bool auto_start, Error* error);
94
#else
95
static std::unique_ptr<AudioStream> CreateAAudioAudioStream(u32 sample_rate, u32 output_latency_frames,
96
bool output_latency_minimal, AudioStreamSource* source,
97
bool auto_start, Error* error);
98
static std::unique_ptr<AudioStream> CreateOpenSLESAudioStream(u32 sample_rate, u32 output_latency_frames,
99
bool output_latency_minimal, AudioStreamSource* source,
100
bool auto_start, Error* error);
101
#endif
102
};
103
104