ruby2d 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/assets/README.md +20 -7
  3. data/assets/include/SDL2/SDL.h +135 -0
  4. data/assets/include/SDL2/SDL_assert.h +291 -0
  5. data/assets/include/SDL2/SDL_atomic.h +277 -0
  6. data/assets/include/SDL2/SDL_audio.h +826 -0
  7. data/assets/include/SDL2/SDL_bits.h +112 -0
  8. data/assets/include/SDL2/SDL_blendmode.h +120 -0
  9. data/assets/include/SDL2/SDL_clipboard.h +71 -0
  10. data/assets/include/SDL2/SDL_config.h +421 -0
  11. data/assets/include/SDL2/SDL_cpuinfo.h +188 -0
  12. data/assets/include/SDL2/SDL_egl.h +1673 -0
  13. data/assets/include/SDL2/SDL_endian.h +260 -0
  14. data/assets/include/SDL2/SDL_error.h +76 -0
  15. data/assets/include/SDL2/SDL_events.h +788 -0
  16. data/assets/include/SDL2/SDL_filesystem.h +136 -0
  17. data/assets/include/SDL2/SDL_gamecontroller.h +390 -0
  18. data/assets/include/SDL2/SDL_gesture.h +87 -0
  19. data/assets/include/SDL2/SDL_haptic.h +1238 -0
  20. data/assets/include/SDL2/SDL_hints.h +1135 -0
  21. data/assets/include/SDL2/SDL_image.h +161 -0
  22. data/assets/include/SDL2/SDL_joystick.h +408 -0
  23. data/assets/include/SDL2/SDL_keyboard.h +217 -0
  24. data/assets/include/SDL2/SDL_keycode.h +349 -0
  25. data/assets/include/SDL2/SDL_loadso.h +81 -0
  26. data/assets/include/SDL2/SDL_log.h +211 -0
  27. data/assets/include/SDL2/SDL_main.h +168 -0
  28. data/assets/include/SDL2/SDL_messagebox.h +144 -0
  29. data/assets/include/SDL2/SDL_mixer.h +651 -0
  30. data/assets/include/SDL2/SDL_mouse.h +302 -0
  31. data/assets/include/SDL2/SDL_mutex.h +251 -0
  32. data/assets/include/SDL2/SDL_name.h +33 -0
  33. data/assets/include/SDL2/SDL_opengl.h +2183 -0
  34. data/assets/include/SDL2/SDL_opengl_glext.h +11177 -0
  35. data/assets/include/SDL2/SDL_opengles.h +39 -0
  36. data/assets/include/SDL2/SDL_opengles2.h +52 -0
  37. data/assets/include/SDL2/SDL_opengles2_gl2.h +621 -0
  38. data/assets/include/SDL2/SDL_opengles2_gl2ext.h +2050 -0
  39. data/assets/include/SDL2/SDL_opengles2_gl2platform.h +30 -0
  40. data/assets/include/SDL2/SDL_opengles2_khrplatform.h +282 -0
  41. data/assets/include/SDL2/SDL_pixels.h +470 -0
  42. data/assets/include/SDL2/SDL_platform.h +198 -0
  43. data/assets/include/SDL2/SDL_power.h +75 -0
  44. data/assets/include/SDL2/SDL_quit.h +58 -0
  45. data/assets/include/SDL2/SDL_rect.h +148 -0
  46. data/assets/include/SDL2/SDL_render.h +931 -0
  47. data/assets/include/SDL2/SDL_revision.h +2 -0
  48. data/assets/include/SDL2/SDL_rwops.h +254 -0
  49. data/assets/include/SDL2/SDL_scancode.h +413 -0
  50. data/assets/include/SDL2/SDL_sensor.h +251 -0
  51. data/assets/include/SDL2/SDL_shape.h +144 -0
  52. data/assets/include/SDL2/SDL_stdinc.h +607 -0
  53. data/assets/include/SDL2/SDL_surface.h +553 -0
  54. data/assets/include/SDL2/SDL_system.h +279 -0
  55. data/assets/include/SDL2/SDL_syswm.h +324 -0
  56. data/assets/include/SDL2/SDL_test.h +69 -0
  57. data/assets/include/SDL2/SDL_test_assert.h +105 -0
  58. data/assets/include/SDL2/SDL_test_common.h +188 -0
  59. data/assets/include/SDL2/SDL_test_compare.h +69 -0
  60. data/assets/include/SDL2/SDL_test_crc32.h +124 -0
  61. data/assets/include/SDL2/SDL_test_font.h +81 -0
  62. data/assets/include/SDL2/SDL_test_fuzzer.h +384 -0
  63. data/assets/include/SDL2/SDL_test_harness.h +134 -0
  64. data/assets/include/SDL2/SDL_test_images.h +78 -0
  65. data/assets/include/SDL2/SDL_test_log.h +67 -0
  66. data/assets/include/SDL2/SDL_test_md5.h +129 -0
  67. data/assets/include/SDL2/SDL_test_memory.h +63 -0
  68. data/assets/include/SDL2/SDL_test_random.h +115 -0
  69. data/assets/include/SDL2/SDL_thread.h +343 -0
  70. data/assets/include/SDL2/SDL_timer.h +115 -0
  71. data/assets/include/SDL2/SDL_touch.h +86 -0
  72. data/assets/include/SDL2/SDL_ttf.h +294 -0
  73. data/assets/include/SDL2/SDL_types.h +29 -0
  74. data/assets/include/SDL2/SDL_version.h +162 -0
  75. data/assets/include/SDL2/SDL_video.h +1276 -0
  76. data/assets/include/SDL2/SDL_vulkan.h +278 -0
  77. data/assets/include/SDL2/begin_code.h +167 -0
  78. data/assets/include/SDL2/close_code.h +37 -0
  79. data/assets/include/glew.h +23686 -0
  80. data/assets/include/simple2d.h +735 -0
  81. data/assets/ios/MRuby.framework/Headers/mrbconf.h +3 -5
  82. data/assets/ios/MRuby.framework/Headers/mruby.h +35 -32
  83. data/assets/ios/MRuby.framework/Headers/mruby/array.h +1 -0
  84. data/assets/ios/MRuby.framework/Headers/mruby/boxing_word.h +9 -1
  85. data/assets/ios/MRuby.framework/Headers/mruby/class.h +14 -11
  86. data/assets/ios/MRuby.framework/Headers/mruby/common.h +5 -0
  87. data/assets/ios/MRuby.framework/Headers/mruby/compile.h +4 -3
  88. data/assets/ios/MRuby.framework/Headers/mruby/debug.h +3 -2
  89. data/assets/ios/MRuby.framework/Headers/mruby/dump.h +2 -2
  90. data/assets/ios/MRuby.framework/Headers/mruby/hash.h +38 -5
  91. data/assets/ios/MRuby.framework/Headers/mruby/irep.h +17 -4
  92. data/assets/ios/MRuby.framework/Headers/mruby/object.h +4 -5
  93. data/assets/ios/MRuby.framework/Headers/mruby/opcode.h +47 -139
  94. data/assets/ios/MRuby.framework/Headers/mruby/ops.h +117 -0
  95. data/assets/ios/MRuby.framework/Headers/mruby/proc.h +4 -4
  96. data/assets/ios/MRuby.framework/Headers/mruby/string.h +11 -7
  97. data/assets/ios/MRuby.framework/Headers/mruby/throw.h +4 -4
  98. data/assets/ios/MRuby.framework/Headers/mruby/variable.h +2 -4
  99. data/assets/ios/MRuby.framework/Headers/mruby/version.h +6 -6
  100. data/assets/ios/MRuby.framework/MRuby +0 -0
  101. data/assets/ios/MyApp.xcodeproj/project.pbxproj +24 -18
  102. data/assets/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  103. data/assets/ios/main.c +1 -1
  104. data/assets/macos/lib/libFLAC.a +0 -0
  105. data/assets/macos/lib/libSDL2.a +0 -0
  106. data/assets/macos/lib/libSDL2_image.a +0 -0
  107. data/assets/macos/lib/libSDL2_mixer.a +0 -0
  108. data/assets/macos/lib/libSDL2_ttf.a +0 -0
  109. data/assets/macos/lib/libfreetype.a +0 -0
  110. data/assets/macos/lib/libjpeg.a +0 -0
  111. data/assets/macos/lib/libmpg123.a +0 -0
  112. data/assets/macos/lib/libogg.a +0 -0
  113. data/assets/macos/lib/libpng16.a +0 -0
  114. data/assets/macos/lib/libsimple2d.a +0 -0
  115. data/assets/macos/lib/libtiff.a +0 -0
  116. data/assets/macos/lib/libvorbis.a +0 -0
  117. data/assets/macos/lib/libvorbisfile.a +0 -0
  118. data/assets/macos/lib/libwebp.a +0 -0
  119. data/assets/mingw/bin/SDL2.dll +0 -0
  120. data/assets/mingw/bin/SDL2_image.dll +0 -0
  121. data/assets/mingw/bin/SDL2_mixer.dll +0 -0
  122. data/assets/mingw/bin/SDL2_ttf.dll +0 -0
  123. data/assets/mingw/bin/glew32.dll +0 -0
  124. data/assets/mingw/bin/libFLAC-8.dll +0 -0
  125. data/assets/mingw/bin/libfreetype-6.dll +0 -0
  126. data/assets/mingw/bin/libjpeg-9.dll +0 -0
  127. data/assets/mingw/bin/libmodplug-1.dll +0 -0
  128. data/assets/mingw/bin/libmpg123-0.dll +0 -0
  129. data/assets/mingw/bin/libogg-0.dll +0 -0
  130. data/assets/mingw/bin/libopus-0.dll +0 -0
  131. data/assets/mingw/bin/libopusfile-0.dll +0 -0
  132. data/assets/mingw/bin/libpng16-16.dll +0 -0
  133. data/assets/mingw/bin/libtiff-5.dll +0 -0
  134. data/assets/mingw/bin/libvorbis-0.dll +0 -0
  135. data/assets/mingw/bin/libvorbisfile-3.dll +0 -0
  136. data/assets/mingw/bin/libwebp-7.dll +0 -0
  137. data/assets/mingw/bin/zlib1.dll +0 -0
  138. data/assets/mingw/lib/libSDL2.a +0 -0
  139. data/assets/mingw/lib/libSDL2.dll.a +0 -0
  140. data/assets/mingw/lib/libSDL2_image.a +0 -0
  141. data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
  142. data/assets/mingw/lib/libSDL2_mixer.a +0 -0
  143. data/assets/mingw/lib/libSDL2_mixer.dll.a +0 -0
  144. data/assets/mingw/lib/libSDL2_test.a +0 -0
  145. data/assets/mingw/lib/libSDL2_ttf.a +0 -0
  146. data/assets/mingw/lib/libSDL2_ttf.dll.a +0 -0
  147. data/assets/mingw/lib/libSDL2main.a +0 -0
  148. data/assets/mingw/lib/libglew32.a +0 -0
  149. data/assets/mingw/lib/libglew32.dll.a +0 -0
  150. data/assets/mingw/lib/libsimple2d.a +0 -0
  151. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +4 -0
  152. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +4 -0
  153. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +4 -0
  154. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +4 -0
  155. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +4 -0
  156. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +4 -0
  157. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +4 -0
  158. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +4 -0
  159. data/assets/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +7 -0
  160. data/assets/tvos/MRuby.framework/Headers/mrbconf.h +3 -5
  161. data/assets/tvos/MRuby.framework/Headers/mruby.h +35 -32
  162. data/assets/tvos/MRuby.framework/Headers/mruby/array.h +1 -0
  163. data/assets/tvos/MRuby.framework/Headers/mruby/boxing_word.h +9 -1
  164. data/assets/tvos/MRuby.framework/Headers/mruby/class.h +14 -11
  165. data/assets/tvos/MRuby.framework/Headers/mruby/common.h +5 -0
  166. data/assets/tvos/MRuby.framework/Headers/mruby/compile.h +4 -3
  167. data/assets/tvos/MRuby.framework/Headers/mruby/debug.h +3 -2
  168. data/assets/tvos/MRuby.framework/Headers/mruby/dump.h +2 -2
  169. data/assets/tvos/MRuby.framework/Headers/mruby/hash.h +38 -5
  170. data/assets/tvos/MRuby.framework/Headers/mruby/irep.h +17 -4
  171. data/assets/tvos/MRuby.framework/Headers/mruby/object.h +4 -5
  172. data/assets/tvos/MRuby.framework/Headers/mruby/opcode.h +47 -139
  173. data/assets/tvos/MRuby.framework/Headers/mruby/ops.h +117 -0
  174. data/assets/tvos/MRuby.framework/Headers/mruby/proc.h +4 -4
  175. data/assets/tvos/MRuby.framework/Headers/mruby/string.h +11 -7
  176. data/assets/tvos/MRuby.framework/Headers/mruby/throw.h +4 -4
  177. data/assets/tvos/MRuby.framework/Headers/mruby/variable.h +2 -4
  178. data/assets/tvos/MRuby.framework/Headers/mruby/version.h +6 -6
  179. data/assets/tvos/MRuby.framework/MRuby +0 -0
  180. data/assets/tvos/MyApp.xcodeproj/project.pbxproj +25 -19
  181. data/assets/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  182. data/assets/tvos/main.c +1 -1
  183. data/ext/ruby2d/extconf.rb +59 -50
  184. data/ext/ruby2d/ruby2d.c +0 -1
  185. data/lib/ruby2d.rb +1 -7
  186. data/lib/ruby2d/cli/launch.rb +1 -1
  187. data/lib/ruby2d/font.rb +32 -7
  188. data/lib/ruby2d/version.rb +1 -1
  189. metadata +132 -6
  190. data/assets/opal.js +0 -21637
  191. data/assets/simple2d.js +0 -1379
  192. data/assets/template.html +0 -18
@@ -0,0 +1,277 @@
1
+ /*
2
+ Simple DirectMedia Layer
3
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4
+
5
+ This software is provided 'as-is', without any express or implied
6
+ warranty. In no event will the authors be held liable for any damages
7
+ arising from the use of this software.
8
+
9
+ Permission is granted to anyone to use this software for any purpose,
10
+ including commercial applications, and to alter it and redistribute it
11
+ freely, subject to the following restrictions:
12
+
13
+ 1. The origin of this software must not be misrepresented; you must not
14
+ claim that you wrote the original software. If you use this software
15
+ in a product, an acknowledgment in the product documentation would be
16
+ appreciated but is not required.
17
+ 2. Altered source versions must be plainly marked as such, and must not be
18
+ misrepresented as being the original software.
19
+ 3. This notice may not be removed or altered from any source distribution.
20
+ */
21
+
22
+ /**
23
+ * \file SDL_atomic.h
24
+ *
25
+ * Atomic operations.
26
+ *
27
+ * IMPORTANT:
28
+ * If you are not an expert in concurrent lockless programming, you should
29
+ * only be using the atomic lock and reference counting functions in this
30
+ * file. In all other cases you should be protecting your data structures
31
+ * with full mutexes.
32
+ *
33
+ * The list of "safe" functions to use are:
34
+ * SDL_AtomicLock()
35
+ * SDL_AtomicUnlock()
36
+ * SDL_AtomicIncRef()
37
+ * SDL_AtomicDecRef()
38
+ *
39
+ * Seriously, here be dragons!
40
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
41
+ *
42
+ * You can find out a little more about lockless programming and the
43
+ * subtle issues that can arise here:
44
+ * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx
45
+ *
46
+ * There's also lots of good information here:
47
+ * http://www.1024cores.net/home/lock-free-algorithms
48
+ * http://preshing.com/
49
+ *
50
+ * These operations may or may not actually be implemented using
51
+ * processor specific atomic operations. When possible they are
52
+ * implemented as true processor specific atomic operations. When that
53
+ * is not possible the are implemented using locks that *do* use the
54
+ * available atomic operations.
55
+ *
56
+ * All of the atomic operations that modify memory are full memory barriers.
57
+ */
58
+
59
+ #ifndef SDL_atomic_h_
60
+ #define SDL_atomic_h_
61
+
62
+ #include "SDL_stdinc.h"
63
+ #include "SDL_platform.h"
64
+
65
+ #include "begin_code.h"
66
+
67
+ /* Set up for C function definitions, even when using C++ */
68
+ #ifdef __cplusplus
69
+ extern "C" {
70
+ #endif
71
+
72
+ /**
73
+ * \name SDL AtomicLock
74
+ *
75
+ * The atomic locks are efficient spinlocks using CPU instructions,
76
+ * but are vulnerable to starvation and can spin forever if a thread
77
+ * holding a lock has been terminated. For this reason you should
78
+ * minimize the code executed inside an atomic lock and never do
79
+ * expensive things like API or system calls while holding them.
80
+ *
81
+ * The atomic locks are not safe to lock recursively.
82
+ *
83
+ * Porting Note:
84
+ * The spin lock functions and type are required and can not be
85
+ * emulated because they are used in the atomic emulation code.
86
+ */
87
+ /* @{ */
88
+
89
+ typedef int SDL_SpinLock;
90
+
91
+ /**
92
+ * \brief Try to lock a spin lock by setting it to a non-zero value.
93
+ *
94
+ * \param lock Points to the lock.
95
+ *
96
+ * \return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held.
97
+ */
98
+ extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock);
99
+
100
+ /**
101
+ * \brief Lock a spin lock by setting it to a non-zero value.
102
+ *
103
+ * \param lock Points to the lock.
104
+ */
105
+ extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock);
106
+
107
+ /**
108
+ * \brief Unlock a spin lock by setting it to 0. Always returns immediately
109
+ *
110
+ * \param lock Points to the lock.
111
+ */
112
+ extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);
113
+
114
+ /* @} *//* SDL AtomicLock */
115
+
116
+
117
+ /**
118
+ * The compiler barrier prevents the compiler from reordering
119
+ * reads and writes to globally visible variables across the call.
120
+ */
121
+ #if defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
122
+ void _ReadWriteBarrier(void);
123
+ #pragma intrinsic(_ReadWriteBarrier)
124
+ #define SDL_CompilerBarrier() _ReadWriteBarrier()
125
+ #elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
126
+ /* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */
127
+ #define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
128
+ #elif defined(__WATCOMC__)
129
+ extern _inline void SDL_CompilerBarrier (void);
130
+ #pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
131
+ #else
132
+ #define SDL_CompilerBarrier() \
133
+ { SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); }
134
+ #endif
135
+
136
+ /**
137
+ * Memory barriers are designed to prevent reads and writes from being
138
+ * reordered by the compiler and being seen out of order on multi-core CPUs.
139
+ *
140
+ * A typical pattern would be for thread A to write some data and a flag,
141
+ * and for thread B to read the flag and get the data. In this case you
142
+ * would insert a release barrier between writing the data and the flag,
143
+ * guaranteeing that the data write completes no later than the flag is
144
+ * written, and you would insert an acquire barrier between reading the
145
+ * flag and reading the data, to ensure that all the reads associated
146
+ * with the flag have completed.
147
+ *
148
+ * In this pattern you should always see a release barrier paired with
149
+ * an acquire barrier and you should gate the data reads/writes with a
150
+ * single flag variable.
151
+ *
152
+ * For more information on these semantics, take a look at the blog post:
153
+ * http://preshing.com/20120913/acquire-and-release-semantics
154
+ */
155
+ extern DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
156
+ extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void);
157
+
158
+ #if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
159
+ #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
160
+ #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
161
+ #elif defined(__GNUC__) && defined(__aarch64__)
162
+ #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
163
+ #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
164
+ #elif defined(__GNUC__) && defined(__arm__)
165
+ #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
166
+ #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
167
+ #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
168
+ #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_5TE__)
169
+ #ifdef __thumb__
170
+ /* The mcr instruction isn't available in thumb mode, use real functions */
171
+ #define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
172
+ #define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
173
+ #else
174
+ #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
175
+ #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
176
+ #endif /* __thumb__ */
177
+ #else
178
+ #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
179
+ #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
180
+ #endif /* __GNUC__ && __arm__ */
181
+ #else
182
+ #if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
183
+ /* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */
184
+ #include <mbarrier.h>
185
+ #define SDL_MemoryBarrierRelease() __machine_rel_barrier()
186
+ #define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
187
+ #else
188
+ /* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */
189
+ #define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
190
+ #define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
191
+ #endif
192
+ #endif
193
+
194
+ /**
195
+ * \brief A type representing an atomic integer value. It is a struct
196
+ * so people don't accidentally use numeric operations on it.
197
+ */
198
+ typedef struct { int value; } SDL_atomic_t;
199
+
200
+ /**
201
+ * \brief Set an atomic variable to a new value if it is currently an old value.
202
+ *
203
+ * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise.
204
+ *
205
+ * \note If you don't know what this function is for, you shouldn't use it!
206
+ */
207
+ extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval);
208
+
209
+ /**
210
+ * \brief Set an atomic variable to a value.
211
+ *
212
+ * \return The previous value of the atomic variable.
213
+ */
214
+ extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v);
215
+
216
+ /**
217
+ * \brief Get the value of an atomic variable
218
+ */
219
+ extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a);
220
+
221
+ /**
222
+ * \brief Add to an atomic variable.
223
+ *
224
+ * \return The previous value of the atomic variable.
225
+ *
226
+ * \note This same style can be used for any number operation
227
+ */
228
+ extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v);
229
+
230
+ /**
231
+ * \brief Increment an atomic variable used as a reference count.
232
+ */
233
+ #ifndef SDL_AtomicIncRef
234
+ #define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1)
235
+ #endif
236
+
237
+ /**
238
+ * \brief Decrement an atomic variable used as a reference count.
239
+ *
240
+ * \return SDL_TRUE if the variable reached zero after decrementing,
241
+ * SDL_FALSE otherwise
242
+ */
243
+ #ifndef SDL_AtomicDecRef
244
+ #define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1)
245
+ #endif
246
+
247
+ /**
248
+ * \brief Set a pointer to a new value if it is currently an old value.
249
+ *
250
+ * \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise.
251
+ *
252
+ * \note If you don't know what this function is for, you shouldn't use it!
253
+ */
254
+ extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval);
255
+
256
+ /**
257
+ * \brief Set a pointer to a value atomically.
258
+ *
259
+ * \return The previous value of the pointer.
260
+ */
261
+ extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v);
262
+
263
+ /**
264
+ * \brief Get the value of a pointer atomically.
265
+ */
266
+ extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a);
267
+
268
+ /* Ends C function definitions when using C++ */
269
+ #ifdef __cplusplus
270
+ }
271
+ #endif
272
+
273
+ #include "close_code.h"
274
+
275
+ #endif /* SDL_atomic_h_ */
276
+
277
+ /* vi: set ts=4 sw=4 expandtab: */
@@ -0,0 +1,826 @@
1
+ /*
2
+ Simple DirectMedia Layer
3
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4
+
5
+ This software is provided 'as-is', without any express or implied
6
+ warranty. In no event will the authors be held liable for any damages
7
+ arising from the use of this software.
8
+
9
+ Permission is granted to anyone to use this software for any purpose,
10
+ including commercial applications, and to alter it and redistribute it
11
+ freely, subject to the following restrictions:
12
+
13
+ 1. The origin of this software must not be misrepresented; you must not
14
+ claim that you wrote the original software. If you use this software
15
+ in a product, an acknowledgment in the product documentation would be
16
+ appreciated but is not required.
17
+ 2. Altered source versions must be plainly marked as such, and must not be
18
+ misrepresented as being the original software.
19
+ 3. This notice may not be removed or altered from any source distribution.
20
+ */
21
+
22
+ /**
23
+ * \file SDL_audio.h
24
+ *
25
+ * Access to the raw audio mixing buffer for the SDL library.
26
+ */
27
+
28
+ #ifndef SDL_audio_h_
29
+ #define SDL_audio_h_
30
+
31
+ #include "SDL_stdinc.h"
32
+ #include "SDL_error.h"
33
+ #include "SDL_endian.h"
34
+ #include "SDL_mutex.h"
35
+ #include "SDL_thread.h"
36
+ #include "SDL_rwops.h"
37
+
38
+ #include "begin_code.h"
39
+ /* Set up for C function definitions, even when using C++ */
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ /**
45
+ * \brief Audio format flags.
46
+ *
47
+ * These are what the 16 bits in SDL_AudioFormat currently mean...
48
+ * (Unspecified bits are always zero).
49
+ *
50
+ * \verbatim
51
+ ++-----------------------sample is signed if set
52
+ ||
53
+ || ++-----------sample is bigendian if set
54
+ || ||
55
+ || || ++---sample is float if set
56
+ || || ||
57
+ || || || +---sample bit size---+
58
+ || || || | |
59
+ 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
60
+ \endverbatim
61
+ *
62
+ * There are macros in SDL 2.0 and later to query these bits.
63
+ */
64
+ typedef Uint16 SDL_AudioFormat;
65
+
66
+ /**
67
+ * \name Audio flags
68
+ */
69
+ /* @{ */
70
+
71
+ #define SDL_AUDIO_MASK_BITSIZE (0xFF)
72
+ #define SDL_AUDIO_MASK_DATATYPE (1<<8)
73
+ #define SDL_AUDIO_MASK_ENDIAN (1<<12)
74
+ #define SDL_AUDIO_MASK_SIGNED (1<<15)
75
+ #define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE)
76
+ #define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE)
77
+ #define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN)
78
+ #define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED)
79
+ #define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x))
80
+ #define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x))
81
+ #define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x))
82
+
83
+ /**
84
+ * \name Audio format flags
85
+ *
86
+ * Defaults to LSB byte order.
87
+ */
88
+ /* @{ */
89
+ #define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */
90
+ #define AUDIO_S8 0x8008 /**< Signed 8-bit samples */
91
+ #define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */
92
+ #define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */
93
+ #define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */
94
+ #define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */
95
+ #define AUDIO_U16 AUDIO_U16LSB
96
+ #define AUDIO_S16 AUDIO_S16LSB
97
+ /* @} */
98
+
99
+ /**
100
+ * \name int32 support
101
+ */
102
+ /* @{ */
103
+ #define AUDIO_S32LSB 0x8020 /**< 32-bit integer samples */
104
+ #define AUDIO_S32MSB 0x9020 /**< As above, but big-endian byte order */
105
+ #define AUDIO_S32 AUDIO_S32LSB
106
+ /* @} */
107
+
108
+ /**
109
+ * \name float32 support
110
+ */
111
+ /* @{ */
112
+ #define AUDIO_F32LSB 0x8120 /**< 32-bit floating point samples */
113
+ #define AUDIO_F32MSB 0x9120 /**< As above, but big-endian byte order */
114
+ #define AUDIO_F32 AUDIO_F32LSB
115
+ /* @} */
116
+
117
+ /**
118
+ * \name Native audio byte ordering
119
+ */
120
+ /* @{ */
121
+ #if SDL_BYTEORDER == SDL_LIL_ENDIAN
122
+ #define AUDIO_U16SYS AUDIO_U16LSB
123
+ #define AUDIO_S16SYS AUDIO_S16LSB
124
+ #define AUDIO_S32SYS AUDIO_S32LSB
125
+ #define AUDIO_F32SYS AUDIO_F32LSB
126
+ #else
127
+ #define AUDIO_U16SYS AUDIO_U16MSB
128
+ #define AUDIO_S16SYS AUDIO_S16MSB
129
+ #define AUDIO_S32SYS AUDIO_S32MSB
130
+ #define AUDIO_F32SYS AUDIO_F32MSB
131
+ #endif
132
+ /* @} */
133
+
134
+ /**
135
+ * \name Allow change flags
136
+ *
137
+ * Which audio format changes are allowed when opening a device.
138
+ */
139
+ /* @{ */
140
+ #define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001
141
+ #define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002
142
+ #define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004
143
+ #define SDL_AUDIO_ALLOW_SAMPLES_CHANGE 0x00000008
144
+ #define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE|SDL_AUDIO_ALLOW_SAMPLES_CHANGE)
145
+ /* @} */
146
+
147
+ /* @} *//* Audio flags */
148
+
149
+ /**
150
+ * This function is called when the audio device needs more data.
151
+ *
152
+ * \param userdata An application-specific parameter saved in
153
+ * the SDL_AudioSpec structure
154
+ * \param stream A pointer to the audio data buffer.
155
+ * \param len The length of that buffer in bytes.
156
+ *
157
+ * Once the callback returns, the buffer will no longer be valid.
158
+ * Stereo samples are stored in a LRLRLR ordering.
159
+ *
160
+ * You can choose to avoid callbacks and use SDL_QueueAudio() instead, if
161
+ * you like. Just open your audio device with a NULL callback.
162
+ */
163
+ typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,
164
+ int len);
165
+
166
+ /**
167
+ * The calculated values in this structure are calculated by SDL_OpenAudio().
168
+ *
169
+ * For multi-channel audio, the default SDL channel mapping is:
170
+ * 2: FL FR (stereo)
171
+ * 3: FL FR LFE (2.1 surround)
172
+ * 4: FL FR BL BR (quad)
173
+ * 5: FL FR FC BL BR (quad + center)
174
+ * 6: FL FR FC LFE SL SR (5.1 surround - last two can also be BL BR)
175
+ * 7: FL FR FC LFE BC SL SR (6.1 surround)
176
+ * 8: FL FR FC LFE BL BR SL SR (7.1 surround)
177
+ */
178
+ typedef struct SDL_AudioSpec
179
+ {
180
+ int freq; /**< DSP frequency -- samples per second */
181
+ SDL_AudioFormat format; /**< Audio data format */
182
+ Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */
183
+ Uint8 silence; /**< Audio buffer silence value (calculated) */
184
+ Uint16 samples; /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */
185
+ Uint16 padding; /**< Necessary for some compile environments */
186
+ Uint32 size; /**< Audio buffer size in bytes (calculated) */
187
+ SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */
188
+ void *userdata; /**< Userdata passed to callback (ignored for NULL callbacks). */
189
+ } SDL_AudioSpec;
190
+
191
+
192
+ struct SDL_AudioCVT;
193
+ typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt,
194
+ SDL_AudioFormat format);
195
+
196
+ /**
197
+ * \brief Upper limit of filters in SDL_AudioCVT
198
+ *
199
+ * The maximum number of SDL_AudioFilter functions in SDL_AudioCVT is
200
+ * currently limited to 9. The SDL_AudioCVT.filters array has 10 pointers,
201
+ * one of which is the terminating NULL pointer.
202
+ */
203
+ #define SDL_AUDIOCVT_MAX_FILTERS 9
204
+
205
+ /**
206
+ * \struct SDL_AudioCVT
207
+ * \brief A structure to hold a set of audio conversion filters and buffers.
208
+ *
209
+ * Note that various parts of the conversion pipeline can take advantage
210
+ * of SIMD operations (like SSE2, for example). SDL_AudioCVT doesn't require
211
+ * you to pass it aligned data, but can possibly run much faster if you
212
+ * set both its (buf) field to a pointer that is aligned to 16 bytes, and its
213
+ * (len) field to something that's a multiple of 16, if possible.
214
+ */
215
+ #ifdef __GNUC__
216
+ /* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't
217
+ pad it out to 88 bytes to guarantee ABI compatibility between compilers.
218
+ vvv
219
+ The next time we rev the ABI, make sure to size the ints and add padding.
220
+ */
221
+ #define SDL_AUDIOCVT_PACKED __attribute__((packed))
222
+ #else
223
+ #define SDL_AUDIOCVT_PACKED
224
+ #endif
225
+ /* */
226
+ typedef struct SDL_AudioCVT
227
+ {
228
+ int needed; /**< Set to 1 if conversion possible */
229
+ SDL_AudioFormat src_format; /**< Source audio format */
230
+ SDL_AudioFormat dst_format; /**< Target audio format */
231
+ double rate_incr; /**< Rate conversion increment */
232
+ Uint8 *buf; /**< Buffer to hold entire audio data */
233
+ int len; /**< Length of original audio buffer */
234
+ int len_cvt; /**< Length of converted audio buffer */
235
+ int len_mult; /**< buffer must be len*len_mult big */
236
+ double len_ratio; /**< Given len, final size is len*len_ratio */
237
+ SDL_AudioFilter filters[SDL_AUDIOCVT_MAX_FILTERS + 1]; /**< NULL-terminated list of filter functions */
238
+ int filter_index; /**< Current audio conversion function */
239
+ } SDL_AUDIOCVT_PACKED SDL_AudioCVT;
240
+
241
+
242
+ /* Function prototypes */
243
+
244
+ /**
245
+ * \name Driver discovery functions
246
+ *
247
+ * These functions return the list of built in audio drivers, in the
248
+ * order that they are normally initialized by default.
249
+ */
250
+ /* @{ */
251
+ extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void);
252
+ extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index);
253
+ /* @} */
254
+
255
+ /**
256
+ * \name Initialization and cleanup
257
+ *
258
+ * \internal These functions are used internally, and should not be used unless
259
+ * you have a specific need to specify the audio driver you want to
260
+ * use. You should normally use SDL_Init() or SDL_InitSubSystem().
261
+ */
262
+ /* @{ */
263
+ extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name);
264
+ extern DECLSPEC void SDLCALL SDL_AudioQuit(void);
265
+ /* @} */
266
+
267
+ /**
268
+ * This function returns the name of the current audio driver, or NULL
269
+ * if no driver has been initialized.
270
+ */
271
+ extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void);
272
+
273
+ /**
274
+ * This function opens the audio device with the desired parameters, and
275
+ * returns 0 if successful, placing the actual hardware parameters in the
276
+ * structure pointed to by \c obtained. If \c obtained is NULL, the audio
277
+ * data passed to the callback function will be guaranteed to be in the
278
+ * requested format, and will be automatically converted to the hardware
279
+ * audio format if necessary. This function returns -1 if it failed
280
+ * to open the audio device, or couldn't set up the audio thread.
281
+ *
282
+ * When filling in the desired audio spec structure,
283
+ * - \c desired->freq should be the desired audio frequency in samples-per-
284
+ * second.
285
+ * - \c desired->format should be the desired audio format.
286
+ * - \c desired->samples is the desired size of the audio buffer, in
287
+ * samples. This number should be a power of two, and may be adjusted by
288
+ * the audio driver to a value more suitable for the hardware. Good values
289
+ * seem to range between 512 and 8096 inclusive, depending on the
290
+ * application and CPU speed. Smaller values yield faster response time,
291
+ * but can lead to underflow if the application is doing heavy processing
292
+ * and cannot fill the audio buffer in time. A stereo sample consists of
293
+ * both right and left channels in LR ordering.
294
+ * Note that the number of samples is directly related to time by the
295
+ * following formula: \code ms = (samples*1000)/freq \endcode
296
+ * - \c desired->size is the size in bytes of the audio buffer, and is
297
+ * calculated by SDL_OpenAudio().
298
+ * - \c desired->silence is the value used to set the buffer to silence,
299
+ * and is calculated by SDL_OpenAudio().
300
+ * - \c desired->callback should be set to a function that will be called
301
+ * when the audio device is ready for more data. It is passed a pointer
302
+ * to the audio buffer, and the length in bytes of the audio buffer.
303
+ * This function usually runs in a separate thread, and so you should
304
+ * protect data structures that it accesses by calling SDL_LockAudio()
305
+ * and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL
306
+ * pointer here, and call SDL_QueueAudio() with some frequency, to queue
307
+ * more audio samples to be played (or for capture devices, call
308
+ * SDL_DequeueAudio() with some frequency, to obtain audio samples).
309
+ * - \c desired->userdata is passed as the first parameter to your callback
310
+ * function. If you passed a NULL callback, this value is ignored.
311
+ *
312
+ * The audio device starts out playing silence when it's opened, and should
313
+ * be enabled for playing by calling \c SDL_PauseAudio(0) when you are ready
314
+ * for your audio callback function to be called. Since the audio driver
315
+ * may modify the requested size of the audio buffer, you should allocate
316
+ * any local mixing buffers after you open the audio device.
317
+ */
318
+ extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,
319
+ SDL_AudioSpec * obtained);
320
+
321
+ /**
322
+ * SDL Audio Device IDs.
323
+ *
324
+ * A successful call to SDL_OpenAudio() is always device id 1, and legacy
325
+ * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls
326
+ * always returns devices >= 2 on success. The legacy calls are good both
327
+ * for backwards compatibility and when you don't care about multiple,
328
+ * specific, or capture devices.
329
+ */
330
+ typedef Uint32 SDL_AudioDeviceID;
331
+
332
+ /**
333
+ * Get the number of available devices exposed by the current driver.
334
+ * Only valid after a successfully initializing the audio subsystem.
335
+ * Returns -1 if an explicit list of devices can't be determined; this is
336
+ * not an error. For example, if SDL is set up to talk to a remote audio
337
+ * server, it can't list every one available on the Internet, but it will
338
+ * still allow a specific host to be specified to SDL_OpenAudioDevice().
339
+ *
340
+ * In many common cases, when this function returns a value <= 0, it can still
341
+ * successfully open the default device (NULL for first argument of
342
+ * SDL_OpenAudioDevice()).
343
+ */
344
+ extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture);
345
+
346
+ /**
347
+ * Get the human-readable name of a specific audio device.
348
+ * Must be a value between 0 and (number of audio devices-1).
349
+ * Only valid after a successfully initializing the audio subsystem.
350
+ * The values returned by this function reflect the latest call to
351
+ * SDL_GetNumAudioDevices(); recall that function to redetect available
352
+ * hardware.
353
+ *
354
+ * The string returned by this function is UTF-8 encoded, read-only, and
355
+ * managed internally. You are not to free it. If you need to keep the
356
+ * string for any length of time, you should make your own copy of it, as it
357
+ * will be invalid next time any of several other SDL functions is called.
358
+ */
359
+ extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index,
360
+ int iscapture);
361
+
362
+
363
+ /**
364
+ * Open a specific audio device. Passing in a device name of NULL requests
365
+ * the most reasonable default (and is equivalent to calling SDL_OpenAudio()).
366
+ *
367
+ * The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but
368
+ * some drivers allow arbitrary and driver-specific strings, such as a
369
+ * hostname/IP address for a remote audio server, or a filename in the
370
+ * diskaudio driver.
371
+ *
372
+ * \return 0 on error, a valid device ID that is >= 2 on success.
373
+ *
374
+ * SDL_OpenAudio(), unlike this function, always acts on device ID 1.
375
+ */
376
+ extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char
377
+ *device,
378
+ int iscapture,
379
+ const
380
+ SDL_AudioSpec *
381
+ desired,
382
+ SDL_AudioSpec *
383
+ obtained,
384
+ int
385
+ allowed_changes);
386
+
387
+
388
+
389
+ /**
390
+ * \name Audio state
391
+ *
392
+ * Get the current audio state.
393
+ */
394
+ /* @{ */
395
+ typedef enum
396
+ {
397
+ SDL_AUDIO_STOPPED = 0,
398
+ SDL_AUDIO_PLAYING,
399
+ SDL_AUDIO_PAUSED
400
+ } SDL_AudioStatus;
401
+ extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void);
402
+
403
+ extern DECLSPEC SDL_AudioStatus SDLCALL
404
+ SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
405
+ /* @} *//* Audio State */
406
+
407
+ /**
408
+ * \name Pause audio functions
409
+ *
410
+ * These functions pause and unpause the audio callback processing.
411
+ * They should be called with a parameter of 0 after opening the audio
412
+ * device to start playing sound. This is so you can safely initialize
413
+ * data for your callback function after opening the audio device.
414
+ * Silence will be written to the audio device during the pause.
415
+ */
416
+ /* @{ */
417
+ extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on);
418
+ extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev,
419
+ int pause_on);
420
+ /* @} *//* Pause audio functions */
421
+
422
+ /**
423
+ * This function loads a WAVE from the data source, automatically freeing
424
+ * that source if \c freesrc is non-zero. For example, to load a WAVE file,
425
+ * you could do:
426
+ * \code
427
+ * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);
428
+ * \endcode
429
+ *
430
+ * If this function succeeds, it returns the given SDL_AudioSpec,
431
+ * filled with the audio data format of the wave data, and sets
432
+ * \c *audio_buf to a malloc()'d buffer containing the audio data,
433
+ * and sets \c *audio_len to the length of that audio buffer, in bytes.
434
+ * You need to free the audio buffer with SDL_FreeWAV() when you are
435
+ * done with it.
436
+ *
437
+ * This function returns NULL and sets the SDL error message if the
438
+ * wave file cannot be opened, uses an unknown data format, or is
439
+ * corrupt. Currently raw and MS-ADPCM WAVE files are supported.
440
+ */
441
+ extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src,
442
+ int freesrc,
443
+ SDL_AudioSpec * spec,
444
+ Uint8 ** audio_buf,
445
+ Uint32 * audio_len);
446
+
447
+ /**
448
+ * Loads a WAV from a file.
449
+ * Compatibility convenience function.
450
+ */
451
+ #define SDL_LoadWAV(file, spec, audio_buf, audio_len) \
452
+ SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len)
453
+
454
+ /**
455
+ * This function frees data previously allocated with SDL_LoadWAV_RW()
456
+ */
457
+ extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf);
458
+
459
+ /**
460
+ * This function takes a source format and rate and a destination format
461
+ * and rate, and initializes the \c cvt structure with information needed
462
+ * by SDL_ConvertAudio() to convert a buffer of audio data from one format
463
+ * to the other. An unsupported format causes an error and -1 will be returned.
464
+ *
465
+ * \return 0 if no conversion is needed, 1 if the audio filter is set up,
466
+ * or -1 on error.
467
+ */
468
+ extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
469
+ SDL_AudioFormat src_format,
470
+ Uint8 src_channels,
471
+ int src_rate,
472
+ SDL_AudioFormat dst_format,
473
+ Uint8 dst_channels,
474
+ int dst_rate);
475
+
476
+ /**
477
+ * Once you have initialized the \c cvt structure using SDL_BuildAudioCVT(),
478
+ * created an audio buffer \c cvt->buf, and filled it with \c cvt->len bytes of
479
+ * audio data in the source format, this function will convert it in-place
480
+ * to the desired format.
481
+ *
482
+ * The data conversion may expand the size of the audio data, so the buffer
483
+ * \c cvt->buf should be allocated after the \c cvt structure is initialized by
484
+ * SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long.
485
+ *
486
+ * \return 0 on success or -1 if \c cvt->buf is NULL.
487
+ */
488
+ extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt);
489
+
490
+ /* SDL_AudioStream is a new audio conversion interface.
491
+ The benefits vs SDL_AudioCVT:
492
+ - it can handle resampling data in chunks without generating
493
+ artifacts, when it doesn't have the complete buffer available.
494
+ - it can handle incoming data in any variable size.
495
+ - You push data as you have it, and pull it when you need it
496
+ */
497
+ /* this is opaque to the outside world. */
498
+ struct _SDL_AudioStream;
499
+ typedef struct _SDL_AudioStream SDL_AudioStream;
500
+
501
+ /**
502
+ * Create a new audio stream
503
+ *
504
+ * \param src_format The format of the source audio
505
+ * \param src_channels The number of channels of the source audio
506
+ * \param src_rate The sampling rate of the source audio
507
+ * \param dst_format The format of the desired audio output
508
+ * \param dst_channels The number of channels of the desired audio output
509
+ * \param dst_rate The sampling rate of the desired audio output
510
+ * \return 0 on success, or -1 on error.
511
+ *
512
+ * \sa SDL_AudioStreamPut
513
+ * \sa SDL_AudioStreamGet
514
+ * \sa SDL_AudioStreamAvailable
515
+ * \sa SDL_AudioStreamFlush
516
+ * \sa SDL_AudioStreamClear
517
+ * \sa SDL_FreeAudioStream
518
+ */
519
+ extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioFormat src_format,
520
+ const Uint8 src_channels,
521
+ const int src_rate,
522
+ const SDL_AudioFormat dst_format,
523
+ const Uint8 dst_channels,
524
+ const int dst_rate);
525
+
526
+ /**
527
+ * Add data to be converted/resampled to the stream
528
+ *
529
+ * \param stream The stream the audio data is being added to
530
+ * \param buf A pointer to the audio data to add
531
+ * \param len The number of bytes to write to the stream
532
+ * \return 0 on success, or -1 on error.
533
+ *
534
+ * \sa SDL_NewAudioStream
535
+ * \sa SDL_AudioStreamGet
536
+ * \sa SDL_AudioStreamAvailable
537
+ * \sa SDL_AudioStreamFlush
538
+ * \sa SDL_AudioStreamClear
539
+ * \sa SDL_FreeAudioStream
540
+ */
541
+ extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len);
542
+
543
+ /**
544
+ * Get converted/resampled data from the stream
545
+ *
546
+ * \param stream The stream the audio is being requested from
547
+ * \param buf A buffer to fill with audio data
548
+ * \param len The maximum number of bytes to fill
549
+ * \return The number of bytes read from the stream, or -1 on error
550
+ *
551
+ * \sa SDL_NewAudioStream
552
+ * \sa SDL_AudioStreamPut
553
+ * \sa SDL_AudioStreamAvailable
554
+ * \sa SDL_AudioStreamFlush
555
+ * \sa SDL_AudioStreamClear
556
+ * \sa SDL_FreeAudioStream
557
+ */
558
+ extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len);
559
+
560
+ /**
561
+ * Get the number of converted/resampled bytes available. The stream may be
562
+ * buffering data behind the scenes until it has enough to resample
563
+ * correctly, so this number might be lower than what you expect, or even
564
+ * be zero. Add more data or flush the stream if you need the data now.
565
+ *
566
+ * \sa SDL_NewAudioStream
567
+ * \sa SDL_AudioStreamPut
568
+ * \sa SDL_AudioStreamGet
569
+ * \sa SDL_AudioStreamFlush
570
+ * \sa SDL_AudioStreamClear
571
+ * \sa SDL_FreeAudioStream
572
+ */
573
+ extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream);
574
+
575
+ /**
576
+ * Tell the stream that you're done sending data, and anything being buffered
577
+ * should be converted/resampled and made available immediately.
578
+ *
579
+ * It is legal to add more data to a stream after flushing, but there will
580
+ * be audio gaps in the output. Generally this is intended to signal the
581
+ * end of input, so the complete output becomes available.
582
+ *
583
+ * \sa SDL_NewAudioStream
584
+ * \sa SDL_AudioStreamPut
585
+ * \sa SDL_AudioStreamGet
586
+ * \sa SDL_AudioStreamAvailable
587
+ * \sa SDL_AudioStreamClear
588
+ * \sa SDL_FreeAudioStream
589
+ */
590
+ extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream);
591
+
592
+ /**
593
+ * Clear any pending data in the stream without converting it
594
+ *
595
+ * \sa SDL_NewAudioStream
596
+ * \sa SDL_AudioStreamPut
597
+ * \sa SDL_AudioStreamGet
598
+ * \sa SDL_AudioStreamAvailable
599
+ * \sa SDL_AudioStreamFlush
600
+ * \sa SDL_FreeAudioStream
601
+ */
602
+ extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream);
603
+
604
+ /**
605
+ * Free an audio stream
606
+ *
607
+ * \sa SDL_NewAudioStream
608
+ * \sa SDL_AudioStreamPut
609
+ * \sa SDL_AudioStreamGet
610
+ * \sa SDL_AudioStreamAvailable
611
+ * \sa SDL_AudioStreamFlush
612
+ * \sa SDL_AudioStreamClear
613
+ */
614
+ extern DECLSPEC void SDLCALL SDL_FreeAudioStream(SDL_AudioStream *stream);
615
+
616
+ #define SDL_MIX_MAXVOLUME 128
617
+ /**
618
+ * This takes two audio buffers of the playing audio format and mixes
619
+ * them, performing addition, volume adjustment, and overflow clipping.
620
+ * The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME
621
+ * for full audio volume. Note this does not change hardware volume.
622
+ * This is provided for convenience -- you can mix your own audio data.
623
+ */
624
+ extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src,
625
+ Uint32 len, int volume);
626
+
627
+ /**
628
+ * This works like SDL_MixAudio(), but you specify the audio format instead of
629
+ * using the format of audio device 1. Thus it can be used when no audio
630
+ * device is open at all.
631
+ */
632
+ extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst,
633
+ const Uint8 * src,
634
+ SDL_AudioFormat format,
635
+ Uint32 len, int volume);
636
+
637
+ /**
638
+ * Queue more audio on non-callback devices.
639
+ *
640
+ * (If you are looking to retrieve queued audio from a non-callback capture
641
+ * device, you want SDL_DequeueAudio() instead. This will return -1 to
642
+ * signify an error if you use it with capture devices.)
643
+ *
644
+ * SDL offers two ways to feed audio to the device: you can either supply a
645
+ * callback that SDL triggers with some frequency to obtain more audio
646
+ * (pull method), or you can supply no callback, and then SDL will expect
647
+ * you to supply data at regular intervals (push method) with this function.
648
+ *
649
+ * There are no limits on the amount of data you can queue, short of
650
+ * exhaustion of address space. Queued data will drain to the device as
651
+ * necessary without further intervention from you. If the device needs
652
+ * audio but there is not enough queued, it will play silence to make up
653
+ * the difference. This means you will have skips in your audio playback
654
+ * if you aren't routinely queueing sufficient data.
655
+ *
656
+ * This function copies the supplied data, so you are safe to free it when
657
+ * the function returns. This function is thread-safe, but queueing to the
658
+ * same device from two threads at once does not promise which buffer will
659
+ * be queued first.
660
+ *
661
+ * You may not queue audio on a device that is using an application-supplied
662
+ * callback; doing so returns an error. You have to use the audio callback
663
+ * or queue audio with this function, but not both.
664
+ *
665
+ * You should not call SDL_LockAudio() on the device before queueing; SDL
666
+ * handles locking internally for this function.
667
+ *
668
+ * \param dev The device ID to which we will queue audio.
669
+ * \param data The data to queue to the device for later playback.
670
+ * \param len The number of bytes (not samples!) to which (data) points.
671
+ * \return 0 on success, or -1 on error.
672
+ *
673
+ * \sa SDL_GetQueuedAudioSize
674
+ * \sa SDL_ClearQueuedAudio
675
+ */
676
+ extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len);
677
+
678
+ /**
679
+ * Dequeue more audio on non-callback devices.
680
+ *
681
+ * (If you are looking to queue audio for output on a non-callback playback
682
+ * device, you want SDL_QueueAudio() instead. This will always return 0
683
+ * if you use it with playback devices.)
684
+ *
685
+ * SDL offers two ways to retrieve audio from a capture device: you can
686
+ * either supply a callback that SDL triggers with some frequency as the
687
+ * device records more audio data, (push method), or you can supply no
688
+ * callback, and then SDL will expect you to retrieve data at regular
689
+ * intervals (pull method) with this function.
690
+ *
691
+ * There are no limits on the amount of data you can queue, short of
692
+ * exhaustion of address space. Data from the device will keep queuing as
693
+ * necessary without further intervention from you. This means you will
694
+ * eventually run out of memory if you aren't routinely dequeueing data.
695
+ *
696
+ * Capture devices will not queue data when paused; if you are expecting
697
+ * to not need captured audio for some length of time, use
698
+ * SDL_PauseAudioDevice() to stop the capture device from queueing more
699
+ * data. This can be useful during, say, level loading times. When
700
+ * unpaused, capture devices will start queueing data from that point,
701
+ * having flushed any capturable data available while paused.
702
+ *
703
+ * This function is thread-safe, but dequeueing from the same device from
704
+ * two threads at once does not promise which thread will dequeued data
705
+ * first.
706
+ *
707
+ * You may not dequeue audio from a device that is using an
708
+ * application-supplied callback; doing so returns an error. You have to use
709
+ * the audio callback, or dequeue audio with this function, but not both.
710
+ *
711
+ * You should not call SDL_LockAudio() on the device before queueing; SDL
712
+ * handles locking internally for this function.
713
+ *
714
+ * \param dev The device ID from which we will dequeue audio.
715
+ * \param data A pointer into where audio data should be copied.
716
+ * \param len The number of bytes (not samples!) to which (data) points.
717
+ * \return number of bytes dequeued, which could be less than requested.
718
+ *
719
+ * \sa SDL_GetQueuedAudioSize
720
+ * \sa SDL_ClearQueuedAudio
721
+ */
722
+ extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len);
723
+
724
+ /**
725
+ * Get the number of bytes of still-queued audio.
726
+ *
727
+ * For playback device:
728
+ *
729
+ * This is the number of bytes that have been queued for playback with
730
+ * SDL_QueueAudio(), but have not yet been sent to the hardware. This
731
+ * number may shrink at any time, so this only informs of pending data.
732
+ *
733
+ * Once we've sent it to the hardware, this function can not decide the
734
+ * exact byte boundary of what has been played. It's possible that we just
735
+ * gave the hardware several kilobytes right before you called this
736
+ * function, but it hasn't played any of it yet, or maybe half of it, etc.
737
+ *
738
+ * For capture devices:
739
+ *
740
+ * This is the number of bytes that have been captured by the device and
741
+ * are waiting for you to dequeue. This number may grow at any time, so
742
+ * this only informs of the lower-bound of available data.
743
+ *
744
+ * You may not queue audio on a device that is using an application-supplied
745
+ * callback; calling this function on such a device always returns 0.
746
+ * You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use
747
+ * the audio callback, but not both.
748
+ *
749
+ * You should not call SDL_LockAudio() on the device before querying; SDL
750
+ * handles locking internally for this function.
751
+ *
752
+ * \param dev The device ID of which we will query queued audio size.
753
+ * \return Number of bytes (not samples!) of queued audio.
754
+ *
755
+ * \sa SDL_QueueAudio
756
+ * \sa SDL_ClearQueuedAudio
757
+ */
758
+ extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
759
+
760
+ /**
761
+ * Drop any queued audio data. For playback devices, this is any queued data
762
+ * still waiting to be submitted to the hardware. For capture devices, this
763
+ * is any data that was queued by the device that hasn't yet been dequeued by
764
+ * the application.
765
+ *
766
+ * Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For
767
+ * playback devices, the hardware will start playing silence if more audio
768
+ * isn't queued. Unpaused capture devices will start filling the queue again
769
+ * as soon as they have more data available (which, depending on the state
770
+ * of the hardware and the thread, could be before this function call
771
+ * returns!).
772
+ *
773
+ * This will not prevent playback of queued audio that's already been sent
774
+ * to the hardware, as we can not undo that, so expect there to be some
775
+ * fraction of a second of audio that might still be heard. This can be
776
+ * useful if you want to, say, drop any pending music during a level change
777
+ * in your game.
778
+ *
779
+ * You may not queue audio on a device that is using an application-supplied
780
+ * callback; calling this function on such a device is always a no-op.
781
+ * You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use
782
+ * the audio callback, but not both.
783
+ *
784
+ * You should not call SDL_LockAudio() on the device before clearing the
785
+ * queue; SDL handles locking internally for this function.
786
+ *
787
+ * This function always succeeds and thus returns void.
788
+ *
789
+ * \param dev The device ID of which to clear the audio queue.
790
+ *
791
+ * \sa SDL_QueueAudio
792
+ * \sa SDL_GetQueuedAudioSize
793
+ */
794
+ extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev);
795
+
796
+
797
+ /**
798
+ * \name Audio lock functions
799
+ *
800
+ * The lock manipulated by these functions protects the callback function.
801
+ * During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that
802
+ * the callback function is not running. Do not call these from the callback
803
+ * function or you will cause deadlock.
804
+ */
805
+ /* @{ */
806
+ extern DECLSPEC void SDLCALL SDL_LockAudio(void);
807
+ extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev);
808
+ extern DECLSPEC void SDLCALL SDL_UnlockAudio(void);
809
+ extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev);
810
+ /* @} *//* Audio lock functions */
811
+
812
+ /**
813
+ * This function shuts down audio processing and closes the audio device.
814
+ */
815
+ extern DECLSPEC void SDLCALL SDL_CloseAudio(void);
816
+ extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);
817
+
818
+ /* Ends C function definitions when using C++ */
819
+ #ifdef __cplusplus
820
+ }
821
+ #endif
822
+ #include "close_code.h"
823
+
824
+ #endif /* SDL_audio_h_ */
825
+
826
+ /* vi: set ts=4 sw=4 expandtab: */