yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
audio_backend.h
Go to the documentation of this file.
1// audio_backend.h - Audio Backend Abstraction Layer
2// Provides interface for swapping audio implementations (SDL2, SDL3, other libs)
3
4#ifndef YAZE_APP_EMU_AUDIO_AUDIO_BACKEND_H
5#define YAZE_APP_EMU_AUDIO_AUDIO_BACKEND_H
6
7#include <SDL.h>
8
9#include <cstdint>
10#include <memory>
11#include <string>
12#include <vector>
13
14namespace yaze {
15namespace emu {
16namespace audio {
17
18// Audio sample format
19enum class SampleFormat {
20 INT16, // 16-bit signed PCM
21 FLOAT32 // 32-bit float
22};
23
24// Audio configuration
26 int sample_rate = 48000;
27 int channels = 2; // Stereo
28 int buffer_frames = 1024;
30};
31
32// Audio backend status
34 bool is_playing = false;
35 uint32_t queued_bytes = 0;
36 uint32_t queued_frames = 0;
37 bool has_underrun = false;
38};
39
47 public:
48 virtual ~IAudioBackend() = default;
49
50 // Initialization
51 virtual bool Initialize(const AudioConfig& config) = 0;
52 virtual void Shutdown() = 0;
53
54 // Playback control
55 virtual void Play() = 0;
56 virtual void Pause() = 0;
57 virtual void Stop() = 0;
58 virtual void Clear() = 0;
59
60 // Audio data
61 virtual bool QueueSamples(const int16_t* samples, int num_samples) = 0;
62 virtual bool QueueSamples(const float* samples, int num_samples) = 0;
63 virtual bool QueueSamplesNative(const int16_t* samples, int frames_per_channel,
64 int channels, int native_rate) {
65 return false;
66 }
67
68 // Status queries
69 virtual AudioStatus GetStatus() const = 0;
70 virtual bool IsInitialized() const = 0;
71 virtual AudioConfig GetConfig() const = 0;
72
73 // Volume control (0.0 to 1.0)
74 virtual void SetVolume(float volume) = 0;
75 virtual float GetVolume() const = 0;
76
77 // Optional: enable/disable SDL_AudioStream-based resampling
78 virtual void SetAudioStreamResampling(bool enable, int native_rate,
79 int channels) {}
80 virtual bool SupportsAudioStream() const { return false; }
81
82 // Get backend name for debugging
83 virtual std::string GetBackendName() const = 0;
84};
85
90 public:
91 SDL2AudioBackend() = default;
92 ~SDL2AudioBackend() override;
93
94 bool Initialize(const AudioConfig& config) override;
95 void Shutdown() override;
96
97 void Play() override;
98 void Pause() override;
99 void Stop() override;
100 void Clear() override;
101
102 bool QueueSamples(const int16_t* samples, int num_samples) override;
103 bool QueueSamples(const float* samples, int num_samples) override;
104 bool QueueSamplesNative(const int16_t* samples, int frames_per_channel,
105 int channels, int native_rate) override;
106
107 AudioStatus GetStatus() const override;
108 bool IsInitialized() const override;
109 AudioConfig GetConfig() const override;
110
111 void SetVolume(float volume) override;
112 float GetVolume() const override;
113
114 void SetAudioStreamResampling(bool enable, int native_rate,
115 int channels) override;
116 bool SupportsAudioStream() const override { return true; }
117
118 std::string GetBackendName() const override { return "SDL2"; }
119
120 private:
121 uint32_t device_id_ = 0;
123 bool initialized_ = false;
124 float volume_ = 1.0f;
125 SDL_AudioFormat device_format_ = AUDIO_S16;
127 int device_freq_ = 48000;
130 SDL_AudioStream* audio_stream_ = nullptr;
131 std::vector<int16_t> stream_buffer_;
132};
133
138 public:
139 enum class BackendType {
140 SDL2,
141 SDL3, // Future
142 NULL_BACKEND // For testing/headless
143 };
144
145 static std::unique_ptr<IAudioBackend> Create(BackendType type);
146};
147
148} // namespace audio
149} // namespace emu
150} // namespace yaze
151
152#endif // YAZE_APP_EMU_AUDIO_AUDIO_BACKEND_H
Factory for creating audio backends.
static std::unique_ptr< IAudioBackend > Create(BackendType type)
Abstract audio backend interface.
virtual std::string GetBackendName() const =0
virtual bool QueueSamples(const float *samples, int num_samples)=0
virtual void SetVolume(float volume)=0
virtual bool Initialize(const AudioConfig &config)=0
virtual bool QueueSamplesNative(const int16_t *samples, int frames_per_channel, int channels, int native_rate)
virtual void SetAudioStreamResampling(bool enable, int native_rate, int channels)
virtual AudioStatus GetStatus() const =0
virtual bool SupportsAudioStream() const
virtual bool IsInitialized() const =0
virtual ~IAudioBackend()=default
virtual AudioConfig GetConfig() const =0
virtual float GetVolume() const =0
virtual bool QueueSamples(const int16_t *samples, int num_samples)=0
SDL2 audio backend implementation.
AudioConfig GetConfig() const override
bool SupportsAudioStream() const override
void SetVolume(float volume) override
bool Initialize(const AudioConfig &config) override
bool IsInitialized() const override
std::vector< int16_t > stream_buffer_
std::string GetBackendName() const override
AudioStatus GetStatus() const override
bool QueueSamplesNative(const int16_t *samples, int frames_per_channel, int channels, int native_rate) override
bool QueueSamples(const int16_t *samples, int num_samples) override
void SetAudioStreamResampling(bool enable, int native_rate, int channels) override
Main namespace for the application.
Definition controller.cc:20