* open jackpanel as jackpanel-applet slave window
[jackpanel.git] / jackpanel / Jackpanel.vala
blobcff98a7faca37db110422179d14908b8f049a70f
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 protected override void on_transport_stopped () {
19 if (play.active) {
20 play.set_active_no_signals (false);
24 protected override void on_transport_rolling () {
25 if (!play.active) {
26 play.set_active_no_signals (true);
30 private bool show_state () {
31 if (client == null) {
32 return false;
35 display.realtime = jack_is_realtime (client) != 0;
37 display.sample_rate = jack_get_sample_rate (client);
39 display.buffer_size = jack_get_buffer_size (client);
41 display.xruns = no_xruns;
43 // this one redraws the panel
44 show_time (display);
46 return true;
49 public Jackpanel (string client_name) {
50 this.client_name = client_name;
52 var table = new Table (5, 2, false);
53 display = new Display ();
54 display.sample_rate_changed += (display, new_rate) => {
55 config.sample_rate = (int)new_rate;
56 restart_jack ();
58 display.buffer_size_changed += (display, new_size) => {
59 jack_set_buffer_size (client, new_size);
60 display.buffer_size = new_size;
61 config.buffer_size = (int)new_size;
63 display.toggle_realtime_requested += (display, should_be_realtime) => {
64 if (should_be_realtime != config.realtime) {
65 config.realtime = should_be_realtime;
66 restart_jack ();
68 display.realtime = jack_is_realtime (client) != 0;
70 display.reset_xruns_requested += (display) => {
71 no_xruns = 0;
74 to_start = new TransportButton (TransportButton.IconType.TO_START);
75 to_start.height = 20;
76 to_start.width = 31;
77 to_start.pressed += () => {
78 jack_transport_locate(client, 0);
81 fast_backward = new TransportButton (TransportButton.IconType.FAST_BACKWARD);
82 fast_backward.height = 20;
83 fast_backward.width = 31;
84 fast_backward.pressed += () => {
85 wind_transport (-1.0f);
87 Timeout.add (200, () => {
88 accelerate_transport (fast_backward, -1.0f);
89 });
92 fast_backward.released += () => {
93 acceleration = 1.0f;
96 play = new TransportButton (TransportButton.IconType.PLAY);
97 play.height = 20;
98 play.width = 31;
99 play.toggled += (button, active) => {
100 if (active) {
101 jack_transport_start (client);
102 } else {
103 jack_transport_stop (client);
107 stop = new TransportButton (TransportButton.IconType.STOP);
108 stop.height = 20;
109 stop.width = 31;
110 stop.pressed += () => {
111 jack_transport_stop (client);
112 play.active = false;
115 fast_forward = new TransportButton (TransportButton.IconType.FAST_FORWARD);
116 fast_forward.height = 20;
117 fast_forward.width = 31;
118 fast_forward.pressed += () => {
119 wind_transport (1.0f);
121 Timeout.add (200, () => {
122 accelerate_transport (fast_forward, 1.0f);
126 fast_forward.released += () => {
127 acceleration = 1.0f;
131 table.attach_defaults (display, 0, 5, 0, 1);
133 table.attach_defaults (to_start, 0, 1, 1, 2);
134 table.attach_defaults (fast_backward, 1, 2, 1, 2);
135 table.attach_defaults (fast_forward, 2, 3, 1, 2);
136 table.attach_defaults (stop, 3, 4, 1, 2);
137 table.attach_defaults (play, 4, 5, 1, 2);
139 table.set_col_spacing (0, 4);
140 table.set_col_spacing (1, 4);
141 table.set_col_spacing (2, 10);
142 table.set_col_spacing (3, 4);
144 add (table);
145 initialized = initialize_jack ();
146 if (initialized) {
147 Timeout.add (100, show_state);
151 ~Jackpanel () {
152 stop_jack_client ();
153 stop_jack ();
156 private void wind_transport (float direction) {
157 jack_position_t pos = jack_position_t ();
158 jack_transport_query(client, ref pos);
161 float location = (((float) pos.frame / pos.frame_rate) + direction * acceleration) * pos.frame_rate;
163 if (location < 0.0f) {
164 location = 0.0f;
167 jack_transport_locate(client, (jack_nframes_t)location);
170 private bool accelerate_transport (TransportButton button, float direction) {
171 if (button.active) {
172 if (acceleration < 120.0f) {
173 acceleration *= 1.11f;
176 wind_transport (direction);
177 return true;
179 return false;
183 } //namespace Jackpanel