annotate foo_out_sdl.cc @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents e9bb126753e7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
1 #include <algorithm>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
2 #include <cstdlib>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
3 #include <cstdio>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
4 #include <cstdarg>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
5 #include <cmath>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
6 #include <atomic>
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
7
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
8 #include "SDL3/SDL.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
10 #include "foobar2000/helpers/foobar2000+atl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
11 #include "foobar2000/SDK/core_api.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
12 #include "foobar2000/SDK/output.h"
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
13
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
14 #if audio_sample_size == 32
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
15 # define OUTSDL_USE_NATIVE_F32 1
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
16 # define OUTSDL_FORMAT SDL_AUDIO_F32
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
17 #else
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
18 # define OUTSDL_FORMAT SDL_AUDIO_S32
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
19 #endif
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
20
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
21 /* ----------------------------------------------------------------------------------------- */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
22 /* logf: printf-like interface for printing into the console
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
23 * a.k.a. "paper hates std::stringstream"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
24 * doing it this way results in a smaller binary as well */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
26 enum class logf_level {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
27 info,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
28 error,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
29 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
31 static int vlogf(logf_level level, const char* format, std::va_list ap)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
32 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
33 char buf[1024];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
34 int r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
36 r = std::vsnprintf(buf, sizeof(buf), format, ap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
37 if (r < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
38 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
40 switch (level) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
41 case logf_level::info:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
42 console::info(buf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
43 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
44 case logf_level::error:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
45 console::error(buf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
46 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
49 return r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
52 static int logf(logf_level level, const char* format, ...)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
53 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
54 std::va_list ap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
55 int r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
57 va_start(ap, format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
59 r = vlogf(level, format, ap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
61 va_end(ap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
63 return r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
66 /* ----------------------------------------------------------------------------------------- */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
68 class OutputSDL : public output_v4 {
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
69 public:
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
70 OutputSDL(const GUID& p_device, double p_buffer_length, bool p_dither, t_uint32 p_bitdepth);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
71 ~OutputSDL();
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
72
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual double get_latency() override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual void process_samples(const audio_chunk &p_chunk) override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
75 virtual void update(bool &p_ready) override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
76 virtual void pause(bool p_state) override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
77 virtual void flush() override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
78 virtual void force_play() override;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
79 virtual void volume_set(double p_val) override;
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
80 virtual bool is_progressing() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
81 virtual size_t update_v2() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
83 static GUID g_get_guid() { return { 0x90033ef5, 0x6703, 0x44a0, { 0x98, 0x47, 0x53, 0x99, 0x1, 0x53, 0x3b, 0xd6 } }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
84 static void g_enum_devices(output_device_enum_callback &p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
85 static bool g_advanced_settings_query() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
86 static bool g_needs_bitdepth_config() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
87 static bool g_needs_dither_config() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
88 static bool g_needs_device_list_prefixes() { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
89 static bool g_supports_multiple_streams() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
90 static bool g_is_high_latency() { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
91 static uint32_t g_extra_flags() { return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
92 static void g_advanced_settings_popup(HWND p_parent, POINT p_menupoint) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
93 static const char* g_get_name() { return "SDL"; }
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
94
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
95 private:
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
96 // ---------- Static members --------------
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
97 // These are for loading SDL, as well as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
98 // converting to/from GUIDs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
99 static HMODULE sdl_;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
101 static GUID DevIDtoGUID(SDL_AudioDeviceID id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
102 static SDL_AudioDeviceID GUIDtoDevID(const GUID &id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
104 static bool LoadSDL();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
105 static bool IsSDLLoaded();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
106 static void UnloadSDL();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
107 // ----------------------------------------
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
109 static void SDLCALL AudioStreamCallback(void *userdata, SDL_AudioStream *stream, int additional_amount, int total_amount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
111 void StreamCallback(int amount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
112
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
113 void ReinitStream(unsigned int channels, unsigned int freq);
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
114
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
115 // the audio stream itself
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
116 SDL_AudioStream *stream_;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
117 #ifndef OUTSDL_USE_NATIVE_F32
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
118 // buffer to convert f64 -> f32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
119 std::vector<float> buffer_;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
120 #endif
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
121 // the current spec of the audio stream
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
122 SDL_AudioSpec spec_;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
123
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
124 std::atomic<int> needed_;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
126 #define FUNC(type, x, params, callparams) static decltype(&SDL_##x) sdl3_##x;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
127 #include "foo_out_sdl_funcs.h"
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
128 };
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
129
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
130 HMODULE OutputSDL::sdl_ = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
131 #define FUNC(type, x, params, callparams) decltype(&SDL_##x) OutputSDL::sdl3_##x = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
132 #include "foo_out_sdl_funcs.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
134 OutputSDL::OutputSDL(const GUID &p_device, double p_buffer_length, bool p_dither, t_uint32 p_bitdepth)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
135 : stream_(nullptr)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
136 #ifndef OUTSDL_USE_NATIVE_F32
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
137 /* sane default size */
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
138 , buffer_(8096)
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
139 #endif
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
140 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
141 // uhhhh
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
142 needed_.store(0);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
143
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
144 if (!LoadSDL())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
145 return; // uh oh
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
146
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
147 // increment subsystem counter
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
148 // hope this succeeds!!!
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
149 if (!sdl3_InitSubSystem(SDL_INIT_AUDIO))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
150 logf(logf_level::error, sdl3_GetError());
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
151
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
152 /* make a guess */
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
153 spec_.format = OUTSDL_FORMAT;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
154 spec_.channels = 2; /* Stereo is most likely. Who cares about surround? :) */
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
155 spec_.freq = 44100; /* guess CD quality */
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
156
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
157 // TODO supply output devices
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
158 stream_ = sdl3_OpenAudioDeviceStream(GUIDtoDevID(p_device), &spec_, OutputSDL::AudioStreamCallback, this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
159 if (!stream_)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
160 logf(logf_level::error, "%s", sdl3_GetError());
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
161 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
162
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
163 OutputSDL::~OutputSDL()
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
164 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
165 if (!IsSDLLoaded())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
166 return; /* nothing to do */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
168 sdl3_DestroyAudioStream(stream_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
169 sdl3_QuitSubSystem(SDL_INIT_AUDIO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
170 UnloadSDL();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
173 void OutputSDL::StreamCallback(int total_amount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
175 /* Don't need to do anything when additional_amount == 0 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
176 if (!total_amount) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
178 needed_ += total_amount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
181 void SDLCALL OutputSDL::AudioStreamCallback(void *userdata, SDL_AudioStream *stream, int a, int t)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
182 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
183 // Simply forwards to the main stream callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
184 OutputSDL *This = reinterpret_cast<OutputSDL *>(userdata);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
186 // assert(This->stream_ == stream);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
188 // Seems to work fine ?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
189 This->StreamCallback(t);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
190 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
191
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
192 void OutputSDL::ReinitStream(unsigned int channels, unsigned int freq)
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
193 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
194 /* Fast path; no change
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
195 * This is the common case. Most music is 44.1khz and stereo. */
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
196 if (spec_.channels == channels && spec_.freq == freq)
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
197 return;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
198
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
199 spec_.format = OUTSDL_FORMAT;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
200 spec_.channels = channels;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
201 spec_.freq = freq;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
202
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
203 logf(logf_level::info, "SDL: setting freq and channels %d, %d", channels, freq);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
204
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
205 // tell SDL about our change
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
206 if (!sdl3_SetAudioStreamFormat(stream_, &spec_, nullptr))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
207 logf(logf_level::error, sdl3_GetError());
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
208 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
209
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
210 double OutputSDL::get_latency()
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
211 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
212 // ??? I don't know
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
213 return 0.016;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
214 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
215
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
216 void OutputSDL::process_samples(const audio_chunk &p_chunk)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
217 {
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
218 // Reinitialize stream with possibly new values for channels and frequency
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
219 ReinitStream(p_chunk.get_channels(), p_chunk.get_srate());
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
220
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
221 /* NOTE this is only actually tested with stereo */
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
222 #ifdef OUTSDL_USE_NATIVE_F32
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
223 t_size sz = p_chunk.get_data_size() * sizeof(float);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
224 /* audio_sample is 32-bit floating point; SDL can use this directly */
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
225 if (!sdl3_PutAudioStreamData(stream_, p_chunk.get_data(), sz))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
226 logf(logf_level::error, "SDL: %s", sdl3_GetError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
227 needed_ -= sz;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
228 #else
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
229 /* Expand the buffer if necessary */
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
230 t_size sz;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
231
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
232 sz = p_chunk.get_data_size();
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
233 if (sz > buffer_.size())
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
234 buffer_.resize(sz);
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
235
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
236 float *buf = buffer_.data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
238 /* Convert to f32 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
239 audio_math::convert(p_chunk.get_data(), buf, sz);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
241 needed_ -= sz * sizeof(float);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
242
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
243 /* Add f32 audio to stream */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
244 while (sz > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
245 /* no possible loss of data here; we cap size_t to int */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
246 int to = static_cast<int>((std::min)(sz, INT_MIN / sizeof(float)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
248 sdl3_PutAudioStreamData(stream_, buffer_.data(), to * sizeof(float));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
250 sz -= to;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
251 buf += to;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
252 }
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
253 #endif
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
254 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
255
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
256 void OutputSDL::update(bool &p_ready) { p_ready = update_v2() > 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
258 size_t OutputSDL::update_v2()
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
259 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
260 return (std::max)(needed_.load(), 0) / (int)sizeof(float);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
261 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
262
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
263 void OutputSDL::pause(bool p_state)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
264 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
265 logf(logf_level::info, "pause? %d", (int)p_state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
266 bool v;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
267 if (p_state) {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
268 v = sdl3_PauseAudioStreamDevice(stream_);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
269 } else {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
270 v = sdl3_ResumeAudioStreamDevice(stream_);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
271 }
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
272 if (!v) logf(logf_level::error, "pause: %s", sdl3_GetError());
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
273 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
274
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
275 // . these are easy
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
276 void OutputSDL::flush()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
277 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
278 if (!sdl3_ClearAudioStream(stream_))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
279 logf(logf_level::error, "flush: %s", sdl3_GetError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
282 void OutputSDL::force_play()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
283 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
284 if (!sdl3_FlushAudioStream(stream_))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
285 logf(logf_level::error, "force_play: %s", sdl3_GetError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
288 void OutputSDL::volume_set(double p_val)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
289 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
290 /* fb2k provides this as dB for some reason, so convert it back
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
291 * to linear which is what normal programs use. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
292 double p_linear = std::pow(10.0, p_val / 10.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
294 if (!sdl3_SetAudioStreamGain(stream_, /* shut up msvc */static_cast<float>(p_linear)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
295 logf(logf_level::error, "volume_set: %s", sdl3_GetError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
296 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
298 /* conversion to/from GUID and SDL_AudioDeviceID */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
299 GUID OutputSDL::DevIDtoGUID(SDL_AudioDeviceID id)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
300 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
301 GUID g = {0};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
302 g.Data1 = id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
303 return g;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
306 SDL_AudioDeviceID OutputSDL::GUIDtoDevID(const GUID &g)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
307 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
308 return g.Data1;
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
309 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
310
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
311 void OutputSDL::g_enum_devices(output_device_enum_callback& p_callback)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
312 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
313 int i, count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
314
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
315 if (!LoadSDL())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
316 return; /* uh oh */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
317
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
318 SDL_AudioDeviceID *devs = sdl3_GetAudioPlaybackDevices(&count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
320 for (i = 0; i < count; i++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
321 const char *name = sdl3_GetAudioDeviceName(devs[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
322 if (!name) continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
324 p_callback.on_device(DevIDtoGUID(devs[i]), name, std::strlen(name));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
327 // Add default device too for brevity
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
328 p_callback.on_device(DevIDtoGUID(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK), "default", 7);
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
329 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
330
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
331 bool OutputSDL::LoadSDL(void)
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
332 {
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
333 if (IsSDLLoaded())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
334 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
336 // Unload any failed attempts
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
337 UnloadSDL();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
339 sdl_ = LoadLibrary("SDL3.dll");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
340 if (!sdl_) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
341 logf(logf_level::error, "Failed to load SDL3.dll!");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
342 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
343 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
345 #define FUNC(type, x, params, callparams) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
346 sdl3_##x = (decltype(&SDL_##x))GetProcAddress(sdl_, "SDL_" #x);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
347 #include "foo_out_sdl_funcs.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
349 return IsSDLLoaded();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
352 bool OutputSDL::IsSDLLoaded()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
353 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
354 return (sdl_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
355 #define FUNC(type, x, params, callparams) && (!!sdl3_##x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
356 #include "foo_out_sdl_funcs.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
357 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
359
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
360 void OutputSDL::UnloadSDL()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
361 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
362 // kill off everything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
363 if (sdl_) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
364 FreeLibrary(sdl_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
365 sdl_ = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
367
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
368 #define FUNC(type, x, params, callparams) sdl3_##x = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
369 #include "foo_out_sdl_funcs.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
370 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
372 bool OutputSDL::is_progressing()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
373 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents: 0
diff changeset
374 return true; // ?
0
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
375 }
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
376
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
377 static output_factory_t<OutputSDL> g_output_sdl_factory;
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
378
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
379 ////////////////////////////////////////////////////////////////////////////////
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
380
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
381 const char *about = "Copyright (c) paper <paper@tflc.us>, 2026\n";
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
382
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
383 // very beta ;)
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
384 DECLARE_COMPONENT_VERSION("SDL output", "0.1", about);
e9bb126753e7 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
385 VALIDATE_COMPONENT_FILENAME("foo_out_sdl.dll");