Skip to content

Commit 853125d

Browse files
committed
generalize fade function, add show fade out support
1 parent 3ab3ed1 commit 853125d

3 files changed

Lines changed: 58 additions & 29 deletions

File tree

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.3.0-20250525
1+
5.3.0-20250531

obplayer/player/outputs.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ def add_inter_tap(self, name):
6262
class ObAudioMixerBin(ObOutputBin):
6363
def __init__(self):
6464

65-
self.main_fade_thread = None
65+
self.fade_threads = {}
66+
self.fade_threads_cancel = {}
6667

6768
# silent input section
6869
silent_pipeline_str = """
@@ -164,17 +165,22 @@ def alert_off(self):
164165
)
165166
self.pipeline_main.get_state(Gst.CLOCK_TIME_NONE)
166167

167-
def main_fade(self, arguments):
168-
# print("main_fade: " + str(arguments))
168+
def fade(self, arguments):
169169

170-
volume_element = self.pipeline_main.get_by_name("channel-main-volume")
170+
volume_element_name = arguments["element"]
171+
172+
if(volume_element_name not in self.fade_threads):
173+
self.fade_threads[volume_element_name] = None
174+
self.fade_threads_cancel[volume_element_name] = False
175+
176+
volume_element = self.pipeline_main.get_by_name(volume_element_name)
171177
current_volume = volume_element.get_property("volume")
172178
target_volume = arguments["volume"]
173179
fade_time = arguments["time"]
174180
fade_run_per_second = 20
175181

176182
obplayer.Log.log(
177-
"main fade from "
183+
volume_element_name + " fade from "
178184
+ str(round(current_volume * 100))
179185
+ "% to "
180186
+ str(round(target_volume * 100))
@@ -201,12 +207,12 @@ def main_fade(self, arguments):
201207
mode = "out"
202208

203209
def run():
204-
self.main_fade_cancel = False
210+
self.fade_threads_cancel[volume_element] = False
205211
current_volume = volume_element.get_property("volume")
206212

207213
while True:
208214
if (
209-
self.main_fade_cancel
215+
self.fade_threads_cancel[volume_element]
210216
or (mode == "in" and current_volume >= target_volume)
211217
or (mode == "out" and current_volume <= target_volume)
212218
):
@@ -224,13 +230,13 @@ def run():
224230
time.sleep(1 / fade_run_per_second)
225231

226232
# cancel any existing run
227-
if self.main_fade_thread is not None:
228-
self.main_fade_cancel = True
229-
self.main_fade_thread.join()
230-
self.made_fade_thread = None
233+
if self.fade_threads[volume_element_name] is not None:
234+
self.fade_threads_cancel[volume_element] = True
235+
self.fade_threads[volume_element_name].join()
236+
self.fade_threads[volume_element_name] = None
231237

232-
self.main_fade_thread = threading.Thread(target=run)
233-
self.main_fade_thread.start()
238+
self.fade_threads[volume_element_name] = threading.Thread(target=run)
239+
self.fade_threads[volume_element_name].start()
234240

235241
def execute_instruction(self, instruction, arguments):
236242
obplayer.Log.log("mixer received instruction " + instruction, "debug")
@@ -246,11 +252,14 @@ def execute_instruction(self, instruction, arguments):
246252
)
247253
print(self.pipeline_main.get_by_name("mixer-prealert-volume").get_property("volume"))
248254
elif instruction == "voicetrack_on":
249-
self.main_fade({"volume": arguments["volume"], "time": arguments["fade"]})
255+
self.fade({"volume": arguments["volume"], "time": arguments["fade"], "element": "channel-main-volume"})
250256
elif instruction == "voicetrack_off":
251-
self.main_fade({"volume": 1.0, "time": arguments["fade"]})
257+
self.fade({"volume": 1.0, "time": arguments["fade"], "element": "channel-main-volume"})
252258
elif instruction == "main_fade":
253-
self.main_fade(arguments)
259+
arguments['element'] = "channel-main-volume"
260+
self.fade(arguments)
261+
elif instruction == "primary_on":
262+
self.fade({"volume": 1.0, "time": 0.0, "element": "mixer-primary-volume"})
254263
else:
255264
print("unknown mixer instruction: " + instruction)
256265

obplayer/scheduler/scheduler.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def __init__(self):
146146
self.media_start_time = 0
147147
self.now_playing = None
148148
self.next_media_update = 0
149+
self.fadeout = False
149150

150151
self.show_data = None
151152
self.playlist = None
@@ -351,6 +352,7 @@ def play_media(self, media, offset, present_time):
351352
self.end_time()
352353
and self.media_start_time + media["duration"] > self.end_time()
353354
):
355+
self.fadeout = True
354356
self.ctrl.add_request(
355357
start_time=self.media_start_time,
356358
end_time=self.end_time(),
@@ -362,8 +364,10 @@ def play_media(self, media, offset, present_time):
362364
order_num=media["order_num"],
363365
artist=media["artist"],
364366
title=media["title"],
367+
mixerend=['primary_on', {}], # restore the mixer from fade-out when the track stops
365368
)
366369
else:
370+
self.fadeout = False
367371
self.ctrl.add_request(
368372
start_time=self.media_start_time,
369373
media_type=media["media_type"],
@@ -566,6 +570,10 @@ def __init__(self, first_sync=False):
566570
self.lock = threading.Lock()
567571
self.first_sync = first_sync
568572

573+
self.showfade_ctrl = obplayer.Player.create_controller(
574+
"showfade", priority=50, default_play_mode="overlap", allow_overlay=True
575+
)
576+
569577
self.voicetrack_ctrl = obplayer.Player.create_controller(
570578
"voicetrack", priority=50, default_play_mode="overlap", allow_overlay=True
571579
)
@@ -579,30 +587,42 @@ def __init__(self, first_sync=False):
579587

580588
self.voicetrack_ctrl.set_request_callback(self.do_voicetrack_request)
581589
self.voicetrack_ctrl.set_update_callback(self.do_voicetrack_update)
590+
591+
self.showfade_duration = float(obplayer.Config.setting("fade_duration", 5))
592+
self.showfade_ctrl.set_request_callback(self.do_showfade_request)
593+
self.showfade_ctrl.set_update_callback(self.do_showfade_update)
582594

583595
self.present_show = None
584596
self.next_show_update = 0
585597

586-
# initial request?
598+
def do_showfade_request(self, ctrl, present_time, media_class):
599+
self.do_showfade_update(ctrl, present_time)
600+
601+
def do_showfade_update(self, ctrl, present_time):
602+
self.showfade_ctrl.set_next_update(present_time + 0.25)
603+
if self.present_show and type(self.present_show) is ObShow and self.present_show.fadeout:
604+
ending_in = self.present_show.end_time() - present_time
605+
fade_duration = self.showfade_duration # adding 0.25 to account for this only being called every 0.25, so we might be late
606+
607+
if(ending_in <= (fade_duration + 0.25)):
608+
obplayer.Player.outputs["mixer"].fade(
609+
{
610+
"element": "mixer-primary-volume",
611+
"volume": 0.0,
612+
"time": self.showfade_duration
613+
}
614+
)
615+
616+
self.present_show.fadeout = False
617+
587618
def do_voicetrack_request(self, ctrl, present_time, media_class):
588619
self.do_voicetrack_update(ctrl, present_time)
589620

590-
# update request after initial?
591621
def do_voicetrack_update(self, ctrl, present_time):
592622
self.voicetrack_ctrl.set_next_update(present_time + 0.25)
593623
if self.present_show:
594624
self.present_show.play_current_voicetrack(present_time)
595625

596-
# self.check_show(present_time)
597-
598-
# if self.present_show is not None:
599-
# self.present_show.play_next_voicetrack(present_time)
600-
601-
# self.set_voicetrack_update(present_time)
602-
603-
def set_voicetrack_update(self, present_time):
604-
self.voicetrack_ctrl.set_next_update(present_time + 0.25)
605-
606626
def do_player_request(self, ctrl, present_time, media_class):
607627
self.check_show(present_time)
608628

0 commit comments

Comments
 (0)