* Jackpanel: realtime toggle, sample rate change and buffer size change now work...
[jackpanel.git] / jackpanel / Jackpanel.vala
blob06d5c0a5811336c50c2cc0b7f91403484d5d0f28
1 using Gtk;
2 using Gdk;
3 using Prolooks;
5 namespace Jackpanel {
7 public class Jackpanel : JackpanelBase {
8 // widgets
9 Display display;
10 TransportButton to_start;
11 TransportButton fast_backward;
12 TransportButton play;
13 TransportButton stop;
14 TransportButton fast_forward;
16 float acceleration = 1.0f;
18 public bool initialized { get; set; }
20 protected override void on_transport_stopped () {
21 if (play.active) {
22 play.set_active_no_signals (false);
26 protected override void on_transport_rolling () {
27 if (!play.active) {
28 play.set_active_no_signals (true);
32 private bool show_state () {
33 if (client == null) {
34 return false;
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
46 show_time (display);
48 return true;
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;
58 restart_jack ();
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;
68 restart_jack ();
70 display.realtime = jack_is_realtime (client) != 0;
72 display.reset_xruns_requested += (display) => {
73 no_xruns = 0;
76 to_start = new TransportButton (TransportButton.IconType.TO_START);
77 to_start.height = 20;
78 to_start.width = 31;
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);
91 });
94 fast_backward.released += () => {
95 acceleration = 1.0f;
98 play = new TransportButton (TransportButton.IconType.PLAY);
99 play.height = 20;
100 play.width = 31;
101 play.toggled += (button, active) => {
102 if (active) {
103 jack_transport_start (client);
104 } else {
105 jack_transport_stop (client);
109 stop = new TransportButton (TransportButton.IconType.STOP);
110 stop.height = 20;
111 stop.width = 31;
112 stop.pressed += () => {
113 jack_transport_stop (client);
114 play.active = false;
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 += () => {
129 acceleration = 1.0f;
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);
146 add (table);
147 initialized = initialize_jack ();
148 if (initialized) {
149 Timeout.add (200, show_state);
153 ~Jackpanel () {
154 stop_jack_client ();
155 stop_jack ();
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) {
166 location = 0.0f;
169 jack_transport_locate(client, (jack_nframes_t)location);
172 private bool accelerate_transport (TransportButton button, float direction) {
173 if (button.active) {
174 if (acceleration < 120.0f) {
175 acceleration *= 1.11f;
178 wind_transport (direction);
179 return true;
181 return false;
184 static int main (string[] args) {
185 Gtk.init (ref args);
186 var window = new Gtk.Window (Gtk.WindowType.TOPLEVEL);
187 var panel = new Jackpanel (Path.get_basename(args[0]));
188 window.add (panel);
189 window.destroy += Gtk.main_quit;
190 window.show_all ();
192 if (panel.initialized) {
193 Gtk.main ();
194 return 0;
195 } else {
196 return 1;
201 } //namespace Jackpanel