ruby2d 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/README.md +20 -7
- data/assets/include/SDL2/SDL.h +135 -0
- data/assets/include/SDL2/SDL_assert.h +291 -0
- data/assets/include/SDL2/SDL_atomic.h +277 -0
- data/assets/include/SDL2/SDL_audio.h +826 -0
- data/assets/include/SDL2/SDL_bits.h +112 -0
- data/assets/include/SDL2/SDL_blendmode.h +120 -0
- data/assets/include/SDL2/SDL_clipboard.h +71 -0
- data/assets/include/SDL2/SDL_config.h +421 -0
- data/assets/include/SDL2/SDL_cpuinfo.h +188 -0
- data/assets/include/SDL2/SDL_egl.h +1673 -0
- data/assets/include/SDL2/SDL_endian.h +260 -0
- data/assets/include/SDL2/SDL_error.h +76 -0
- data/assets/include/SDL2/SDL_events.h +788 -0
- data/assets/include/SDL2/SDL_filesystem.h +136 -0
- data/assets/include/SDL2/SDL_gamecontroller.h +390 -0
- data/assets/include/SDL2/SDL_gesture.h +87 -0
- data/assets/include/SDL2/SDL_haptic.h +1238 -0
- data/assets/include/SDL2/SDL_hints.h +1135 -0
- data/assets/include/SDL2/SDL_image.h +161 -0
- data/assets/include/SDL2/SDL_joystick.h +408 -0
- data/assets/include/SDL2/SDL_keyboard.h +217 -0
- data/assets/include/SDL2/SDL_keycode.h +349 -0
- data/assets/include/SDL2/SDL_loadso.h +81 -0
- data/assets/include/SDL2/SDL_log.h +211 -0
- data/assets/include/SDL2/SDL_main.h +168 -0
- data/assets/include/SDL2/SDL_messagebox.h +144 -0
- data/assets/include/SDL2/SDL_mixer.h +651 -0
- data/assets/include/SDL2/SDL_mouse.h +302 -0
- data/assets/include/SDL2/SDL_mutex.h +251 -0
- data/assets/include/SDL2/SDL_name.h +33 -0
- data/assets/include/SDL2/SDL_opengl.h +2183 -0
- data/assets/include/SDL2/SDL_opengl_glext.h +11177 -0
- data/assets/include/SDL2/SDL_opengles.h +39 -0
- data/assets/include/SDL2/SDL_opengles2.h +52 -0
- data/assets/include/SDL2/SDL_opengles2_gl2.h +621 -0
- data/assets/include/SDL2/SDL_opengles2_gl2ext.h +2050 -0
- data/assets/include/SDL2/SDL_opengles2_gl2platform.h +30 -0
- data/assets/include/SDL2/SDL_opengles2_khrplatform.h +282 -0
- data/assets/include/SDL2/SDL_pixels.h +470 -0
- data/assets/include/SDL2/SDL_platform.h +198 -0
- data/assets/include/SDL2/SDL_power.h +75 -0
- data/assets/include/SDL2/SDL_quit.h +58 -0
- data/assets/include/SDL2/SDL_rect.h +148 -0
- data/assets/include/SDL2/SDL_render.h +931 -0
- data/assets/include/SDL2/SDL_revision.h +2 -0
- data/assets/include/SDL2/SDL_rwops.h +254 -0
- data/assets/include/SDL2/SDL_scancode.h +413 -0
- data/assets/include/SDL2/SDL_sensor.h +251 -0
- data/assets/include/SDL2/SDL_shape.h +144 -0
- data/assets/include/SDL2/SDL_stdinc.h +607 -0
- data/assets/include/SDL2/SDL_surface.h +553 -0
- data/assets/include/SDL2/SDL_system.h +279 -0
- data/assets/include/SDL2/SDL_syswm.h +324 -0
- data/assets/include/SDL2/SDL_test.h +69 -0
- data/assets/include/SDL2/SDL_test_assert.h +105 -0
- data/assets/include/SDL2/SDL_test_common.h +188 -0
- data/assets/include/SDL2/SDL_test_compare.h +69 -0
- data/assets/include/SDL2/SDL_test_crc32.h +124 -0
- data/assets/include/SDL2/SDL_test_font.h +81 -0
- data/assets/include/SDL2/SDL_test_fuzzer.h +384 -0
- data/assets/include/SDL2/SDL_test_harness.h +134 -0
- data/assets/include/SDL2/SDL_test_images.h +78 -0
- data/assets/include/SDL2/SDL_test_log.h +67 -0
- data/assets/include/SDL2/SDL_test_md5.h +129 -0
- data/assets/include/SDL2/SDL_test_memory.h +63 -0
- data/assets/include/SDL2/SDL_test_random.h +115 -0
- data/assets/include/SDL2/SDL_thread.h +343 -0
- data/assets/include/SDL2/SDL_timer.h +115 -0
- data/assets/include/SDL2/SDL_touch.h +86 -0
- data/assets/include/SDL2/SDL_ttf.h +294 -0
- data/assets/include/SDL2/SDL_types.h +29 -0
- data/assets/include/SDL2/SDL_version.h +162 -0
- data/assets/include/SDL2/SDL_video.h +1276 -0
- data/assets/include/SDL2/SDL_vulkan.h +278 -0
- data/assets/include/SDL2/begin_code.h +167 -0
- data/assets/include/SDL2/close_code.h +37 -0
- data/assets/include/glew.h +23686 -0
- data/assets/include/simple2d.h +735 -0
- data/assets/ios/MRuby.framework/Headers/mrbconf.h +3 -5
- data/assets/ios/MRuby.framework/Headers/mruby.h +35 -32
- data/assets/ios/MRuby.framework/Headers/mruby/array.h +1 -0
- data/assets/ios/MRuby.framework/Headers/mruby/boxing_word.h +9 -1
- data/assets/ios/MRuby.framework/Headers/mruby/class.h +14 -11
- data/assets/ios/MRuby.framework/Headers/mruby/common.h +5 -0
- data/assets/ios/MRuby.framework/Headers/mruby/compile.h +4 -3
- data/assets/ios/MRuby.framework/Headers/mruby/debug.h +3 -2
- data/assets/ios/MRuby.framework/Headers/mruby/dump.h +2 -2
- data/assets/ios/MRuby.framework/Headers/mruby/hash.h +38 -5
- data/assets/ios/MRuby.framework/Headers/mruby/irep.h +17 -4
- data/assets/ios/MRuby.framework/Headers/mruby/object.h +4 -5
- data/assets/ios/MRuby.framework/Headers/mruby/opcode.h +47 -139
- data/assets/ios/MRuby.framework/Headers/mruby/ops.h +117 -0
- data/assets/ios/MRuby.framework/Headers/mruby/proc.h +4 -4
- data/assets/ios/MRuby.framework/Headers/mruby/string.h +11 -7
- data/assets/ios/MRuby.framework/Headers/mruby/throw.h +4 -4
- data/assets/ios/MRuby.framework/Headers/mruby/variable.h +2 -4
- data/assets/ios/MRuby.framework/Headers/mruby/version.h +6 -6
- data/assets/ios/MRuby.framework/MRuby +0 -0
- data/assets/ios/MyApp.xcodeproj/project.pbxproj +24 -18
- data/assets/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- data/assets/ios/main.c +1 -1
- data/assets/macos/lib/libFLAC.a +0 -0
- data/assets/macos/lib/libSDL2.a +0 -0
- data/assets/macos/lib/libSDL2_image.a +0 -0
- data/assets/macos/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/lib/libfreetype.a +0 -0
- data/assets/macos/lib/libjpeg.a +0 -0
- data/assets/macos/lib/libmpg123.a +0 -0
- data/assets/macos/lib/libogg.a +0 -0
- data/assets/macos/lib/libpng16.a +0 -0
- data/assets/macos/lib/libsimple2d.a +0 -0
- data/assets/macos/lib/libtiff.a +0 -0
- data/assets/macos/lib/libvorbis.a +0 -0
- data/assets/macos/lib/libvorbisfile.a +0 -0
- data/assets/macos/lib/libwebp.a +0 -0
- data/assets/mingw/bin/SDL2.dll +0 -0
- data/assets/mingw/bin/SDL2_image.dll +0 -0
- data/assets/mingw/bin/SDL2_mixer.dll +0 -0
- data/assets/mingw/bin/SDL2_ttf.dll +0 -0
- data/assets/mingw/bin/glew32.dll +0 -0
- data/assets/mingw/bin/libFLAC-8.dll +0 -0
- data/assets/mingw/bin/libfreetype-6.dll +0 -0
- data/assets/mingw/bin/libjpeg-9.dll +0 -0
- data/assets/mingw/bin/libmodplug-1.dll +0 -0
- data/assets/mingw/bin/libmpg123-0.dll +0 -0
- data/assets/mingw/bin/libogg-0.dll +0 -0
- data/assets/mingw/bin/libopus-0.dll +0 -0
- data/assets/mingw/bin/libopusfile-0.dll +0 -0
- data/assets/mingw/bin/libpng16-16.dll +0 -0
- data/assets/mingw/bin/libtiff-5.dll +0 -0
- data/assets/mingw/bin/libvorbis-0.dll +0 -0
- data/assets/mingw/bin/libvorbisfile-3.dll +0 -0
- data/assets/mingw/bin/libwebp-7.dll +0 -0
- data/assets/mingw/bin/zlib1.dll +0 -0
- data/assets/mingw/lib/libSDL2.a +0 -0
- data/assets/mingw/lib/libSDL2.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_image.a +0 -0
- data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_mixer.a +0 -0
- data/assets/mingw/lib/libSDL2_mixer.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_test.a +0 -0
- data/assets/mingw/lib/libSDL2_ttf.a +0 -0
- data/assets/mingw/lib/libSDL2_ttf.dll.a +0 -0
- data/assets/mingw/lib/libSDL2main.a +0 -0
- data/assets/mingw/lib/libglew32.a +0 -0
- data/assets/mingw/lib/libglew32.dll.a +0 -0
- data/assets/mingw/lib/libsimple2d.a +0 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +4 -0
- data/assets/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +7 -0
- data/assets/tvos/MRuby.framework/Headers/mrbconf.h +3 -5
- data/assets/tvos/MRuby.framework/Headers/mruby.h +35 -32
- data/assets/tvos/MRuby.framework/Headers/mruby/array.h +1 -0
- data/assets/tvos/MRuby.framework/Headers/mruby/boxing_word.h +9 -1
- data/assets/tvos/MRuby.framework/Headers/mruby/class.h +14 -11
- data/assets/tvos/MRuby.framework/Headers/mruby/common.h +5 -0
- data/assets/tvos/MRuby.framework/Headers/mruby/compile.h +4 -3
- data/assets/tvos/MRuby.framework/Headers/mruby/debug.h +3 -2
- data/assets/tvos/MRuby.framework/Headers/mruby/dump.h +2 -2
- data/assets/tvos/MRuby.framework/Headers/mruby/hash.h +38 -5
- data/assets/tvos/MRuby.framework/Headers/mruby/irep.h +17 -4
- data/assets/tvos/MRuby.framework/Headers/mruby/object.h +4 -5
- data/assets/tvos/MRuby.framework/Headers/mruby/opcode.h +47 -139
- data/assets/tvos/MRuby.framework/Headers/mruby/ops.h +117 -0
- data/assets/tvos/MRuby.framework/Headers/mruby/proc.h +4 -4
- data/assets/tvos/MRuby.framework/Headers/mruby/string.h +11 -7
- data/assets/tvos/MRuby.framework/Headers/mruby/throw.h +4 -4
- data/assets/tvos/MRuby.framework/Headers/mruby/variable.h +2 -4
- data/assets/tvos/MRuby.framework/Headers/mruby/version.h +6 -6
- data/assets/tvos/MRuby.framework/MRuby +0 -0
- data/assets/tvos/MyApp.xcodeproj/project.pbxproj +25 -19
- data/assets/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- data/assets/tvos/main.c +1 -1
- data/ext/ruby2d/extconf.rb +59 -50
- data/ext/ruby2d/ruby2d.c +0 -1
- data/lib/ruby2d.rb +1 -7
- data/lib/ruby2d/cli/launch.rb +1 -1
- data/lib/ruby2d/font.rb +32 -7
- data/lib/ruby2d/version.rb +1 -1
- metadata +132 -6
- data/assets/opal.js +0 -21637
- data/assets/simple2d.js +0 -1379
- 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: */
|