aboutsummaryrefslogtreecommitdiff
path: root/helpers/music_file.py
diff options
context:
space:
mode:
Diffstat (limited to 'helpers/music_file.py')
-rw-r--r--helpers/music_file.py48
1 files changed, 42 insertions, 6 deletions
diff --git a/helpers/music_file.py b/helpers/music_file.py
index 3053008..810bc22 100644
--- a/helpers/music_file.py
+++ b/helpers/music_file.py
@@ -10,6 +10,7 @@ import audioop
10from .lock import Lock 10from .lock import Lock
11from . import Config, gain, debug_print, error_print 11from . import Config, gain, debug_print, error_print
12from .mixer import Mixer 12from .mixer import Mixer
13from .music_effect import GainEffect
13 14
14file_lock = Lock("file") 15file_lock = Lock("file")
15 16
@@ -81,7 +82,7 @@ class MusicFile(Machine):
81 self.music_lock = Lock("music__" + filename) 82 self.music_lock = Lock("music__" + filename)
82 self.wait_event = threading.Event() 83 self.wait_event = threading.Event()
83 self.db_gain = 0 84 self.db_gain = 0
84 self.volume_factor = 1 85 self.gain_effects = []
85 86
86 threading.Thread(name="MSMusicLoad", target=self.load).start() 87 threading.Thread(name="MSMusicLoad", target=self.load).start()
87 88
@@ -134,7 +135,6 @@ class MusicFile(Machine):
134 self.current_audio_segment = self.audio_segment 135 self.current_audio_segment = self.audio_segment
135 self.current_frame = int(start_at * self.audio_segment.frame_rate) 136 self.current_frame = int(start_at * self.audio_segment.frame_rate)
136 if ms_fi > 0: 137 if ms_fi > 0:
137 # FIXME: apply it to repeated when looping?
138 self.a_s_with_effect = self \ 138 self.a_s_with_effect = self \
139 .current_audio_segment[ms : ms+ms_fi] \ 139 .current_audio_segment[ms : ms+ms_fi] \
140 .fade_in(ms_fi) 140 .fade_in(ms_fi)
@@ -213,7 +213,10 @@ class MusicFile(Machine):
213 nb_frames += end_i - start_i 213 nb_frames += end_i - start_i
214 self.current_frame += end_i - start_i 214 self.current_frame += end_i - start_i
215 215
216 data = audioop.mul(data, Config.sample_width, self.volume_factor) 216 # FIXME: self.effects_next_gain should take into account the loop number
217 volume_factor = self.volume_factor(self.effects_next_gain(nb_frames))
218
219 data = audioop.mul(data, Config.sample_width, volume_factor)
217 220
218 return [data, nb_frames] 221 return [data, nb_frames]
219 222
@@ -222,6 +225,7 @@ class MusicFile(Machine):
222 if not (self.is_loaded_playing() or self.is_loaded_paused()): 225 if not (self.is_loaded_playing() or self.is_loaded_paused()):
223 return 226 return
224 with self.music_lock: 227 with self.music_lock:
228 self.abandon_all_effects()
225 self.a_s_with_effect = None 229 self.a_s_with_effect = None
226 self.current_frame = max( 230 self.current_frame = max(
227 0, 231 0,
@@ -229,6 +233,28 @@ class MusicFile(Machine):
229 + int(value * self.audio_segment.frame_rate)) 233 + int(value * self.audio_segment.frame_rate))
230 # FIXME: si on fait un seek + delta, adapter le "loop" 234 # FIXME: si on fait un seek + delta, adapter le "loop"
231 235
236 def effects_next_gain(self, frame_count):
237 db_gain = 0
238 for gain_effect in self.gain_effects:
239 [new_gain, last_gain] = gain_effect.get_next_gain(
240 self.current_frame,
241 frame_count)
242 if last_gain:
243 self.set_gain(new_gain)
244 self.gain_effects.remove(gain_effect)
245 else:
246 db_gain += new_gain
247 return db_gain
248
249
250 def abandon_all_effects(self):
251 db_gain = 0
252 for gain_effect in self.gain_effects:
253 db_gain += gain_effect.get_last_gain()
254
255 self.gain_effects = []
256 self.set_gain(db_gain)
257
232 def stop(self, fade_out=0, wait=False): 258 def stop(self, fade_out=0, wait=False):
233 if self.is_loaded_playing(): 259 if self.is_loaded_playing():
234 ms = int(self.sound_position * 1000) 260 ms = int(self.sound_position * 1000)
@@ -245,19 +271,29 @@ class MusicFile(Machine):
245 self.stop_playing() 271 self.stop_playing()
246 self.stopped() 272 self.stopped()
247 273
274 def volume_factor(self, additional_gain):
275 return 10 ** ( (self.db_gain + additional_gain) / 20)
276
248 def set_gain(self, db_gain, absolute=False): 277 def set_gain(self, db_gain, absolute=False):
249 if absolute: 278 if absolute:
250 self.db_gain = db_gain 279 self.db_gain = db_gain
251 else: 280 else:
252 self.db_gain += db_gain 281 self.db_gain += db_gain
253 self.volume_factor = 10 ** (self.db_gain / 20)
254 282
255 def set_volume(self, value, delta=False): 283 def set_volume(self, value, delta=False, fade=0):
256 [db_gain, self.volume] = gain( 284 [db_gain, self.volume] = gain(
257 value + int(delta) * self.volume, 285 value + int(delta) * self.volume,
258 self.volume) 286 self.volume)
259 287
260 self.set_gain(db_gain) 288 if fade > 0:
289 self.gain_effects.append(GainEffect(
290 "fade",
291 self.current_audio_segment,
292 self.sound_position,
293 self.sound_position + fade,
294 gain=db_gain))
295 else:
296 self.set_gain(db_gain)
261 297
262 def wait_end(self): 298 def wait_end(self):
263 self.wait_event.clear() 299 self.wait_event.clear()