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 () {
22 play
.set_active_no_signals (false);
26 protected override void on_transport_rolling () {
28 play
.set_active_no_signals (true);
32 private bool show_state () {
37 display
.realtime
= jack_is_realtime (client
) != 0;
39 display
.sample_rate
= jack_get_sample_rate (client
);
41 display
.buffer_size
= jack_get_buffer_size (client
);
43 display
.xruns
= no_xruns
;
45 // this one redraws the panel
51 Jackpanel (string client_name
) {
52 this
.client_name
= client_name
;
54 var table
= new
Table (5, 2, false);
55 display
= new
Display ();
56 display
.sample_rate_changed
+= (display
, new_rate
) => {
57 config
.sample_rate
= (int)new_rate
;
60 display
.buffer_size_changed
+= (display
, new_size
) => {
61 jack_set_buffer_size (client
, new_size
);
62 display
.buffer_size
= new_size
;
63 config
.buffer_size
= (int)new_size
;
65 display
.toggle_realtime_requested
+= (display
, should_be_realtime
) => {
66 if (should_be_realtime
!= config
.realtime
) {
67 config
.realtime
= should_be_realtime
;
70 display
.realtime
= jack_is_realtime (client
) != 0;
72 display
.reset_xruns_requested
+= (display
) => {
76 to_start
= new
TransportButton (TransportButton
.IconType
.TO_START
);
79 to_start
.pressed
+= () => {
80 jack_transport_locate(client
, 0);
83 fast_backward
= new
TransportButton (TransportButton
.IconType
.FAST_BACKWARD
);
84 fast_backward
.height
= 20;
85 fast_backward
.width
= 31;
86 fast_backward
.pressed
+= () => {
87 wind_transport (-1.0f
);
89 Timeout
.add (200, () => {
90 accelerate_transport (fast_backward
, -1.0f
);
94 fast_backward
.released
+= () => {
98 play
= new
TransportButton (TransportButton
.IconType
.PLAY
);
101 play
.toggled
+= (button
, active
) => {
103 jack_transport_start (client
);
105 jack_transport_stop (client
);
109 stop
= new
TransportButton (TransportButton
.IconType
.STOP
);
112 stop
.pressed
+= () => {
113 jack_transport_stop (client
);
117 fast_forward
= new
TransportButton (TransportButton
.IconType
.FAST_FORWARD
);
118 fast_forward
.height
= 20;
119 fast_forward
.width
= 31;
120 fast_forward
.pressed
+= () => {
121 wind_transport (1.0f
);
123 Timeout
.add (200, () => {
124 accelerate_transport (fast_forward
, 1.0f
);
128 fast_forward
.released
+= () => {
133 table
.attach_defaults (display
, 0, 5, 0, 1);
135 table
.attach_defaults (to_start
, 0, 1, 1, 2);
136 table
.attach_defaults (fast_backward
, 1, 2, 1, 2);
137 table
.attach_defaults (fast_forward
, 2, 3, 1, 2);
138 table
.attach_defaults (stop
, 3, 4, 1, 2);
139 table
.attach_defaults (play
, 4, 5, 1, 2);
141 table
.set_col_spacing (0, 4);
142 table
.set_col_spacing (1, 4);
143 table
.set_col_spacing (2, 10);
144 table
.set_col_spacing (3, 4);
147 initialized
= initialize_jack ();
149 Timeout
.add (200, show_state
);
158 private void wind_transport (float direction
) {
159 jack_position_t pos
= jack_position_t ();
160 jack_transport_query(client
, ref pos
);
163 float location
= (((float) pos
.frame
/ pos
.frame_rate
) + direction
* acceleration
) * pos
.frame_rate
;
165 if (location
< 0.0f
) {
169 jack_transport_locate(client
, (jack_nframes_t
)location
);
172 private bool accelerate_transport (TransportButton button
, float direction
) {
174 if (acceleration
< 120.0f
) {
175 acceleration
*= 1.11f
;
178 wind_transport (direction
);
184 static int main (string[] args
) {
186 var window
= new Gtk
.Window (Gtk
.WindowType
.TOPLEVEL
);
187 var panel
= new
Jackpanel (Path
.get_basename(args
[0]));
189 window
.destroy
+= Gtk
.main_quit
;
192 if (panel
.initialized
) {
201 } //namespace Jackpanel