-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsound.py
More file actions
80 lines (80 loc) · 2.09 KB
/
sound.py
File metadata and controls
80 lines (80 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#Written By Carter Temm
#No part of this class was done by me, Amerikranian. This is Carter's work alone.
import math
import ctypes
import sound_lib
from sound_lib import output
from sound_lib import stream
o=output.Output()
class sound():
def __init__(self):
self.handle=None
self.freq=44100
def load(self,source, mem=False):
if not source:
return False
if self.handle:
self.close()
if mem:
buffer=ctypes.create_string_buffer(source)
addr=ctypes.addressof(buffer)
self.handle=stream.FileStream(mem=True, file=addr, length=len(buffer))
else:
self.handle =stream.FileStream(file=source)
self.freq=self.handle.get_frequency()
def play(self):
self.handle.looping=False
self.handle.play()
def play_wait(self):
self.handle.looping=False
self.handle.play_blocking()
def pause(self):
if not self.handle: return
self.handle.pause()
def fade(self, fadetime):
if self.handle and self.handle.is_playing: self.handle.slide_attribute("volume",0,fadetime)
def play_looped(self):
self.handle.looping=True
self.looping=True
self.handle.play()
def stop(self):
if self.handle and self.handle.is_playing:
self.handle.stop()
self.handle.set_position(0)
@property
def volume(self):
if not self.handle:
return False
return round(math.log10(self.handle.volume)*20)
@volume.setter
def volume(self,value):
if not self.handle:
return False
self.handle.set_volume(10**(float(value)/20))
@property
def pitch(self):
if not self.handle:
return False
return (self.handle.get_frequency()/self.freq)*100
@pitch.setter
def pitch(self, value):
if not self.handle:
return False
self.handle.set_frequency((float(value)/100)*self.freq)
@property
def pan(self):
if not self.handle:
return False
return self.handle.get_pan()*100
@pan.setter
def pan(self, value):
if not self.handle:
return False
self.handle.set_pan(float(value)/100)
@property
def is_playing(self):
return self.handle.is_playing
def close(self):
if self.handle:
self.handle.free()
self.__init__()