Merge lp:~ezod/mixxx/hamster into lp:~mixxxdevelopers/mixxx/trunk

Proposed by Aaron Mavrinac
Status: Merged
Approved by: RJ Skerry-Ryan
Approved revision: 3293
Merged at revision: 3296
Proposed branch: lp:~ezod/mixxx/hamster
Merge into: lp:~mixxxdevelopers/mixxx/trunk
Diff against target: 246 lines (+51/-26)
8 files modified
mixxx/src/dlgprefcrossfader.cpp (+21/-20)
mixxx/src/dlgprefcrossfader.h (+1/-0)
mixxx/src/dlgprefcrossfaderdlg.ui (+13/-0)
mixxx/src/engine/enginemaster.cpp (+6/-2)
mixxx/src/engine/enginemaster.h (+1/-1)
mixxx/src/engine/enginexfader.cpp (+7/-1)
mixxx/src/engine/enginexfader.h (+1/-1)
mixxx/src/playerinfo.cpp (+1/-1)
To merge this branch: bzr merge lp:~ezod/mixxx/hamster
Reviewer Review Type Date Requested Status
Daniel Schürmann Needs Fixing
RJ Skerry-Ryan Approve
Review via email: mp+120268@code.launchpad.net

Commit message

Add an option to reverse the crossfader (bug #829533) and fix crossfader config loading.

Description of the change

Add an option to reverse the crossfader (bug #829533) and fix crossfader config loading.

To post a comment you must log in.
Revision history for this message
RJ Skerry-Ryan (rryan) wrote :

Thanks for the feature, Aaron. I've merged it into our 1.11 branch and it will be released in Mixxx 1.11.0. It seems you've also fixed the bug where the crossfader mode was not saved across Mixxx reboots. Sorry it took so long to review. Can I credit you as "Aaron Mavrinac"?

Finally, please sign the Mixxx contributor agreement to give us permission to distribute your changes under Mixxx's license:

https://docs.google.com/a/mixxx.org/spreadsheet/viewform?formkey=dEpYN2NkVEFnWWQzbkFfM0ZYYUZ5X2c6MQ#gid=0

Thanks again!
RJ Ryan

review: Approve
Revision history for this message
Aaron Mavrinac (ezod) wrote :

Yes, "Aaron Mavrinac" works. I've signed the contributor agreement. Thanks!

Revision history for this message
Daniel Schürmann (daschuer) wrote :

Hi RJ, Hi Aaron,

Aaron thank you for the good work on this.

I had started a review some time a go but I was not ready for writing a commend. Now here it is, a little late.

I like the patch, but it breaks Auto DJ! A quick solution is to issue a warning about this because hamster style is somehow unusal.

The best solution would be if we implement a "Xfader Controller" with controlls all Xfader input sources and calculates a single Xfader output value, which is used in the we need separate controls for the xfader.
We have discussed something similar in the AutoDJ GSOC project, but this was not started yet.

With a Xfader Controller, it would be possible to solve some other issues with the Xfader.
* Xfader gain is mostly constant but it is fresh calculated every process cycle.
* calibration is only needed for a controller crossfader, not for the GUI Crossfader
* Interaction between AutoDJ, GUI Crossfader and Hardware Crossfader need to be polished

I am not sure if the reverse happens on the right place in the XfadeGains calculation. If we ever use an unsymetric fade curve, controled by auto DJ, whe should apply the reverse just after the calibration and before calculating the Xfader curve.

I will also write a bug a reminder.

Kind regards,

Daniel

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'mixxx/src/dlgprefcrossfader.cpp'
2--- mixxx/src/dlgprefcrossfader.cpp 2012-06-25 00:02:38 +0000
3+++ mixxx/src/dlgprefcrossfader.cpp 2012-08-18 19:26:22 +0000
4@@ -38,6 +38,7 @@
5 , m_COTMode(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderMode")))
6 , m_COTCurve(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderCurve")))
7 , m_COTCalibration(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderCalibration")))
8+ , m_COTReverse(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderReverse")))
9 {
10 config = _config;
11 m_pxfScene = NULL;
12@@ -48,23 +49,22 @@
13
14 setupUi(this);
15
16+ connect(PushButtonReset, SIGNAL(clicked(bool)), this, SLOT(setDefaults()));
17+
18+ QButtonGroup crossfaderModes;
19+ crossfaderModes.addButton(radioButtonAdditive);
20+ crossfaderModes.addButton(radioButtonConstantPower);
21+
22+ loadSettings();
23+
24 connect(SliderXFader, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateXFader()));
25 connect(SliderXFader, SIGNAL(sliderMoved(int)), this, SLOT(slotUpdateXFader()));
26 connect(SliderXFader, SIGNAL(sliderReleased()), this, SLOT(slotUpdateXFader()));
27 connect(SliderXFader, SIGNAL(sliderReleased()), this, SLOT(slotApply()));
28
29- connect(PushButtonReset, SIGNAL(clicked(bool)), this, SLOT(setDefaults()));
30-
31 //Update the crossfader curve graph and other setings when the crossfader mode is changed.
32 connect(radioButtonAdditive, SIGNAL(clicked(bool)), this, SLOT(slotUpdate()));
33 connect(radioButtonConstantPower, SIGNAL(clicked(bool)), this, SLOT(slotUpdate()));
34-
35- QButtonGroup crossfaderModes;
36- crossfaderModes.addButton(radioButtonAdditive);
37- crossfaderModes.addButton(radioButtonConstantPower);
38-
39- loadSettings();
40-
41 }
42
43 DlgPrefCrossfader::~DlgPrefCrossfader()
44@@ -80,11 +80,8 @@
45 double sliderVal = SliderXFader->maximum() / MIXXX_XFADER_STEEPNESS_COEFF * (sliderTransform - 1.);
46 SliderXFader->setValue((int)sliderVal);
47
48- // FIXME - this always returns 0 no matter what's in the config file
49 m_xFaderMode = config->getValueString(ConfigKey(CONFIG_KEY, "xFaderMode")).toInt();
50
51- qDebug() << "loadSettings:" << sliderTransform << sliderVal << (m_xFaderMode == MIXXX_XFADER_CONSTPWR ? "Constant Power" : "Additive");
52-
53 if (m_xFaderMode == MIXXX_XFADER_CONSTPWR)
54 {
55 radioButtonConstantPower->setChecked(true);
56@@ -96,9 +93,11 @@
57 // SliderXFader->setEnabled(false);
58 }
59
60- slotUpdateXFader();
61- slotApply();
62- drawXfaderDisplay();
63+ bool xFaderReverse = config->getValueString(ConfigKey(CONFIG_KEY, "xFaderReverse")).toInt() == 1;
64+ checkBoxReverse->setChecked(xFaderReverse);
65+
66+ slotUpdateXFader();
67+ slotApply();
68 }
69
70 /** Set the default values for all the widgets */
71@@ -108,6 +107,7 @@
72 m_xFaderMode = MIXXX_XFADER_ADDITIVE;
73 radioButtonAdditive->setChecked(true);
74 SliderXFader->setValue(SliderXFader->minimum());
75+ checkBoxReverse->setChecked(false);
76 slotUpdate();
77 slotApply();
78 }
79@@ -118,8 +118,7 @@
80 m_COTMode.slotSet(m_xFaderMode);
81 m_COTCurve.slotSet(m_transform);
82 m_COTCalibration.slotSet(m_cal);
83-
84- qDebug() << "slotApply crossfader:" << m_transform << (m_xFaderMode == MIXXX_XFADER_CONSTPWR ? "Constant Power" : "Additive");
85+ m_COTReverse.slotSet(checkBoxReverse->isChecked());
86 }
87
88 /** Update the dialog when the crossfader mode is changed */
89@@ -184,7 +183,8 @@
90
91 EngineXfader::getXfadeGains(gain1, gain2, (-1. + (xfadeStep * (double) i)),
92 m_transform, m_cal,
93- (m_xFaderMode == MIXXX_XFADER_CONSTPWR));
94+ (m_xFaderMode == MIXXX_XFADER_CONSTPWR),
95+ checkBoxReverse->isChecked());
96
97 double sum = gain1 + gain2;
98 //scale for graph
99@@ -220,13 +220,14 @@
100 /** Update and save the crossfader's parameters from the dialog's widgets. **/
101 void DlgPrefCrossfader::slotUpdateXFader()
102 {
103- m_transform = 1. + ((double) SliderXFader->value() / SliderXFader->maximum() * MIXXX_XFADER_STEEPNESS_COEFF);
104+ m_transform = 1. + ((double) SliderXFader->value() / SliderXFader->maximum() * MIXXX_XFADER_STEEPNESS_COEFF);
105
106 m_cal = EngineXfader::getCalibration(m_transform);
107 QString QS_transform = QString::number(m_transform);
108 config->set(ConfigKey(CONFIG_KEY, "xFaderMode"), ConfigValue(m_xFaderMode));
109 config->set(ConfigKey(CONFIG_KEY, "xFaderCurve"), ConfigValue(QS_transform));
110 //config->set(ConfigKey(CONFIG_KEY, "xFaderCalibration"), ConfigValue(m_cal)); //FIXME: m_cal is a double - be forewarned
111+ config->set(ConfigKey(CONFIG_KEY, "xFaderReverse"), ConfigValue(checkBoxReverse->isChecked() ? 1 : 0));
112
113- drawXfaderDisplay();
114+ drawXfaderDisplay();
115 }
116
117=== modified file 'mixxx/src/dlgprefcrossfader.h'
118--- mixxx/src/dlgprefcrossfader.h 2012-05-27 12:48:11 +0000
119+++ mixxx/src/dlgprefcrossfader.h 2012-08-18 19:26:22 +0000
120@@ -58,6 +58,7 @@
121 ControlObjectThread m_COTMode;
122 ControlObjectThread m_COTCurve;
123 ControlObjectThread m_COTCalibration;
124+ ControlObjectThread m_COTReverse;
125 };
126
127 #endif
128
129=== modified file 'mixxx/src/dlgprefcrossfaderdlg.ui'
130--- mixxx/src/dlgprefcrossfaderdlg.ui 2012-05-27 12:48:11 +0000
131+++ mixxx/src/dlgprefcrossfaderdlg.ui 2012-08-18 19:26:22 +0000
132@@ -187,6 +187,19 @@
133 </item>
134 </layout>
135 </item>
136+ <item>
137+ <widget class="QCheckBox" name="checkBoxReverse">
138+ <property name="sizePolicy">
139+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
140+ <horstretch>0</horstretch>
141+ <verstretch>0</verstretch>
142+ </sizepolicy>
143+ </property>
144+ <property name="text">
145+ <string>Reverse crossfader (hamster style)</string>
146+ </property>
147+ </widget>
148+ </item>
149 </layout>
150 <zorder>radioButtonConstantPower</zorder>
151 <zorder>radioButtonAdditive</zorder>
152
153=== modified file 'mixxx/src/engine/enginemaster.cpp'
154--- mixxx/src/engine/enginemaster.cpp 2012-05-27 12:48:11 +0000
155+++ mixxx/src/engine/enginemaster.cpp 2012-08-18 19:26:22 +0000
156@@ -112,6 +112,8 @@
157 ConfigKey("[Mixer Profile]", "xFaderCurve"), 0., 2.);
158 xFaderCalibration = new ControlPotmeter(
159 ConfigKey("[Mixer Profile]", "xFaderCalibration"), -2., 2.);
160+ xFaderReverse = new ControlPotmeter(
161+ ConfigKey("[Mixer Profile]", "xFaderReverse"), 0., 1.);
162 }
163
164 EngineMaster::~EngineMaster()
165@@ -126,7 +128,8 @@
166 delete vumeter;
167 delete head_clipping;
168 delete sidechain;
169-
170+
171+ delete xFaderReverse;
172 delete xFaderCalibration;
173 delete xFaderCurve;
174 delete xFaderMode;
175@@ -381,7 +384,8 @@
176 EngineXfader::getXfadeGains(c1_gain, c2_gain,
177 crossfader->get(), xFaderCurve->get(),
178 xFaderCalibration->get(),
179- xFaderMode->get()==MIXXX_XFADER_CONSTPWR);
180+ xFaderMode->get()==MIXXX_XFADER_CONSTPWR,
181+ xFaderReverse->get()==1.0);
182
183 // Now set the gains for overall volume and the left, center, right gains.
184 m_masterGain.setGains(m_pMasterVolume->get(), c1_gain, 1.0, c2_gain);
185
186=== modified file 'mixxx/src/engine/enginemaster.h'
187--- mixxx/src/engine/enginemaster.h 2012-05-27 12:48:11 +0000
188+++ mixxx/src/engine/enginemaster.h 2012-08-18 19:26:22 +0000
189@@ -150,7 +150,7 @@
190 EngineSideChain *sidechain;
191
192 ControlPotmeter *crossfader, *head_mix, *m_pBalance,
193- *xFaderMode, *xFaderCurve, *xFaderCalibration;
194+ *xFaderMode, *xFaderCurve, *xFaderCalibration, *xFaderReverse;
195
196 ConstantGainCalculator m_headphoneGain;
197 OrientationVolumeGainCalculator m_masterGain;
198
199=== modified file 'mixxx/src/engine/enginexfader.cpp'
200--- mixxx/src/engine/enginexfader.cpp 2012-05-27 12:48:11 +0000
201+++ mixxx/src/engine/enginexfader.cpp 2012-08-18 19:26:22 +0000
202@@ -7,7 +7,7 @@
203 return pow(.5, 1./transform);
204 }
205
206-void EngineXfader::getXfadeGains(float &gain1, float &gain2, float xfadePosition, float transform, float calibration, bool constPower)
207+void EngineXfader::getXfadeGains(float &gain1, float &gain2, float xfadePosition, float transform, float calibration, bool constPower, bool reverse)
208 {
209 // Slow-fade/fast-cut
210 float xfadePositionLeft = xfadePosition;
211@@ -42,4 +42,10 @@
212 if(gain2 < 0.)
213 gain2 = 0.;
214
215+ if(reverse)
216+ {
217+ float gaint = gain1;
218+ gain1 = gain2;
219+ gain2 = gaint;
220+ }
221 }
222
223=== modified file 'mixxx/src/engine/enginexfader.h'
224--- mixxx/src/engine/enginexfader.h 2012-05-27 12:48:11 +0000
225+++ mixxx/src/engine/enginexfader.h 2012-08-18 19:26:22 +0000
226@@ -6,6 +6,6 @@
227
228 public:
229 static float getCalibration(float transform);
230- static void getXfadeGains(float &gain1, float &gain2, float xfadePosition, float transform, float calibration, bool constPower);
231+ static void getXfadeGains(float &gain1, float &gain2, float xfadePosition, float transform, float calibration, bool constPower, bool reverse);
232
233 };
234
235=== modified file 'mixxx/src/playerinfo.cpp'
236--- mixxx/src/playerinfo.cpp 2012-05-27 12:48:11 +0000
237+++ mixxx/src/playerinfo.cpp 2012-08-18 19:26:22 +0000
238@@ -115,7 +115,7 @@
239 if ((fvol = m_listCOVolume[chan]->get()) == 0.0 )
240 continue;
241
242- EngineXfader::getXfadeGains(xfl, xfr, m_COxfader->get(), 1.0, 0.0, false);
243+ EngineXfader::getXfadeGains(xfl, xfr, m_COxfader->get(), 1.0, 0.0, false, false);
244
245 // Orientation goes: left is 0, center is 1, right is 2.
246 // Leave math out of it...