* wscript: require vala 0.5.8
[jackpanel.git] / jackpanel / Jackpanel.vala
blobc36c3607afbaa31c5d8bbd8d12210268d2b37032
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 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 () {
29 if (client == null) {
30 return false;
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
42 show_time (display);
44 return true;
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");
62 } else {
63 stdout.printf ("dropping rt prio: not implemented\n");
65 display.realtime = jack_is_realtime (client) != 0;
67 display.reset_xruns_requested += (display) => {
68 no_xruns = 0;
71 to_start = new TransportButton (TransportButton.IconType.TO_START);
72 to_start.height = 20;
73 to_start.width = 31;
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);
86 });
89 fast_backward.released += () => {
90 acceleration = 1.0f;
93 play = new TransportButton (TransportButton.IconType.PLAY);
94 play.height = 20;
95 play.width = 31;
96 play.toggled += (button, active) => {
97 if (active) {
98 jack_transport_start (client);
99 } else {
100 jack_transport_stop (client);
104 stop = new TransportButton (TransportButton.IconType.STOP);
105 stop.height = 20;
106 stop.width = 31;
107 stop.pressed += () => {
108 jack_transport_stop (client);
109 play.active = false;
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 += () => {
124 acceleration = 1.0f;
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);
141 add (table);
142 initialized = initialize_jack ();
143 if (initialized) {
144 Timeout.add (200, show_state);
148 ~Jackpanel () {
149 stop_jack_client ();
150 stop_jack ();
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) {
161 location = 0.0f;
164 jack_transport_locate(client, (jack_nframes_t)location);
167 private bool accelerate_transport (TransportButton button, float direction) {
168 if (button.active) {
169 if (acceleration < 120.0f) {
170 acceleration *= 1.11f;
173 wind_transport (direction);
174 return true;
176 return false;
179 static int main (string[] args) {
180 Gtk.init (ref args);
181 var window = new Gtk.Window (Gtk.WindowType.TOPLEVEL);
182 var panel = new Jackpanel (Path.get_basename(args[0]));
183 window.add (panel);
184 window.destroy += Gtk.main_quit;
185 window.show_all ();
187 if (panel.initialized) {
188 Gtk.main ();
189 return 0;
190 } else {
191 return 1;
196 } //namespace Jackpanel