]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/commitdiff
Add loop option for play
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Thu, 14 Jul 2016 21:44:25 +0000 (23:44 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Thu, 14 Jul 2016 21:44:25 +0000 (23:44 +0200)
helpers/action.py
helpers/music_file.py

index 3dc1b8daf396f1316049b2d707ed2f47316d551e..792b123cd2676c37bca6c72f2c7905aaf06b6578 100644 (file)
@@ -64,15 +64,17 @@ class Action:
                 music.unpause()
 
     def play(self, music = None, fade_in = 0, start_at = 0,
-            restart_if_running = False, volume = 100, **kwargs):
+            restart_if_running = False, volume = 100,
+            loop = 0,
+            **kwargs):
         if music is not None:
             if restart_if_running:
                 if music.is_not_stopped():
                     music.stop()
-                music.play(volume = volume, fade_in = fade_in, start_at = start_at)
+                music.play(volume = volume, fade_in = fade_in, start_at = start_at, loop = loop)
             else:
                 if not music.is_not_stopped():
-                    music.play(volume = volume, fade_in = fade_in, start_at = start_at)
+                    music.play(volume = volume, fade_in = fade_in, start_at = start_at, loop = loop)
 
     def seek(self, music = None, value = 0, delta = False, **kwargs):
         for music in self.music_list(music):
@@ -124,7 +126,7 @@ class Action:
             return "unpausing all musics"
 
     def play_print(self, music = None, fade_in = 0, start_at = 0,
-            restart_if_running = False, volume = 100, **kwargs):
+            restart_if_running = False, volume = 100, loop = 0, **kwargs):
         message = "starting "
         if music is not None:
             message += "« {} »".format(music.name)
@@ -139,6 +141,11 @@ class Action:
 
         message += " at volume {}%".format(volume)
 
+        if loop > 0:
+            message += " {} times".format(loop + 1)
+        elif loop < 0:
+            message += " in loop"
+
         if restart_if_running:
             message += " (restarting if already running)"
 
index 32869b6891aed831a8b2768016aedf3a83a7fe45..0bfb1eca8e2d29b1b84c3ef7ae693ff8d05826ef 100644 (file)
@@ -78,19 +78,21 @@ class MusicFile(Machine):
         else:
             return 0
 
-    def play(self, fade_in = 0, volume = 100, start_at = 0):
+    def play(self, fade_in = 0, volume = 100, loop = 0, start_at = 0):
         db_gain = gain(volume) + self.mapping.master_gain
         self.volume = volume
+        self.loop = loop
 
         ms = int(start_at * 1000)
         ms_fi = max(1, int(fade_in * 1000))
         with self.music_lock:
             self.current_audio_segment = (self.audio_segment + db_gain).fade(from_gain=-120, duration=ms_fi, start=ms)
-        self.before_loaded_playing(initial_frame = int(start_at * self.audio_segment.frame_rate))
+        self.initial_frame = int(start_at * self.audio_segment.frame_rate)
+        self.before_loaded_playing()
         self.start_playing()
 
-    def before_loaded_playing(self, initial_frame = 0):
-        self.current_frame = initial_frame
+    def before_loaded_playing(self):
+        self.current_frame = self.initial_frame
         with self.music_lock:
             segment = self.current_audio_segment
 
@@ -125,7 +127,11 @@ class MusicFile(Machine):
                                 )
             self.current_frame += frame_count
             if len(audio_segment) == 0:
-                raise sd.CallbackStop
+                if self.is_loaded_playing() and self.loop != 0:
+                    self.loop -= 1
+                    self.current_frame = self.initial_frame
+                else:
+                    raise sd.CallbackStop
 
             out_data[:] = audio_segment.ljust(len(out_data), b'\0')