+import pyaudio as pa
+import sounddevice as sd
+import os.path
+
+from .lock import Lock
+from . import gain
+
+file_lock = Lock("file")
+
+pyaudio = pa.PyAudio()
+
+class MusicFile(Machine):
+ def __init__(self, filename, mapping, name = None, gain = 1):
+ states = [
+ 'initial',
+ 'loading',
+ 'failed',
+ { 'name': 'loaded', 'children': ['stopped', 'playing', 'paused', 'stopping'] }
+ ]
+ transitions = [
+ { 'trigger': 'load', 'source': 'initial', 'dest': 'loading'},
+ { 'trigger': 'fail', 'source': 'loading', 'dest': 'failed'},
+ { 'trigger': 'success', 'source': 'loading', 'dest': 'loaded_stopped'},
+ { 'trigger': 'start_playing', 'source': 'loaded_stopped', 'dest': 'loaded_playing'},
+ { 'trigger': 'pause', 'source': 'loaded_playing', 'dest': 'loaded_paused'},
+ { 'trigger': 'unpause', 'source': 'loaded_paused', 'dest': 'loaded_playing'},
+ { 'trigger': 'stop_playing', 'source': ['loaded_playing','loaded_paused'], 'dest': 'loaded_stopping'},
+ { 'trigger': 'stopped', 'source': 'loaded_stopping', 'dest': 'loaded_stopped'}
+ ]
+
+ Machine.__init__(self, states=states, transitions=transitions, initial='initial')
+
+ self.volume = 100
+ self.mapping = mapping