1 /*
2 Copyright (C) 2006-2007 Remon Sijrier
3 
4 This file is part of Traverso
5 
6 Traverso is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
19 
20 */
21 
22 
23 #include "Fade.h"
24 
25 #include "Curve.h"
26 #include "AudioClip.h"
27 #include "ContextPointer.h"
28 #include <ViewPort.h>
29 #include <FadeCurve.h>
30 #include <FadeView.h>
31 #include <Peak.h>
32 #include <Sheet.h>
33 #include "Project.h"
34 #include "ProjectManager.h"
35 
36 // Always put me below _all_ includes, this is needed
37 // in case we run with memory leak detection enabled!
38 #include "Debugger.h"
39 
40 static const float CURSOR_SPEED		= 150.0;
41 static const float RASTER_SIZE		= 0.05;
42 
43 
FadeRange(AudioClip * clip,FadeCurve * curve,qint64 scalefactor)44 FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, qint64 scalefactor)
45 	: Command(clip, "")
46 	, d(new Private())
47 {
48 	m_curve = curve;
49 	d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
50 	d->scalefactor = scalefactor;
51 	setText( (d->direction == 1) ? tr("Fade In: length") : tr("Fade Out: length"));
52 }
53 
54 
FadeRange(AudioClip * clip,FadeCurve * curve,double newRange)55 FadeRange::FadeRange(AudioClip* clip, FadeCurve* curve, double newRange)
56 	: Command(clip, "")
57 	, d(new Private())
58 {
59 	m_curve = curve;
60 	d->direction = (m_curve->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
61 	m_origRange = m_curve->get_range();
62 	m_newRange = newRange;
63 	setText( (d->direction == 1) ? tr("Fade In: remove") : tr("Fade Out: remove"));
64 }
65 
66 
~FadeRange()67 FadeRange::~FadeRange()
68 {}
69 
prepare_actions()70 int FadeRange::prepare_actions()
71 {
72 	return 1;
73 }
74 
begin_hold()75 int FadeRange::begin_hold()
76 {
77 	d->origX = cpointer().on_first_input_event_x();
78 	m_newRange = m_origRange = m_curve->get_range();
79 	return 1;
80 }
81 
82 
finish_hold()83 int FadeRange::finish_hold()
84 {
85 	QCursor::setPos(d->mousePos);
86 	delete d;
87 	return 1;
88 }
89 
90 
do_action()91 int FadeRange::do_action()
92 {
93 	m_curve->set_range( m_newRange );
94 	return 1;
95 }
96 
97 
undo_action()98 int FadeRange::undo_action()
99 {
100 	m_curve->set_range( m_origRange );
101 	return 1;
102 }
103 
104 
cancel_action()105 void FadeRange::cancel_action()
106 {
107 	finish_hold();
108 	undo_action();
109 }
110 
set_cursor_shape(int useX,int useY)111 void FadeRange::set_cursor_shape(int useX, int useY)
112 {
113 	Q_UNUSED(useX);
114 	Q_UNUSED(useY);
115 
116 	d->mousePos = QCursor::pos();
117 
118 	cpointer().get_viewport()->set_holdcursor(":/cursorHoldLr");
119 }
120 
121 
jog()122 int FadeRange::jog()
123 {
124 	int dx = (d->origX - (cpointer().x()) ) * d->direction;
125 	m_newRange = m_origRange - ( dx * d->scalefactor);
126 
127 	if (m_newRange < 1) {
128 		m_newRange = 1;
129 	}
130 
131 	m_curve->set_range( m_newRange );
132 
133 	TimeRef location = TimeRef(m_newRange);
134 	cpointer().get_viewport()->set_holdcursor_text(timeref_to_ms_3(location));
135 
136 	return 1;
137 }
138 
139 
round_float(float f)140 static float round_float( float f)
141 {
142 	return float(int(0.5 + f / RASTER_SIZE)) * RASTER_SIZE;
143 }
144 
145 /********** FadeBend **********/
146 /******************************/
147 
FadeBend(FadeView * fadeview)148 FadeBend::FadeBend(FadeView * fadeview)
149 	: Command(fadeview->get_fade())
150 	, m_fade(fadeview->get_fade())
151 	, m_fv(fadeview)
152 {
153 	setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend"));
154 }
155 
FadeBend(FadeCurve * fade,double val)156 FadeBend::FadeBend(FadeCurve *fade, double val)
157 	: Command(fade)
158 	, m_fade(fade)
159 	, m_fv(0)
160 {
161 	setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: bend") : tr("Fade Out: bend"));
162 	origBend = m_fade->get_bend_factor();
163 	newBend = val;
164 }
165 
begin_hold()166 int FadeBend::begin_hold()
167 {
168 	PENTER;
169 	origY = cpointer().on_first_input_event_y();
170 	oldValue = m_fade->get_bend_factor();
171 	newBend = origBend = oldValue;
172 	m_fv->set_holding(true);
173 	return 1;
174 }
175 
finish_hold()176 int FadeBend::finish_hold()
177 {
178 	QCursor::setPos(mousePos);
179 	m_fv->set_holding(false);
180 	return 1;
181 }
182 
prepare_actions()183 int FadeBend::prepare_actions()
184 {
185 	return 1;
186 }
187 
do_action()188 int FadeBend::do_action()
189 {
190 	m_fade->set_bend_factor(newBend);
191 	return 1;
192 }
193 
undo_action()194 int FadeBend::undo_action()
195 {
196 	m_fade->set_bend_factor(origBend);
197 	return 1;
198 }
199 
cancel_action()200 void FadeBend::cancel_action()
201 {
202 	finish_hold();
203 	undo_action();
204 }
205 
set_cursor_shape(int useX,int useY)206 void FadeBend::set_cursor_shape(int useX, int useY)
207 {
208 	Q_UNUSED(useX);
209 	Q_UNUSED(useY);
210 
211 	mousePos = QCursor::pos();
212 	cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd");
213 }
214 
jog()215 int FadeBend::jog()
216 {
217 	int direction = (m_fade->get_fade_type() == FadeCurve::FadeIn) ? 1 : -1;
218 
219 	float dx = (float(origY - cpointer().y()) / CURSOR_SPEED);
220 
221 	if (m_fade->get_raster()) {
222 		float value = round_float(oldValue + dx * direction);
223 		m_fade->set_bend_factor(value);
224 	} else {
225 		m_fade->set_bend_factor(oldValue + dx * direction);
226 	}
227 
228 	oldValue = m_fade->get_bend_factor();
229 	newBend = oldValue;
230 	cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newBend, 'f', 2));
231 
232 	origY = cpointer().y();
233 
234 	return 1;
235 }
236 
237 /********** FadeStrength **********/
238 /******************************/
239 
FadeStrength(FadeView * fadeview)240 FadeStrength::FadeStrength(FadeView* fadeview)
241 	: Command(fadeview->get_fade())
242 	, m_fade(fadeview->get_fade())
243 	, m_fv(fadeview)
244 {
245 	setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength"));
246 }
247 
FadeStrength(FadeCurve * fade,double val)248 FadeStrength::FadeStrength(FadeCurve *fade, double val)
249 	: Command(fade)
250 	, m_fade(fade)
251 	, m_fv(0)
252 {
253 	setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: strength") : tr("Fade Out: strength"));
254 	origStrength = m_fade->get_strength_factor();
255 	newStrength = val;
256 }
257 
begin_hold()258 int FadeStrength::begin_hold()
259 {
260 	PENTER;
261 	origY = cpointer().on_first_input_event_y();
262 	oldValue = m_fade->get_strength_factor();
263 	newStrength = origStrength = oldValue;
264 	m_fv->set_holding(true);
265 	return 1;
266 }
267 
finish_hold()268 int FadeStrength::finish_hold()
269 {
270 	QCursor::setPos(mousePos);
271 	m_fv->set_holding(false);
272 	return 1;
273 }
274 
prepare_actions()275 int FadeStrength::prepare_actions()
276 {
277 	return 1;
278 }
279 
do_action()280 int FadeStrength::do_action()
281 {
282 	m_fade->set_strength_factor(newStrength);
283 	return 1;
284 }
285 
undo_action()286 int FadeStrength::undo_action()
287 {
288 	m_fade->set_strength_factor(origStrength);
289 	return 1;
290 }
291 
cancel_action()292 void FadeStrength::cancel_action()
293 {
294 	finish_hold();
295 	undo_action();
296 }
297 
set_cursor_shape(int useX,int useY)298 void FadeStrength::set_cursor_shape(int useX, int useY)
299 {
300 	Q_UNUSED(useX);
301 	Q_UNUSED(useY);
302 
303 	mousePos = QCursor::pos();
304 	cpointer().get_viewport()->set_holdcursor(":/cursorHoldUd");
305 }
306 
jog()307 int FadeStrength::jog()
308 {
309 	float dy = float(origY - cpointer().y()) / CURSOR_SPEED;
310 
311 	if (m_fade->get_bend_factor() >= 0.5) {
312 		m_fade->set_strength_factor(oldValue + dy );
313 	} else {
314 		if (m_fade->get_raster()) {
315 			float value = round_float(oldValue + dy);
316 			m_fade->set_strength_factor(value);
317 		} else {
318 			m_fade->set_strength_factor(oldValue - dy);
319 		}
320 	}
321 
322 	oldValue = m_fade->get_strength_factor();
323 	newStrength = oldValue;
324 	cpointer().get_viewport()->set_holdcursor_text(QByteArray::number(newStrength, 'f', 2));
325 
326 	origY = cpointer().y();
327 
328 	return 1;
329 }
330 
331 
332 /********** FadeMode **********/
333 /******************************/
334 
FadeMode(FadeCurve * fade,int oldMode,int newMode)335 FadeMode::FadeMode(FadeCurve* fade, int oldMode, int newMode)
336 	: Command(fade)
337 	, m_fade(fade)
338 {
339 	setText( (m_fade->get_fade_type() == FadeCurve::FadeIn) ? tr("Fade In: shape") : tr("Fade Out: shape"));
340 
341 	m_newMode = newMode;
342 	m_oldMode = oldMode;
343 }
344 
prepare_actions()345 int FadeMode::prepare_actions()
346 {
347 	return 1;
348 }
349 
do_action()350 int FadeMode::do_action()
351 {
352 	m_fade->set_mode(m_newMode);
353 	return 1;
354 }
355 
undo_action()356 int FadeMode::undo_action()
357 {
358 	m_fade->set_mode(m_oldMode);
359 	return 1;
360 }
361 
362