2 #include "apatchgui.inc"
5 #include "automation.h"
7 #include "edlsession.h"
9 #include "floatautos.h"
11 #include "localsession.h"
14 #include "mwindowgui.h"
19 #include "trackcanvas.h"
24 APatchGUI::APatchGUI(MWindow *mwindow,
35 data_type = TRACK_AUDIO;
41 APatchGUI::~APatchGUI()
44 if(meter) delete meter;
48 int APatchGUI::create_objects()
53 int APatchGUI::reposition(int x, int y)
56 int y1 = PatchGUI::reposition(x, y);
58 if(fade) fade->reposition_window(fade->get_x(),
60 y1 += mwindow->theme->fade_h;
62 if(meter) meter->reposition_window(meter->get_x(),
65 y1 += mwindow->theme->meter_h;
67 if(pan) pan->reposition_window(pan->get_x(),
70 if(nudge) nudge->reposition_window(nudge->get_x(),
73 y1 += mwindow->theme->pan_h;
77 int APatchGUI::update(int x, int y)
79 int h = track->vertical_span(mwindow->theme);
81 int y1 = PatchGUI::update(x, y);
85 if(h - y1 < mwindow->theme->fade_h)
92 //printf("APatchGUI::update %f\n", fade->get_keyframe(mwindow, this)->value);
93 FloatAuto *previous = 0, *next = 0;
94 double unit_position = mwindow->edl->local_session->selectionstart;
95 unit_position = mwindow->edl->align_to_frame(unit_position, 0);
96 unit_position = atrack->to_units(unit_position, 0);
97 float value = atrack->automation->fade_autos->get_value(
103 // fade->update(fade->get_keyframe(mwindow, this)->value);
107 if(h - y1 >= mwindow->theme->fade_h)
109 patchbay->add_subwindow(fade = new AFadePatch(mwindow,
113 patchbay->get_w() - 10));
115 y1 += mwindow->theme->fade_h;
119 if(h - y1 < mwindow->theme->meter_h)
126 if(h - y1 >= mwindow->theme->meter_h)
128 patchbay->add_subwindow(meter = new AMeterPatch(mwindow,
133 y1 += mwindow->theme->meter_h;
138 if(h - y1 < mwindow->theme->pan_h)
147 if(pan->get_total_values() != mwindow->edl->session->audio_channels)
149 pan->change_channels(mwindow->edl->session->audio_channels,
150 mwindow->edl->session->achannel_positions);
154 int handle_x, handle_y;
155 PanAuto *previous = 0, *next = 0;
156 double unit_position = mwindow->edl->local_session->selectionstart;
157 unit_position = mwindow->edl->align_to_frame(unit_position, 0);
158 unit_position = atrack->to_units(unit_position, 0);
159 atrack->automation->pan_autos->get_handle(handle_x,
165 pan->update(handle_x, handle_y);
171 if(h - y1 >= mwindow->theme->pan_h)
173 patchbay->add_subwindow(pan = new APanPatch(mwindow,
177 x1 += pan->get_w() + 10;
178 patchbay->add_subwindow(nudge = new NudgePatch(mwindow,
182 patchbay->get_w() - x1 - 10));
184 y1 += mwindow->theme->pan_h;
189 void APatchGUI::synchronize_fade(float value_change)
191 if(fade && !change_source)
193 fade->update(fade->get_value() + value_change);
200 AFadePatch::AFadePatch(MWindow *mwindow, APatchGUI *patch, int x, int y, int w)
207 (float)MAX_AUDIO_FADE,
208 get_keyframe(mwindow, patch)->value)
210 //printf("AFadePatch::AFadePatch 1 %p %f\n", patch->track, get_keyframe(mwindow, patch)->value);
211 //printf("AFadePatch::AFadePatch 2 %f\n", ((FloatAuto*)patch->track->automation->fade_autos->first)->value);
212 this->mwindow = mwindow;
216 float AFadePatch::update_edl()
219 double position = mwindow->edl->local_session->selectionstart;
220 Autos *fade_autos = patch->atrack->automation->fade_autos;
221 int update_undo = !fade_autos->auto_exists_for_editing(position);
223 //printf("AFadePatch::update_edl 1 %d\n", update_undo);
225 mwindow->undo->update_undo_before(_("fade"), LOAD_AUTOMATION);
227 current = (FloatAuto*)fade_autos->get_auto_for_editing(position);
229 float result = get_value() - current->value;
230 current->value = get_value();
233 mwindow->undo->update_undo_after();
239 int AFadePatch::handle_event()
244 set_tooltip(get_caption());
247 patch->change_source = 1;
248 float change = update_edl();
249 if(patch->track->gang)
250 patch->patchbay->synchronize_faders(change, TRACK_AUDIO, patch->track);
251 patch->change_source = 0;
253 mwindow->sync_parameters(CHANGE_PARAMS);
255 if(mwindow->edl->session->auto_conf->fade)
257 mwindow->gui->canvas->draw_overlays();
258 mwindow->gui->canvas->flash();
263 FloatAuto* AFadePatch::get_keyframe(MWindow *mwindow, APatchGUI *patch)
266 double unit_position = mwindow->edl->local_session->selectionstart;
267 unit_position = mwindow->edl->align_to_frame(unit_position, 0);
268 unit_position = patch->atrack->to_units(unit_position, 0);
270 return (FloatAuto*)patch->atrack->automation->fade_autos->get_prev_auto(
277 APanPatch::APanPatch(MWindow *mwindow, APatchGUI *patch, int x, int y)
282 mwindow->edl->session->audio_channels,
283 mwindow->edl->session->achannel_positions,
284 get_keyframe(mwindow, patch)->handle_x,
285 get_keyframe(mwindow, patch)->handle_y,
286 get_keyframe(mwindow, patch)->values)
288 this->mwindow = mwindow;
293 int APanPatch::handle_event()
296 double position = mwindow->edl->local_session->selectionstart;
297 Autos *pan_autos = patch->atrack->automation->pan_autos;
298 int update_undo = !pan_autos->auto_exists_for_editing(position);
301 mwindow->undo->update_undo_before(_("pan"), LOAD_AUTOMATION);
303 current = (PanAuto*)pan_autos->get_auto_for_editing(position);
305 current->handle_x = get_stick_x();
306 current->handle_y = get_stick_y();
307 memcpy(current->values, get_values(), sizeof(float) * mwindow->edl->session->audio_channels);
310 mwindow->undo->update_undo_after();
312 mwindow->sync_parameters(CHANGE_PARAMS);
314 if(update_undo && mwindow->edl->session->auto_conf->pan)
316 mwindow->gui->canvas->draw_overlays();
317 mwindow->gui->canvas->flash();
322 PanAuto* APanPatch::get_keyframe(MWindow *mwindow, APatchGUI *patch)
325 double unit_position = mwindow->edl->local_session->selectionstart;
326 unit_position = mwindow->edl->align_to_frame(unit_position, 0);
327 unit_position = patch->atrack->to_units(unit_position, 0);
329 return (PanAuto*)patch->atrack->automation->pan_autos->get_prev_auto(
338 AMeterPatch::AMeterPatch(MWindow *mwindow, APatchGUI *patch, int x, int y)
342 patch->patchbay->get_w() - 10,
343 mwindow->edl->session->min_meter_db,
344 mwindow->edl->session->max_meter_db,
345 mwindow->edl->session->meter_format,
350 this->mwindow = mwindow;
354 int AMeterPatch::button_press_event()
356 if(cursor_inside() && is_event_win() && get_buttonpress() == 1)
358 mwindow->reset_meters();