7 public class Jackpanel
: JackpanelBase
{
10 TransportButton to_start
;
11 TransportButton fast_backward
;
14 TransportButton fast_forward
;
16 float acceleration
= 1.0f
;
18 public bool initialized
{ get; set; }
20 protected override void on_transport_stopped () {
21 play
.set_active_no_signals (false);
24 protected override void on_transport_rolling () {
25 play
.set_active_no_signals (true);
28 private bool show_state () {
33 display
.realtime
= jack_is_realtime (client
) != 0;
35 display
.sample_rate
= jack_get_sample_rate (client
);
37 display
.buffer_size
= jack_get_buffer_size (client
);
39 display
.xruns
= no_xruns
;
41 // this one redraws the panel
47 Jackpanel (string client_name
) {
48 this
.client_name
= client_name
;
50 var table
= new
Table (5, 2, false);
51 display
= new
Display ();
52 display
.sample_rate_changed
+= (display
, new_rate
) => {
53 stderr
.printf ("TODO: New sample rate %u\n", (uint) new_rate
);
55 display
.buffer_size_changed
+= (display
, new_size
) => {
56 jack_set_buffer_size (client
, new_size
);
57 display
.buffer_size
= new_size
;
59 display
.toggle_realtime_requested
+= (display
, should_be_realtime
) => {
60 if (should_be_realtime
) {
61 stdout
.printf ("acquiring rt prio: not implemented\n");
63 stdout
.printf ("dropping rt prio: not implemented\n");
65 display
.realtime
= jack_is_realtime (client
) != 0;
67 display
.reset_xruns_requested
+= (display
) => {
71 to_start
= new
TransportButton (TransportButton
.IconType
.TO_START
);
74 to_start
.pressed
+= () => {
75 jack_transport_locate(client
, 0);
78 fast_backward
= new
TransportButton (TransportButton
.IconType
.FAST_BACKWARD
);
79 fast_backward
.height
= 20;
80 fast_backward
.width
= 31;
81 fast_backward
.pressed
+= () => {
82 wind_transport (-1.0f
);
84 Timeout
.add (200, () => {
85 accelerate_transport (fast_backward
, -1.0f
);
89 fast_backward
.released
+= () => {
93 play
= new
TransportButton (TransportButton
.IconType
.PLAY
);
96 play
.toggled
+= (button
, active
) => {
98 jack_transport_start (client
);
100 jack_transport_stop (client
);
104 stop
= new
TransportButton (TransportButton
.IconType
.STOP
);
107 stop
.pressed
+= () => {
108 jack_transport_stop (client
);
112 fast_forward
= new
TransportButton (TransportButton
.IconType
.FAST_FORWARD
);
113 fast_forward
.height
= 20;
114 fast_forward
.width
= 31;
115 fast_forward
.pressed
+= () => {
116 wind_transport (1.0f
);
118 Timeout
.add (200, () => {
119 accelerate_transport (fast_forward
, 1.0f
);
123 fast_forward
.released
+= () => {
128 table
.attach_defaults (display
, 0, 5, 0, 1);
130 table
.attach_defaults (to_start
, 0, 1, 1, 2);
131 table
.attach_defaults (fast_backward
, 1, 2, 1, 2);
132 table
.attach_defaults (fast_forward
, 2, 3, 1, 2);
133 table
.attach_defaults (stop
, 3, 4, 1, 2);
134 table
.attach_defaults (play
, 4, 5, 1, 2);
136 table
.set_col_spacing (0, 4);
137 table
.set_col_spacing (1, 4);
138 table
.set_col_spacing (2, 10);
139 table
.set_col_spacing (3, 4);
142 initialized
= initialize_jack ();
144 Timeout
.add (200, show_state
);
153 private void wind_transport (float direction
) {
154 jack_position_t pos
= jack_position_t ();
155 jack_transport_query(client
, ref pos
);
158 float location
= (((float) pos
.frame
/ pos
.frame_rate
) + direction
* acceleration
) * pos
.frame_rate
;
160 if (location
< 0.0f
) {
164 jack_transport_locate(client
, (jack_nframes_t
)location
);
167 private bool accelerate_transport (TransportButton button
, float direction
) {
169 if (acceleration
< 120.0f
) {
170 acceleration
*= 1.11f
;
173 wind_transport (direction
);
179 static int main (string[] args
) {
181 var window
= new Gtk
.Window (Gtk
.WindowType
.TOPLEVEL
);
182 var panel
= new
Jackpanel (Path
.get_basename(args
[0]));
184 window
.destroy
+= Gtk
.main_quit
;
187 if (panel
.initialized
) {
196 } //namespace Jackpanel