1
- from cython.operator cimport dereference as deref
2
1
from cpython cimport Py_DECREF, Py_INCREF
3
2
4
3
cimport ga
5
4
cimport gau
6
5
cimport gc_common
6
+ cimport gc_thread
7
7
8
8
def initialize ():
9
9
gc_common.initialize(NULL )
@@ -13,11 +13,8 @@ def initialize():
13
13
# note: no need to case for shutdown
14
14
initialize()
15
15
16
- cdef gau.Manager* global_manager = gau.manager_create()
17
- cdef gau.Mixer* global_mixer = gau.manager_mixer(global_manager)
18
-
19
16
def update ():
20
- gau.manager_update(global_manager )
17
+ default_manager.update( )
21
18
22
19
23
20
cdef on_finish_callback(ga.Handle* in_handle, void * in_context):
@@ -38,18 +35,59 @@ cdef class CallbackContext(object):
38
35
self .sound = sound
39
36
40
37
38
+ cdef class Manager(object ):
39
+ # c types
40
+ cdef gau.Manager* p_manager
41
+ DEF DEFAULT_BUFFERS_NUMBER = 4
42
+ DEF DEFAULT_BUFFER_SAMPLES = 512
43
+
44
+ def __cinit__ (
45
+ self ,
46
+ int device = ga.DEVICE_TYPE_DEFAULT,
47
+ int thread_policy = gau.THREAD_POLICY_SINGLE,
48
+ int buffers_number = DEFAULT_BUFFERS_NUMBER,
49
+ int buffer_samples = DEFAULT_BUFFER_SAMPLES
50
+ ):
51
+ # note: we do not use gau.manager_create()
52
+ # instead of that we use the same defaults
53
+ self .p_manager = gau.manager_create_custom(
54
+ device,
55
+ thread_policy,
56
+ buffers_number,
57
+ buffer_samples,
58
+ )
59
+
60
+ def update (self ):
61
+ gau.manager_update(self .p_manager)
62
+
63
+ def __del__ (self ):
64
+ gau.manager_destroy(self .p_manager)
65
+
66
+
41
67
cdef class Mixer(object ):
42
- pass
68
+ # c types
69
+ cdef gau.Mixer* p_mixer
70
+ # cython objects
71
+ cdef Manager manager
72
+
73
+ def __cinit__ (self , Manager manager ):
74
+ self .manager = manager
75
+ self .p_mixer = gau.manager_mixer(manager.p_manager)
76
+
77
+ def __del__ (self ):
78
+ ga.mixer_destroy(self .p_mixer)
43
79
44
80
45
81
cdef class Voice(object ):
46
- cdef Sound sound
82
+ # c types
47
83
cdef int loop
48
- cdef Mixer mixer
49
-
50
84
cdef gau.SampleSourceLoop* loop_src
51
85
cdef ga.Handle* handle
52
86
87
+ # cython types
88
+ cdef Sound sound
89
+ cdef Mixer mixer
90
+
53
91
def __cinit__ (
54
92
self ,
55
93
Sound sound ,
@@ -60,9 +98,10 @@ cdef class Voice(object):
60
98
cdef CallbackContext context
61
99
62
100
self .sound = sound
63
- self .mixer = mixer
64
101
self .loop = loop
65
102
103
+ self .mixer = mixer or default_mixer
104
+
66
105
if on_finish:
67
106
context = CallbackContext(on_finish, self .sound)
68
107
@@ -71,7 +110,7 @@ cdef class Voice(object):
71
110
Py_INCREF(context)
72
111
73
112
self .handle = gau.create_handle_sound(
74
- global_mixer ,
113
+ self .mixer.p_mixer ,
75
114
self .sound.sound,
76
115
< ga.FinishCallback> & on_finish_callback,
77
116
< void * > context,
@@ -80,7 +119,7 @@ cdef class Voice(object):
80
119
81
120
else :
82
121
self .handle = gau.create_handle_sound(
83
- global_mixer ,
122
+ self .mixer.p_mixer ,
84
123
self .sound.sound,
85
124
< ga.FinishCallback> & gau.on_finish_destroy,
86
125
NULL ,
@@ -152,14 +191,26 @@ cdef class Sound(object):
152
191
else :
153
192
raise NotImplementedError (" streams not implemented yet" )
154
193
155
- def play (self , on_finish = None ):
194
+ def play (self , on_finish = None , mixer = None ):
156
195
cdef Voice voice
157
196
158
- voice = Voice(self , on_finish, 0 , None )
197
+ voice = Voice(self , on_finish, 0 , mixer )
159
198
voice.play()
160
199
161
200
return voice
162
201
163
202
def __del__ (self ):
164
203
""" Release sound (gorilla uses refcounting for that)"""
165
204
ga.sound_release(self .sound)
205
+
206
+ # default manager and mixer
207
+ default_manager = Manager()
208
+ default_mixer = Mixer(default_manager)
209
+
210
+ DEVICE_XAUDIO2 = ga.DEVICE_TYPE_XAUDIO2
211
+ DEVICE_DIRECTSOUND = ga.DEVICE_TYPE_DIRECTSOUND
212
+ DEVICE_OPENAL = ga.DEVICE_TYPE_OPENAL
213
+ DEVICE_DEFAULT = ga.DEVICE_TYPE_DEFAULT
214
+
215
+ THREAD_SINGLE = gau.THREAD_POLICY_SINGLE
216
+ THREAD_MULTI = gau.THREAD_POLICY_MULTI
0 commit comments