From bdc926f4a2d3d45785070f07b1530ac35b542845 Mon Sep 17 00:00:00 2001 From: Nikolay Nikolov Date: Sun, 5 Jan 2025 16:33:40 +0200 Subject: [PATCH] + added libjack example program showtime.pp (translated from showtime.c) --- packages/libjack/examples/showtime.pp | 106 ++++++++++++++++++++++++++ packages/libjack/fpmake.pp | 1 + 2 files changed, 107 insertions(+) create mode 100644 packages/libjack/examples/showtime.pp diff --git a/packages/libjack/examples/showtime.pp b/packages/libjack/examples/showtime.pp new file mode 100644 index 0000000000..74967a1e52 --- /dev/null +++ b/packages/libjack/examples/showtime.pp @@ -0,0 +1,106 @@ +program showtime; + +{$MODE objfpc}{$H+} + +uses + Jack, CTypes, SysUtils, BaseUnix; + +var + client: Pjack_client_t; + +procedure showtime; +var + current: jack_position_t; + transport_state: jack_transport_state_t; + frame_time: jack_nframes_t; +begin + transport_state := jack_transport_query (client, @current); + frame_time := jack_frame_time (client); + + Write('frame: ', current.frame:7, ' @ ', frame_time, #9); + + case transport_state of + JackTransportStopped: + Write ('state: Stopped'); + JackTransportRolling: + Write ('state: Rolling'); + JackTransportStarting: + Write ('state: Starting'); + else + Write ('state: [unknown]'); + end; + + if (Ord(current.valid) and Ord(JackPositionBBT)) <> 0 then + Write (#9'BBT: ', current.bar:3, '|', current.beat, '|', current.tick:4); + + if (Ord(current.valid) and Ord(JackPositionTimecode)) <> 0 then + Write (#9'TC: (', current.frame_time:0:6, ', ', current.next_time:0:6, ')'); + + if (Ord(current.valid) and Ord(JackBBTFrameOffset)) <> 0 then + Write (#9'BBT offset: (', current.bbt_offset, ')'); + + if (Ord(current.valid) and Ord(JackAudioVideoRatio)) <> 0 then + Write (#9'audio/video: (', current.audio_frames_per_video_frame:0:12, ')'); + + if (Ord(current.valid) and Ord(JackVideoFrameOffset)) <> 0 then + begin + if current.video_offset <> 0 then + Write (#9' video@: (', current.video_offset, ')') + else + Write(#9' no video'); + end; + + Writeln; +end; + +procedure jack_shutdown (arg: Pointer); cdecl; +begin + Halt (1); +end; + +procedure signal_handler (sig: cint); cdecl; +begin + jack_client_close (client); + Writeln (StdErr, 'signal received, exiting ...'); + Halt (0); +end; + +begin + { try to become a client of the JACK server } + + client := jack_client_open ('showtime', JackNullOption, nil); + if client = nil then + begin + Writeln (StdErr, 'jack server not running?'); + Halt(1); + end; + + fpsignal (SIGQUIT, @signal_handler); + fpsignal (SIGTERM, @signal_handler); + fpsignal (SIGHUP, @signal_handler); + fpsignal (SIGINT, @signal_handler); + + { tell the JACK server to call `jack_shutdown()' if + it ever shuts down, either entirely, or if it + just decides to stop calling us. + } + + jack_on_shutdown (client, @jack_shutdown, nil); + + { tell the JACK server that we are ready to roll } + + if jack_activate (client) <> 0 then + begin + Writeln (StdErr, 'cannot activate client'); + Halt(1); + end; + + repeat + sleep (1); + showtime; + until False; + + jack_client_close (client); + Halt (0); +end. + diff --git a/packages/libjack/fpmake.pp b/packages/libjack/fpmake.pp index d5c6c65a7c..1dfca879e5 100644 --- a/packages/libjack/fpmake.pp +++ b/packages/libjack/fpmake.pp @@ -49,6 +49,7 @@ begin P.Targets.AddExampleProgram('latent_client.pp'); P.Targets.AddExampleProgram('transport_client.pp'); P.Targets.AddExampleProgram('impulse_grabber.pp'); + P.Targets.AddExampleProgram('showtime.pp'); P.NamespaceMap:='namespaces.lst';