diff options
Diffstat (limited to 'helpers/music_file.py')
-rw-r--r-- | helpers/music_file.py | 48 |
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 | |||
10 | from .lock import Lock | 10 | from .lock import Lock |
11 | from . import Config, gain, debug_print, error_print | 11 | from . import Config, gain, debug_print, error_print |
12 | from .mixer import Mixer | 12 | from .mixer import Mixer |
13 | from .music_effect import GainEffect | ||
13 | 14 | ||
14 | file_lock = Lock("file") | 15 | file_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() |