gosu 0.15.2 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/dependencies/SDL/include/SDL.h +138 -0
  3. data/dependencies/SDL/include/SDL_assert.h +293 -0
  4. data/dependencies/SDL/include/SDL_atomic.h +295 -0
  5. data/dependencies/SDL/include/SDL_audio.h +859 -0
  6. data/dependencies/SDL/include/SDL_bits.h +121 -0
  7. data/dependencies/SDL/include/SDL_blendmode.h +123 -0
  8. data/dependencies/SDL/include/SDL_clipboard.h +71 -0
  9. data/dependencies/SDL/include/SDL_config.h +55 -0
  10. data/dependencies/SDL/include/SDL_config_android.h +182 -0
  11. data/dependencies/SDL/include/SDL_config_iphoneos.h +207 -0
  12. data/dependencies/SDL/include/SDL_config_macosx.h +266 -0
  13. data/dependencies/SDL/include/SDL_config_minimal.h +85 -0
  14. data/dependencies/SDL/include/SDL_config_os2.h +188 -0
  15. data/dependencies/SDL/include/SDL_config_pandora.h +135 -0
  16. data/dependencies/SDL/include/SDL_config_psp.h +165 -0
  17. data/dependencies/SDL/include/SDL_config_windows.h +288 -0
  18. data/dependencies/SDL/include/SDL_config_winrt.h +243 -0
  19. data/dependencies/SDL/include/SDL_config_wiz.h +149 -0
  20. data/dependencies/SDL/include/SDL_copying.h +20 -0
  21. data/dependencies/SDL/include/SDL_cpuinfo.h +299 -0
  22. data/dependencies/SDL/include/SDL_egl.h +1676 -0
  23. data/dependencies/SDL/include/SDL_endian.h +263 -0
  24. data/dependencies/SDL/include/SDL_error.h +112 -0
  25. data/dependencies/SDL/include/SDL_events.h +827 -0
  26. data/dependencies/SDL/include/SDL_filesystem.h +136 -0
  27. data/dependencies/SDL/include/SDL_gamecontroller.h +541 -0
  28. data/dependencies/SDL/include/SDL_gesture.h +87 -0
  29. data/dependencies/SDL/include/SDL_haptic.h +1247 -0
  30. data/dependencies/SDL/include/SDL_hints.h +1578 -0
  31. data/dependencies/SDL/include/SDL_joystick.h +499 -0
  32. data/dependencies/SDL/include/SDL_keyboard.h +217 -0
  33. data/dependencies/SDL/include/SDL_keycode.h +351 -0
  34. data/dependencies/SDL/include/SDL_loadso.h +81 -0
  35. data/dependencies/SDL/include/SDL_locale.h +101 -0
  36. data/dependencies/SDL/include/SDL_log.h +211 -0
  37. data/dependencies/SDL/include/SDL_main.h +180 -0
  38. data/dependencies/SDL/include/SDL_messagebox.h +146 -0
  39. data/dependencies/SDL/include/SDL_metal.h +117 -0
  40. data/dependencies/SDL/include/SDL_misc.h +75 -0
  41. data/dependencies/SDL/include/SDL_mouse.h +302 -0
  42. data/dependencies/SDL/include/SDL_mutex.h +251 -0
  43. data/dependencies/SDL/include/SDL_name.h +33 -0
  44. data/dependencies/SDL/include/SDL_opengl.h +2183 -0
  45. data/dependencies/SDL/include/SDL_opengl_glext.h +11180 -0
  46. data/dependencies/SDL/include/SDL_opengles.h +39 -0
  47. data/dependencies/SDL/include/SDL_opengles2.h +52 -0
  48. data/dependencies/SDL/include/SDL_opengles2_gl2.h +621 -0
  49. data/dependencies/SDL/include/SDL_opengles2_gl2ext.h +2050 -0
  50. data/dependencies/SDL/include/SDL_opengles2_gl2platform.h +30 -0
  51. data/dependencies/SDL/include/SDL_opengles2_khrplatform.h +282 -0
  52. data/dependencies/SDL/include/SDL_pixels.h +479 -0
  53. data/dependencies/SDL/include/SDL_platform.h +198 -0
  54. data/dependencies/SDL/include/SDL_power.h +75 -0
  55. data/dependencies/SDL/include/SDL_quit.h +58 -0
  56. data/dependencies/SDL/include/SDL_rect.h +174 -0
  57. data/dependencies/SDL/include/SDL_render.h +1158 -0
  58. data/dependencies/SDL/include/SDL_revision.h +2 -0
  59. data/dependencies/SDL/include/SDL_rwops.h +283 -0
  60. data/dependencies/SDL/include/SDL_scancode.h +413 -0
  61. data/dependencies/SDL/include/SDL_sensor.h +267 -0
  62. data/dependencies/SDL/include/SDL_shape.h +144 -0
  63. data/dependencies/SDL/include/SDL_stdinc.h +647 -0
  64. data/dependencies/SDL/include/SDL_surface.h +563 -0
  65. data/dependencies/SDL/include/SDL_system.h +325 -0
  66. data/dependencies/SDL/include/SDL_syswm.h +354 -0
  67. data/dependencies/SDL/include/SDL_test.h +69 -0
  68. data/dependencies/SDL/include/SDL_test_assert.h +105 -0
  69. data/dependencies/SDL/include/SDL_test_common.h +218 -0
  70. data/dependencies/SDL/include/SDL_test_compare.h +69 -0
  71. data/dependencies/SDL/include/SDL_test_crc32.h +124 -0
  72. data/dependencies/SDL/include/SDL_test_font.h +81 -0
  73. data/dependencies/SDL/include/SDL_test_fuzzer.h +384 -0
  74. data/dependencies/SDL/include/SDL_test_harness.h +134 -0
  75. data/dependencies/SDL/include/SDL_test_images.h +78 -0
  76. data/dependencies/SDL/include/SDL_test_log.h +67 -0
  77. data/dependencies/SDL/include/SDL_test_md5.h +129 -0
  78. data/dependencies/SDL/include/SDL_test_memory.h +63 -0
  79. data/dependencies/SDL/include/SDL_test_random.h +115 -0
  80. data/dependencies/SDL/include/SDL_thread.h +366 -0
  81. data/dependencies/SDL/include/SDL_timer.h +115 -0
  82. data/dependencies/SDL/include/SDL_touch.h +102 -0
  83. data/dependencies/SDL/include/SDL_types.h +29 -0
  84. data/dependencies/SDL/include/SDL_version.h +162 -0
  85. data/dependencies/SDL/include/SDL_video.h +1282 -0
  86. data/dependencies/SDL/include/SDL_vulkan.h +276 -0
  87. data/dependencies/SDL/include/begin_code.h +166 -0
  88. data/dependencies/SDL/include/close_code.h +40 -0
  89. data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
  90. data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
  91. data/dependencies/SDL_sound/SDL_sound.c +795 -0
  92. data/dependencies/SDL_sound/SDL_sound.h +725 -0
  93. data/dependencies/SDL_sound/SDL_sound_aiff.c +537 -0
  94. data/dependencies/SDL_sound/SDL_sound_au.c +352 -0
  95. data/dependencies/SDL_sound/SDL_sound_coreaudio.c +747 -0
  96. data/dependencies/SDL_sound/SDL_sound_flac.c +182 -0
  97. data/dependencies/SDL_sound/SDL_sound_internal.h +304 -0
  98. data/dependencies/SDL_sound/SDL_sound_modplug.c +228 -0
  99. data/dependencies/SDL_sound/SDL_sound_mp3.c +184 -0
  100. data/dependencies/SDL_sound/SDL_sound_raw.c +164 -0
  101. data/dependencies/SDL_sound/SDL_sound_shn.c +1309 -0
  102. data/dependencies/SDL_sound/SDL_sound_voc.c +550 -0
  103. data/dependencies/SDL_sound/SDL_sound_vorbis.c +223 -0
  104. data/dependencies/SDL_sound/SDL_sound_wav.c +783 -0
  105. data/dependencies/SDL_sound/dr_flac.h +5906 -0
  106. data/dependencies/SDL_sound/dr_mp3.h +2832 -0
  107. data/dependencies/SDL_sound/libmodplug/fastmix.c +1748 -0
  108. data/dependencies/SDL_sound/libmodplug/libmodplug.h +1001 -0
  109. data/dependencies/SDL_sound/libmodplug/load_669.c +188 -0
  110. data/dependencies/SDL_sound/libmodplug/load_abc.c +4725 -0
  111. data/dependencies/SDL_sound/libmodplug/load_amf.c +403 -0
  112. data/dependencies/SDL_sound/libmodplug/load_ams.c +587 -0
  113. data/dependencies/SDL_sound/libmodplug/load_dbm.c +357 -0
  114. data/dependencies/SDL_sound/libmodplug/load_dmf.c +531 -0
  115. data/dependencies/SDL_sound/libmodplug/load_dsm.c +232 -0
  116. data/dependencies/SDL_sound/libmodplug/load_far.c +253 -0
  117. data/dependencies/SDL_sound/libmodplug/load_it.c +796 -0
  118. data/dependencies/SDL_sound/libmodplug/load_mdl.c +488 -0
  119. data/dependencies/SDL_sound/libmodplug/load_med.c +757 -0
  120. data/dependencies/SDL_sound/libmodplug/load_mid.c +1405 -0
  121. data/dependencies/SDL_sound/libmodplug/load_mod.c +269 -0
  122. data/dependencies/SDL_sound/libmodplug/load_mt2.c +546 -0
  123. data/dependencies/SDL_sound/libmodplug/load_mtm.c +142 -0
  124. data/dependencies/SDL_sound/libmodplug/load_okt.c +192 -0
  125. data/dependencies/SDL_sound/libmodplug/load_pat.c +1143 -0
  126. data/dependencies/SDL_sound/libmodplug/load_pat.h +25 -0
  127. data/dependencies/SDL_sound/libmodplug/load_psm.c +350 -0
  128. data/dependencies/SDL_sound/libmodplug/load_ptm.c +204 -0
  129. data/dependencies/SDL_sound/libmodplug/load_s3m.c +325 -0
  130. data/dependencies/SDL_sound/libmodplug/load_stm.c +180 -0
  131. data/dependencies/SDL_sound/libmodplug/load_ult.c +206 -0
  132. data/dependencies/SDL_sound/libmodplug/load_umx.c +51 -0
  133. data/dependencies/SDL_sound/libmodplug/load_xm.c +554 -0
  134. data/dependencies/SDL_sound/libmodplug/mmcmp.c +382 -0
  135. data/dependencies/SDL_sound/libmodplug/modplug.c +170 -0
  136. data/dependencies/SDL_sound/libmodplug/modplug.h +90 -0
  137. data/dependencies/SDL_sound/libmodplug/snd_dsp.c +301 -0
  138. data/dependencies/SDL_sound/libmodplug/snd_flt.c +63 -0
  139. data/dependencies/SDL_sound/libmodplug/snd_fx.c +2350 -0
  140. data/dependencies/SDL_sound/libmodplug/sndfile.c +1169 -0
  141. data/dependencies/SDL_sound/libmodplug/sndmix.c +1034 -0
  142. data/dependencies/SDL_sound/libmodplug/tables.h +371 -0
  143. data/{src/stb_vorbis.c → dependencies/SDL_sound/stb_vorbis.h} +143 -78
  144. data/dependencies/al_soft/AL/al.h +655 -0
  145. data/dependencies/al_soft/AL/alc.h +270 -0
  146. data/dependencies/al_soft/AL/alext.h +585 -0
  147. data/dependencies/al_soft/AL/efx-creative.h +3 -0
  148. data/dependencies/al_soft/AL/efx-presets.h +402 -0
  149. data/dependencies/al_soft/AL/efx.h +762 -0
  150. data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
  151. data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
  152. data/{src → dependencies/stb}/stb_image.h +330 -127
  153. data/{src → dependencies/stb}/stb_image_write.h +156 -85
  154. data/{src → dependencies/stb}/stb_truetype.h +192 -69
  155. data/{src → dependencies/utf8proc}/utf8proc.c +0 -0
  156. data/{src → dependencies/utf8proc}/utf8proc.h +0 -0
  157. data/{src → dependencies/utf8proc}/utf8proc_data.h +0 -0
  158. data/ext/gosu/extconf.rb +56 -22
  159. data/{Gosu → include/Gosu}/Audio.hpp +6 -8
  160. data/{Gosu → include/Gosu}/AutoLink.hpp +0 -0
  161. data/include/Gosu/Bitmap.hpp +100 -0
  162. data/{Gosu → include/Gosu}/Buttons.hpp +94 -35
  163. data/{Gosu → include/Gosu}/Channel.h +0 -0
  164. data/{Gosu → include/Gosu}/Color.h +0 -0
  165. data/{Gosu → include/Gosu}/Color.hpp +0 -0
  166. data/{Gosu → include/Gosu}/Directories.hpp +0 -0
  167. data/{Gosu → include/Gosu}/Font.h +0 -0
  168. data/{Gosu → include/Gosu}/Font.hpp +0 -0
  169. data/{Gosu → include/Gosu}/Fwd.hpp +0 -0
  170. data/{Gosu → include/Gosu}/Gosu.h +3 -0
  171. data/{Gosu → include/Gosu}/Gosu.hpp +0 -0
  172. data/{Gosu → include/Gosu}/Graphics.hpp +0 -0
  173. data/{Gosu → include/Gosu}/GraphicsBase.hpp +0 -0
  174. data/{Gosu → include/Gosu}/IO.hpp +0 -0
  175. data/{Gosu → include/Gosu}/Image.h +0 -0
  176. data/{Gosu → include/Gosu}/Image.hpp +7 -6
  177. data/{Gosu → include/Gosu}/ImageData.hpp +0 -0
  178. data/{Gosu → include/Gosu}/Input.hpp +30 -15
  179. data/{Gosu → include/Gosu}/Inspection.hpp +0 -0
  180. data/{Gosu → include/Gosu}/Math.hpp +0 -0
  181. data/{Gosu → include/Gosu}/Platform.hpp +0 -0
  182. data/{Gosu → include/Gosu}/Sample.h +0 -0
  183. data/{Gosu → include/Gosu}/Song.h +0 -0
  184. data/{Gosu → include/Gosu}/Text.hpp +0 -0
  185. data/{Gosu → include/Gosu}/TextInput.h +0 -0
  186. data/{Gosu → include/Gosu}/TextInput.hpp +0 -0
  187. data/{Gosu → include/Gosu}/Timing.hpp +0 -0
  188. data/{Gosu → include/Gosu}/Utility.hpp +1 -1
  189. data/{Gosu → include/Gosu}/Version.hpp +0 -0
  190. data/{Gosu → include/Gosu}/Window.h +2 -0
  191. data/{Gosu → include/Gosu}/Window.hpp +21 -13
  192. data/lib/OpenAL32.dll +0 -0
  193. data/lib/SDL2.dll +0 -0
  194. data/lib/gosu.rb +0 -3
  195. data/lib/gosu/patches.rb +0 -9
  196. data/lib/gosu/swig_patches.rb +3 -2
  197. data/lib/libmpg123.dll +0 -0
  198. data/lib/libsndfile.dll +0 -0
  199. data/lib64/OpenAL32.dll +0 -0
  200. data/lib64/SDL2.dll +0 -0
  201. data/lib64/libmpg123.dll +0 -0
  202. data/lib64/libsndfile.dll +0 -0
  203. data/rdoc/gosu.rb +95 -20
  204. data/src/Audio.cpp +50 -224
  205. data/src/AudioFile.hpp +17 -37
  206. data/src/AudioFileAudioToolbox.cpp +237 -0
  207. data/src/AudioFileSDLSound.cpp +147 -0
  208. data/src/AudioImpl.cpp +3 -12
  209. data/src/AudioImpl.hpp +3 -1
  210. data/src/Bitmap.cpp +85 -83
  211. data/src/BitmapIO.cpp +52 -58
  212. data/src/Constants.cpp +80 -33
  213. data/src/Font.cpp +3 -1
  214. data/src/GosuWrapper.cpp +19 -0
  215. data/src/Graphics.cpp +7 -4
  216. data/src/Image.cpp +13 -16
  217. data/src/Input.cpp +408 -159
  218. data/src/LargeImageData.cpp +1 -1
  219. data/src/MarkupParser.cpp +2 -1
  220. data/src/RubyGosu.cxx +349 -83
  221. data/src/RubyGosu.h +4 -2
  222. data/src/TexChunk.cpp +1 -1
  223. data/src/TextBuilder.cpp +3 -1
  224. data/src/Texture.cpp +1 -1
  225. data/src/TrueTypeFont.cpp +1 -1
  226. data/src/Utility.cpp +11 -7
  227. data/src/Window.cpp +30 -39
  228. data/src/WindowWrapper.cpp +28 -0
  229. metadata +207 -52
  230. data/Gosu/Bitmap.hpp +0 -113
  231. data/src/AudioToolboxFile.hpp +0 -210
  232. data/src/OggFile.hpp +0 -92
  233. data/src/SndFile.hpp +0 -174
  234. data/src/WinMain.cpp +0 -64
@@ -1,51 +1,25 @@
1
1
  #include "AudioImpl.hpp"
2
- #include "OggFile.hpp"
2
+ #include "AudioFile.hpp"
3
+
3
4
  #include <Gosu/Audio.hpp>
4
5
  #include <Gosu/Math.hpp>
5
6
  #include <Gosu/IO.hpp>
6
7
  #include <Gosu/Platform.hpp>
7
8
  #include <Gosu/Utility.hpp>
9
+
8
10
  #include <cassert>
9
11
  #include <cstdlib>
10
12
  #include <algorithm>
11
-
12
- #ifdef GOSU_IS_MAC
13
- #import <Foundation/Foundation.h>
14
- #include "AudioToolboxFile.hpp"
15
- #else
16
- #include "MPEGFile.hpp"
17
- #include "SndFile.hpp"
18
- #endif
19
-
20
- #ifdef GOSU_IS_IPHONE
21
- #import <AVFoundation/AVFoundation.h>
22
- #endif
23
-
24
13
  using namespace std;
25
14
 
26
- static bool is_ogg_file(Gosu::Reader reader)
27
- {
28
- if (reader.resource().size() < 4) return false;
29
-
30
- char bytes[4];
31
- reader.read(bytes, 4);
32
- return bytes[0] == 'O' && bytes[1] == 'g' && bytes[2] == 'g' && bytes[3] == 'S';
33
- }
34
-
35
- static bool is_ogg_file(const string& filename)
36
- {
37
- Gosu::File file(filename);
38
- return is_ogg_file(file.front_reader());
39
- }
40
-
41
15
  static Gosu::Song* cur_song = nullptr;
42
16
  static bool cur_song_looping;
43
17
 
44
- struct Gosu::Sample::SampleData
18
+ struct Gosu::Sample::Impl
45
19
  {
46
20
  ALuint buffer;
47
21
 
48
- SampleData(AudioFile&& audio_file)
22
+ Impl(AudioFile&& audio_file)
49
23
  {
50
24
  al_initialize();
51
25
  alGenBuffers(1, &buffer);
@@ -54,7 +28,7 @@ struct Gosu::Sample::SampleData
54
28
  audio_file.sample_rate());
55
29
  }
56
30
 
57
- ~SampleData()
31
+ ~Impl()
58
32
  {
59
33
  // It's hard to free things in the right order in Ruby/Gosu.
60
34
  // Make sure buffer isn't deleted after the context/device are shut down.
@@ -70,43 +44,12 @@ Gosu::Sample::Sample()
70
44
 
71
45
  Gosu::Sample::Sample(const string& filename)
72
46
  {
73
- if (is_ogg_file(filename)) {
74
- File file(filename);
75
- data.reset(new SampleData(OggFile(file.front_reader())));
76
- return;
77
- }
78
-
79
- #ifdef GOSU_IS_MAC
80
- File file(filename);
81
- data.reset(new SampleData(AudioToolboxFile(file.front_reader())));
82
- #else
83
- try {
84
- data.reset(new SampleData(SndFile(filename)));
85
- }
86
- catch (const runtime_error& ex) {
87
- File file(filename);
88
- data.reset(new SampleData(MPEGFile(file.front_reader())));
89
- }
90
- #endif
47
+ pimpl.reset(new Impl(AudioFile(filename)));
91
48
  }
92
49
 
93
50
  Gosu::Sample::Sample(Gosu::Reader reader)
94
51
  {
95
- if (is_ogg_file(reader)) {
96
- data.reset(new SampleData(OggFile(reader)));
97
- return;
98
- }
99
-
100
- #ifdef GOSU_IS_MAC
101
- data.reset(new SampleData(AudioToolboxFile(reader)));
102
- #else
103
- try {
104
- data.reset(new SampleData(SndFile(reader)));
105
- }
106
- catch (const runtime_error& ex) {
107
- data.reset(new SampleData(MPEGFile(reader)));
108
- }
109
- #endif
52
+ pimpl.reset(new Impl(AudioFile(reader)));
110
53
  }
111
54
 
112
55
  Gosu::Channel Gosu::Sample::play(double volume, double speed, bool looping) const
@@ -116,7 +59,7 @@ Gosu::Channel Gosu::Sample::play(double volume, double speed, bool looping) cons
116
59
 
117
60
  Gosu::Channel Gosu::Sample::play_pan(double pan, double volume, double speed, bool looping) const
118
61
  {
119
- if (!data) return Channel();
62
+ if (!pimpl) return Channel();
120
63
 
121
64
  Channel channel = allocate_channel();
122
65
 
@@ -124,7 +67,7 @@ Gosu::Channel Gosu::Sample::play_pan(double pan, double volume, double speed, bo
124
67
  if (channel.current_channel() == NO_CHANNEL) return channel;
125
68
 
126
69
  ALuint source = al_source_for_channel(channel.current_channel());
127
- alSourcei(source, AL_BUFFER, data->buffer);
70
+ alSourcei(source, AL_BUFFER, pimpl->buffer);
128
71
  alSource3f(source, AL_POSITION, pan * 10, 0, 0);
129
72
  alSourcef(source, AL_GAIN, max(volume, 0.0));
130
73
  alSourcef(source, AL_PITCH, speed);
@@ -133,112 +76,22 @@ Gosu::Channel Gosu::Sample::play_pan(double pan, double volume, double speed, bo
133
76
  return channel;
134
77
  }
135
78
 
136
- class Gosu::Song::BaseData
137
- {
138
- BaseData(const BaseData&) = delete;
139
- BaseData& operator=(const BaseData&) = delete;
140
-
141
- double volume_;
142
-
143
- protected:
144
- BaseData() : volume_(1) {}
145
- virtual void apply_volume() = 0;
146
-
147
- public:
148
- virtual ~BaseData() {}
149
- virtual void play(bool looping) = 0;
150
- virtual void pause() = 0;
151
- virtual void resume() = 0;
152
- virtual bool paused() const = 0;
153
- virtual void stop() = 0;
154
- virtual void update() = 0;
155
-
156
- double volume() const
157
- {
158
- return volume_;
159
- }
160
-
161
- void set_volume(double volume)
162
- {
163
- volume_ = clamp(volume, 0.0, 1.0);
164
- apply_volume();
165
- }
166
- };
167
-
168
- #ifdef GOSU_IS_IPHONE
169
- // AVAudioPlayer impl
170
- class Gosu::Song::ModuleData : public BaseData
171
- {
172
- AVAudioPlayer* player;
173
-
174
- void apply_volume() override
175
- {
176
- player.volume = volume();
177
- }
178
-
179
- public:
180
- ModuleData(const string& filename)
181
- {
182
- NSURL* URL = [NSURL fileURLWithPath:[NSString stringWithUTF8String:filename.c_str()]];
183
- player = [[AVAudioPlayer alloc] initWithContentsOfURL:URL error:nil];
184
- }
185
-
186
- void play(bool looping) override
187
- {
188
- if (paused()) {
189
- stop();
190
- }
191
- player.numberOfLoops = looping ? -1 : 0;
192
- [player play];
193
- }
194
-
195
- void pause() override
196
- {
197
- [player pause];
198
- }
199
-
200
- void resume() override
201
- {
202
- [player play];
203
- }
204
-
205
- bool paused() const override
206
- {
207
- return !player.playing;
208
- }
209
-
210
- void stop() override
211
- {
212
- [player stop];
213
- player.currentTime = 0;
214
- }
215
-
216
- void update() override
217
- {
218
- }
219
- };
220
- #endif
221
-
222
79
  // AudioFile impl
223
- class Gosu::Song::StreamData : public BaseData
80
+ struct Gosu::Song::Impl
224
81
  {
82
+ double volume_ = 1.0;
225
83
  unique_ptr<AudioFile> file;
226
84
  ALuint buffers[2];
227
85
 
228
- void apply_volume() override
86
+ void apply_volume()
229
87
  {
230
88
  alSourcef(al_source_for_songs(), AL_GAIN, max(volume(), 0.0));
231
89
  }
232
90
 
233
91
  bool stream_to_buffer(ALuint buffer)
234
92
  {
235
- #ifdef GOSU_IS_IPHONE
236
- static const unsigned BUFFER_SIZE = 4096 * 4;
237
- #else
238
- static const unsigned BUFFER_SIZE = 4096 * 8;
239
- #endif
240
- char audio_data[BUFFER_SIZE];
241
- size_t read_bytes = file->read_data(audio_data, BUFFER_SIZE);
93
+ char audio_data[4096 * 8];
94
+ size_t read_bytes = file->read_data(audio_data, sizeof audio_data);
242
95
  if (read_bytes > 0) {
243
96
  alBufferData(buffer, file->format(), audio_data,
244
97
  static_cast<ALsizei>(read_bytes), file->sample_rate());
@@ -247,53 +100,23 @@ class Gosu::Song::StreamData : public BaseData
247
100
  }
248
101
 
249
102
  public:
250
- StreamData(const string& filename)
103
+ explicit Impl(const string& filename)
251
104
  {
252
- if (is_ogg_file(filename)) {
253
- File source_file(filename);
254
- file.reset(new OggFile(source_file.front_reader()));
255
- }
256
- else {
257
- #ifdef GOSU_IS_MAC
258
- file.reset(new AudioToolboxFile(filename));
259
- #else
260
- try {
261
- file.reset(new SndFile(filename));
262
- }
263
- catch (const runtime_error& ex) {
264
- File source_file(filename);
265
- file.reset(new MPEGFile(source_file.front_reader()));
266
- }
267
- #endif
268
- }
269
-
105
+ file.reset(new AudioFile(filename));
106
+
270
107
  al_initialize();
271
108
  alGenBuffers(2, buffers);
272
109
  }
273
110
 
274
- StreamData(Reader reader)
111
+ explicit Impl(Reader reader)
275
112
  {
276
- if (is_ogg_file(reader)) {
277
- file.reset(new OggFile(reader));
278
- }
279
- else {
280
- #ifdef GOSU_IS_MAC
281
- file.reset(new AudioToolboxFile(reader));
282
- #else
283
- try {
284
- file.reset(new SndFile(reader));
285
- }
286
- catch (const runtime_error& ex) {
287
- file.reset(new MPEGFile(reader));
288
- }
289
- #endif
290
- }
291
-
113
+ file.reset(new AudioFile(reader));
114
+
292
115
  al_initialize();
293
116
  alGenBuffers(2, buffers);
294
117
  }
295
118
 
296
- ~StreamData()
119
+ ~Impl()
297
120
  {
298
121
  // It's hard to free things in the right order in Ruby/Gosu.
299
122
  // Make sure buffers aren't deleted after the context/device are shut down.
@@ -302,7 +125,7 @@ public:
302
125
  alDeleteBuffers(2, buffers);
303
126
  }
304
127
 
305
- void play(bool looping) override
128
+ void play(bool looping)
306
129
  {
307
130
  ALuint source = al_source_for_songs();
308
131
 
@@ -319,7 +142,7 @@ public:
319
142
  alSourcePlay(source);
320
143
  }
321
144
 
322
- void stop() override
145
+ void stop()
323
146
  {
324
147
  ALuint source = al_source_for_songs();
325
148
 
@@ -338,24 +161,24 @@ public:
338
161
  file->rewind();
339
162
  }
340
163
 
341
- void pause() override
164
+ void pause()
342
165
  {
343
166
  alSourcePause(al_source_for_songs());
344
167
  }
345
168
 
346
- void resume() override
169
+ void resume()
347
170
  {
348
171
  alSourcePlay(al_source_for_songs());
349
172
  }
350
173
 
351
- bool paused() const override
174
+ bool paused() const
352
175
  {
353
176
  ALint state;
354
177
  alGetSourcei(al_source_for_songs(), AL_SOURCE_STATE, &state);
355
178
  return state == AL_PAUSED;
356
179
  }
357
180
 
358
- void update() override
181
+ void update()
359
182
  {
360
183
  ALuint source = al_source_for_songs();
361
184
 
@@ -390,24 +213,27 @@ public:
390
213
  }
391
214
  }
392
215
  }
216
+
217
+ double volume() const
218
+ {
219
+ return volume_;
220
+ }
221
+
222
+ void set_volume(double volume)
223
+ {
224
+ volume_ = clamp(volume, 0.0, 1.0);
225
+ apply_volume();
226
+ }
393
227
  };
394
228
 
395
229
  Gosu::Song::Song(const string& filename)
396
230
  {
397
- #ifdef GOSU_IS_IPHONE
398
- if (has_extension(filename, ".mp3") ||
399
- has_extension(filename, ".aac") ||
400
- has_extension(filename, ".m4a")) {
401
- data.reset(new ModuleData(filename));
402
- return;
403
- }
404
- #endif
405
- data.reset(new StreamData(filename));
231
+ pimpl.reset(new Impl(filename));
406
232
  }
407
233
 
408
234
  Gosu::Song::Song(Reader reader)
409
235
  {
410
- data.reset(new StreamData(reader));
236
+ pimpl.reset(new Impl(reader));
411
237
  }
412
238
 
413
239
  Gosu::Song::~Song()
@@ -423,7 +249,7 @@ Gosu::Song* Gosu::Song::current_song()
423
249
  void Gosu::Song::play(bool looping)
424
250
  {
425
251
  if (paused()) {
426
- data->resume();
252
+ pimpl->resume();
427
253
  }
428
254
 
429
255
  if (cur_song && cur_song != this) {
@@ -432,7 +258,7 @@ void Gosu::Song::play(bool looping)
432
258
  }
433
259
 
434
260
  if (cur_song == nullptr) {
435
- data->play(looping);
261
+ pimpl->play(looping);
436
262
  }
437
263
 
438
264
  cur_song = this;
@@ -442,41 +268,41 @@ void Gosu::Song::play(bool looping)
442
268
  void Gosu::Song::pause()
443
269
  {
444
270
  if (cur_song == this) {
445
- data->pause();
271
+ pimpl->pause();
446
272
  }
447
273
  }
448
274
 
449
275
  bool Gosu::Song::paused() const
450
276
  {
451
- return cur_song == this && data->paused();
277
+ return cur_song == this && pimpl->paused();
452
278
  }
453
279
 
454
280
  void Gosu::Song::stop()
455
281
  {
456
282
  if (cur_song == this) {
457
- data->stop();
283
+ pimpl->stop();
458
284
  cur_song = nullptr;
459
285
  }
460
286
  }
461
287
 
462
288
  bool Gosu::Song::playing() const
463
289
  {
464
- return cur_song == this && !data->paused();
290
+ return cur_song == this && !pimpl->paused();
465
291
  }
466
292
 
467
293
  double Gosu::Song::volume() const
468
294
  {
469
- return data->volume();
295
+ return pimpl->volume();
470
296
  }
471
297
 
472
298
  void Gosu::Song::set_volume(double volume)
473
299
  {
474
- data->set_volume(volume);
300
+ pimpl->set_volume(volume);
475
301
  }
476
302
 
477
303
  void Gosu::Song::update()
478
304
  {
479
305
  if (current_song()) {
480
- current_song()->data->update();
306
+ current_song()->pimpl->update();
481
307
  }
482
308
  }