1
1
import ctypes
2
+ import weakref
2
3
3
4
from . import _al
4
5
from . import _alc
5
6
from . import _alut
6
7
8
+ _refs = {}
9
+ def call_on_del (obj , func , * args , ** kwargs ):
10
+ x = max (_refs .iterkeys ()) + 1 if _refs else 0
11
+ _refs [x ] = weakref .ref (obj , lambda ref : (_refs .pop (x ), func (* args , ** kwargs )))
12
+
7
13
def call_array_fill (atype , elements , func , * args ):
8
14
x = (atype * len (elements ))()
9
15
for k , v in enumerate (elements ):
@@ -27,13 +33,8 @@ def __init__(self, name=None):
27
33
#print repr(_alc.GetString(0, _alc.ALC_DEVICE_SPECIFIER))
28
34
self ._handle = _alc .OpenDevice (name )
29
35
assert self ._handle
30
- def __del__ (self ):
31
- if hasattr (self , "_handle" ):
32
- try :
33
- _alc .CloseDevice (self ._handle )
34
- except :
35
- pass
36
- del self ._handle
36
+ call_on_del (self , _alc .CloseDevice , self ._handle )
37
+
37
38
def ContextListener (self , * args , ** kwargs ):
38
39
return ContextListener (self , * args , ** kwargs )
39
40
@@ -43,14 +44,12 @@ def __init__(self, device, frequency=None, refresh=None, sync=None, mono_sources
43
44
self ._handle = _alc .CreateContext (self ._device ._handle , None ) # XXX
44
45
assert self ._handle
45
46
_alc .MakeContextCurrent (self ._handle )
46
- def __del__ (self ):
47
- _alc .MakeContextCurrent (None )
48
- if hasattr (self , "_handle" ):
49
- try :
50
- _alc .DestroyContext (self ._handle )
51
- except :
52
- pass
53
- del self ._handle
47
+
48
+ handle = self ._handle
49
+ call_on_del (self , lambda : (_alc .MakeContextCurrent (None ), _alc .DestroyContext (handle )))
50
+
51
+ def get_source (self ):
52
+ return Source (self )
54
53
55
54
def process (self ):
56
55
_alc .ProcessContext (self ._handle )
@@ -114,17 +113,14 @@ def is_enabled(self, target):
114
113
) # forward, up
115
114
116
115
class Source (_NoSetAttr ):
117
- def __init__ (self ):
116
+ def __init__ (self , cl ):
117
+ self ._cl = cl
118
+ self ._buffer = None
119
+
118
120
x = ctypes .c_uint ()
119
121
_al .GenSources (1 , ctypes .byref (x ))
120
122
self ._handle = x .value
121
- def __del__ (self ):
122
- if hasattr (self , "_handle" ):
123
- try :
124
- _al .DeleteSources (1 , ctypes .byref (ctypes .c_uint (self ._handle )))
125
- except :
126
- pass
127
- del self ._handle
123
+ call_on_del (self , _al .DeleteSources , 1 , ctypes .byref (ctypes .c_uint (self ._handle )))
128
124
129
125
def queue_buffers (self , buffers ):
130
126
raise NotImplementedError
@@ -164,10 +160,14 @@ def rewindy(self):
164
160
lambda self : call_array (ctypes .c_int , 1 , _al .GetSourcei , self ._handle , _al .LOOPING )[0 ],
165
161
lambda self , v : _al .Sourcei (self ._handle , _al .LOOPING , v ),
166
162
)
167
- buffer = property (
168
- lambda self : call_array (ctypes .c_int , 1 , _al .GetSourcei , self ._handle , _al .BUFFER )[0 ], # XXX
169
- lambda self , v : _al .Sourcei (self ._handle , _al .BUFFER , _al .NONE if v is None else v ._handle ),
170
- )
163
+
164
+ def _get_buffer (self ):
165
+ return self ._buffer
166
+ def _set_buffer (self , v ):
167
+ _al .Sourcei (self ._handle , _al .BUFFER , _al .NONE if v is None else v ._handle )
168
+ self ._buffer = v
169
+ buffer = property (_get_buffer , _set_buffer )
170
+
171
171
buffers_queued = property (
172
172
lambda self : call_array (ctypes .c_int , 1 , _al .GetSourcei , self ._handle , _al .BUFFERS_QUEUED )[0 ],
173
173
)
@@ -224,32 +224,27 @@ def rewindy(self):
224
224
)
225
225
226
226
class Buffer (_NoSetAttr ):
227
- def __init__ (self , filename = None , data = None ):
228
- assert filename is None or data is None
227
+ def __init__ (self , filename = None , data = None , rawdata = None ):
228
+ assert (filename is not None ) + (data is not None ) + (rawdata is not None ) == 1
229
+
229
230
if filename is not None :
230
231
self ._handle = _alut .CreateBufferFromFile (filename )
231
232
elif data is not None :
232
233
self ._handle = _alut .CreateBufferFromFileImage (data , len (data ))
233
234
else :
235
+ channels , bits , frequency , data2 = rawdata
234
236
x = ctypes .c_uint ()
235
237
_al .GenBuffers (1 , ctypes .byref (x ))
236
238
self ._handle = x .value
237
- def __del__ (self ):
238
- if hasattr (self , "_handle" ):
239
- try :
240
- _al .DeleteBuffers (1 , ctypes .byref (ctypes .c_uint (self ._handle )))
241
- except :
242
- pass
243
- del self ._handle
244
-
245
- def set_data (self , channels , bits , frequency , data ):
246
- format = {
247
- (1 , 8 ): _al .FORMAT_MONO8 ,
248
- (1 , 16 ): _al .FORMAT_MONO16 ,
249
- (2 , 8 ): _al .FORMAT_STEREO8 ,
250
- (2 , 16 ): _al .FORMAT_STEREO16 ,
251
- }[channels , bits ]
252
- _al .BufferData (self ._handle , format , data , len (data ), frequency )
239
+ format = {
240
+ (1 , 8 ): _al .FORMAT_MONO8 ,
241
+ (1 , 16 ): _al .FORMAT_MONO16 ,
242
+ (2 , 8 ): _al .FORMAT_STEREO8 ,
243
+ (2 , 16 ): _al .FORMAT_STEREO16 ,
244
+ }[channels , bits ]
245
+ _al .BufferData (self ._handle , format , data2 , len (data2 ), frequency )
246
+
247
+ call_on_del (self , _al .DeleteBuffers , 1 , ctypes .byref (ctypes .c_uint (self ._handle )))
253
248
254
249
frequency = property (
255
250
lambda self : call_array (ctypes .c_int , 1 , _al .GetBufferi , self ._handle , _al .FREQUENCY )[0 ],
0 commit comments