Merge lp:~daschuer/mixxx/1.10-autodj into lp:mixxx/1.10

Proposed by Daniel Schürmann
Status: Merged
Merge reported by: Daniel Schürmann
Merged at revision: not available
Proposed branch: lp:~daschuer/mixxx/1.10-autodj
Merge into: lp:mixxx/1.10
Diff against target: 1731 lines (+680/-326)
31 files modified
mixxx/src/dlgautodj.cpp (+467/-233)
mixxx/src/dlgautodj.h (+32/-10)
mixxx/src/dlgprepare.h (+2/-0)
mixxx/src/dlgrecording.cpp (+1/-0)
mixxx/src/dlgrecording.h (+1/-0)
mixxx/src/library/autodjfeature.cpp (+31/-25)
mixxx/src/library/autodjfeature.h (+2/-0)
mixxx/src/library/basesqltablemodel.cpp (+2/-1)
mixxx/src/library/browse/browsefeature.cpp (+2/-1)
mixxx/src/library/browse/browsefeature.h (+0/-1)
mixxx/src/library/browse/browsetablemodel.cpp (+9/-9)
mixxx/src/library/cratefeature.cpp (+1/-0)
mixxx/src/library/dao/cratedao.h (+2/-0)
mixxx/src/library/dao/playlistdao.cpp (+11/-3)
mixxx/src/library/dao/playlistdao.h (+3/-1)
mixxx/src/library/itunes/itunesfeature.cpp (+2/-3)
mixxx/src/library/playlistfeature.cpp (+9/-2)
mixxx/src/library/playlistfeature.h (+1/-0)
mixxx/src/library/playlisttablemodel.cpp (+33/-11)
mixxx/src/library/playlisttablemodel.h (+2/-3)
mixxx/src/library/preparefeature.cpp (+16/-11)
mixxx/src/library/preparefeature.h (+2/-0)
mixxx/src/library/proxytrackmodel.cpp (+2/-1)
mixxx/src/library/recording/recordingfeature.cpp (+20/-5)
mixxx/src/library/recording/recordingfeature.h (+0/-1)
mixxx/src/library/rhythmbox/rhythmboxfeature.cpp (+1/-2)
mixxx/src/library/traktor/traktorfeature.cpp (+2/-2)
mixxx/src/soundmanager.h (+1/-1)
mixxx/src/widget/wsearchlineedit.cpp (+11/-0)
mixxx/src/widget/wtracktableview.cpp (+9/-0)
mixxx/src/widget/wtracktableview.h (+3/-0)
To merge this branch: bzr merge lp:~daschuer/mixxx/1.10-autodj
Reviewer Review Type Date Requested Status
RJ Skerry-Ryan Approve
Review via email: mp+108245@code.launchpad.net

Description of the change

Back port of the auto DJ patches, without the new controls.

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

Looks good -- please merge!

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

Merged to #3107

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'mixxx/src/dlgautodj.cpp'
--- mixxx/src/dlgautodj.cpp 2011-11-30 06:19:47 +0000
+++ mixxx/src/dlgautodj.cpp 2012-05-31 20:47:26 +0000
@@ -1,28 +1,35 @@
1#include <QSqlTableModel>1#include <QSqlTableModel>
2#include "widget/wwidget.h"2
3#include "widget/wskincolor.h"3#include "dlgautodj.h"
4#include "widget/wtracktableview.h"4
5#include "controlobject.h"5#include "controlobject.h"
6#include "controlobjectthreadmain.h"6#include "controlobjectthreadmain.h"
7#include "library/playlisttablemodel.h"
7#include "library/trackcollection.h"8#include "library/trackcollection.h"
8#include "library/playlisttablemodel.h"9#include "playerinfo.h"
9#include "dlgautodj.h"10#include "widget/wskincolor.h"
11#include "widget/wtracktableview.h"
12#include "widget/wwidget.h"
1013
14#define CONFIG_KEY "[Auto DJ]"
1115
12DlgAutoDJ::DlgAutoDJ(QWidget* parent, ConfigObject<ConfigValue>* pConfig,16DlgAutoDJ::DlgAutoDJ(QWidget* parent, ConfigObject<ConfigValue>* pConfig,
13 TrackCollection* pTrackCollection, MixxxKeyboard* pKeyboard)17 TrackCollection* pTrackCollection,
14 : QWidget(parent), Ui::DlgAutoDJ(), m_playlistDao(pTrackCollection->getPlaylistDAO())18 MixxxKeyboard* pKeyboard)
15{19 : QWidget(parent),
20 Ui::DlgAutoDJ(),
21 m_pConfig(pConfig),
22 m_pTrackCollection(pTrackCollection),
23 m_pTrackTableView(
24 new WTrackTableView(this, pConfig, m_pTrackCollection)),
25 m_playlistDao(pTrackCollection->getPlaylistDAO()),
26 m_bFadeNow(false),
27 m_eState(ADJ_DISABLED),
28 m_posThreshold1(1.0f),
29 m_posThreshold2(1.0f) {
16 setupUi(this);30 setupUi(this);
1731
18 m_pConfig = pConfig;
19 m_pTrackCollection = pTrackCollection;
20 m_bAutoDJEnabled = false;
21 m_bPlayer1Primed = false;
22 m_bPlayer2Primed = false;
23 m_pTrackTableView = new WTrackTableView(this, pConfig, m_pTrackCollection);
24 m_pTrackTableView->installEventFilter(pKeyboard);32 m_pTrackTableView->installEventFilter(pKeyboard);
25
26 connect(m_pTrackTableView, SIGNAL(loadTrack(TrackPointer)),33 connect(m_pTrackTableView, SIGNAL(loadTrack(TrackPointer)),
27 this, SIGNAL(loadTrack(TrackPointer)));34 this, SIGNAL(loadTrack(TrackPointer)));
28 connect(m_pTrackTableView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),35 connect(m_pTrackTableView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),
@@ -34,8 +41,8 @@
34 m_pTrackTablePlaceholder->hide();41 m_pTrackTablePlaceholder->hide();
35 box->insertWidget(1, m_pTrackTableView);42 box->insertWidget(1, m_pTrackTableView);
3643
37 m_pAutoDJTableModel = new PlaylistTableModel(this, pTrackCollection,44 m_pAutoDJTableModel = new PlaylistTableModel(this, pTrackCollection,
38 "mixxx.db.model.autodj");45 "mixxx.db.model.autodj");
39 int playlistId = m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE);46 int playlistId = m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE);
40 if (playlistId < 0) {47 if (playlistId < 0) {
41 m_playlistDao.createPlaylist(AUTODJ_TABLE, true);48 m_playlistDao.createPlaylist(AUTODJ_TABLE, true);
@@ -44,7 +51,7 @@
44 m_pAutoDJTableModel->setPlaylist(playlistId);51 m_pAutoDJTableModel->setPlaylist(playlistId);
45 m_pTrackTableView->loadTrackModel(m_pAutoDJTableModel);52 m_pTrackTableView->loadTrackModel(m_pAutoDJTableModel);
4653
47 //Override some playlist-view properties:54 // Override some playlist-view properties:
4855
49 // Do not set this because it disables auto-scrolling56 // Do not set this because it disables auto-scrolling
50 //m_pTrackTableView->setDragDropMode(QAbstractItemView::InternalMove);57 //m_pTrackTableView->setDragDropMode(QAbstractItemView::InternalMove);
@@ -58,40 +65,49 @@
58 connect(pushButtonAutoDJ, SIGNAL(toggled(bool)),65 connect(pushButtonAutoDJ, SIGNAL(toggled(bool)),
59 this, SLOT(toggleAutoDJ(bool))); _blah;66 this, SLOT(toggleAutoDJ(bool))); _blah;
6067
68 // playposition is from -0.14 to + 1.14
61 m_pCOPlayPos1 = new ControlObjectThreadMain(69 m_pCOPlayPos1 = new ControlObjectThreadMain(
62 ControlObject::getControl(ConfigKey("[Channel1]", "playposition")));70 ControlObject::getControl(ConfigKey("[Channel1]", "playposition")));
63 m_pCOPlayPos2 = new ControlObjectThreadMain(71 m_pCOPlayPos2 = new ControlObjectThreadMain(
64 ControlObject::getControl(ConfigKey("[Channel2]", "playposition")));72 ControlObject::getControl(ConfigKey("[Channel2]", "playposition")));
65 m_pCOPlay1 = new ControlObjectThreadMain(73 m_pCOPlay1 = new ControlObjectThreadMain(
66 ControlObject::getControl(ConfigKey("[Channel1]", "play")));74 ControlObject::getControl(ConfigKey("[Channel1]", "play")));
67 m_pCOPlay2 = new ControlObjectThreadMain(75 m_pCOPlay2 = new ControlObjectThreadMain(
68 ControlObject::getControl(ConfigKey("[Channel2]", "play")));76 ControlObject::getControl(ConfigKey("[Channel2]", "play")));
77 m_pCOPlay1Fb = new ControlObjectThreadMain(
78 ControlObject::getControl(ConfigKey("[Channel1]", "play")));
79 m_pCOPlay2Fb = new ControlObjectThreadMain(
80 ControlObject::getControl(ConfigKey("[Channel2]", "play")));
69 m_pCORepeat1 = new ControlObjectThreadMain(81 m_pCORepeat1 = new ControlObjectThreadMain(
70 ControlObject::getControl(ConfigKey("[Channel1]", "repeat")));82 ControlObject::getControl(ConfigKey("[Channel1]", "repeat")));
71 m_pCORepeat2 = new ControlObjectThreadMain(83 m_pCORepeat2 = new ControlObjectThreadMain(
72 ControlObject::getControl(ConfigKey("[Channel2]", "repeat")));84 ControlObject::getControl(ConfigKey("[Channel2]", "repeat")));
73 m_pCOCrossfader = new ControlObjectThreadMain(85 m_pCOCrossfader = new ControlObjectThreadMain(
74 ControlObject::getControl(ConfigKey("[Master]", "crossfader")));86 ControlObject::getControl(ConfigKey("[Master]", "crossfader")));
75}87}
7688
77DlgAutoDJ::~DlgAutoDJ()89DlgAutoDJ::~DlgAutoDJ() {
78{90 qDebug() << "~DlgAutoDJ()";
79 delete m_pCOPlayPos1;91 delete m_pCOPlayPos1;
80 delete m_pCOPlayPos2;92 delete m_pCOPlayPos2;
81 delete m_pCOPlay1;93 delete m_pCOPlay1;
82 delete m_pCOPlay2;94 delete m_pCOPlay2;
95 delete m_pCOPlay1Fb;
96 delete m_pCOPlay2Fb;
97 delete m_pCORepeat1;
83 delete m_pCORepeat2;98 delete m_pCORepeat2;
84 delete m_pCOCrossfader;99 delete m_pCOCrossfader;
100 // Delete m_pTrackTableView before the table model. This is because the
101 // table view saves the header state using the model.
102 delete m_pTrackTableView;
103 delete m_pAutoDJTableModel;
85}104}
86105
87void DlgAutoDJ::onShow()106void DlgAutoDJ::onShow() {
88{
89 m_pAutoDJTableModel->select();107 m_pAutoDJTableModel->select();
90}108}
91109
92void DlgAutoDJ::setup(QDomNode node)110void DlgAutoDJ::setup(QDomNode node) {
93{
94
95 QPalette pal = palette();111 QPalette pal = palette();
96112
97 // Row colors113 // Row colors
@@ -108,9 +124,6 @@
108 // the future this should be configurable from the skin with this as the124 // the future this should be configurable from the skin with this as the
109 // fallback option125 // fallback option
110 QColor text(255 - r1.red(), 255 - r1.green(), 255 - r1.blue());126 QColor text(255 - r1.red(), 255 - r1.green(), 255 - r1.blue());
111
112 //setAlternatingRowColors ( true );
113
114 QColor fgColor;127 QColor fgColor;
115 fgColor.setNamedColor(WWidget::selectNodeQString(node, "FgColor"));128 fgColor.setNamedColor(WWidget::selectNodeQString(node, "FgColor"));
116 fgColor = WSkinColor::getCorrectColor(fgColor);129 fgColor = WSkinColor::getCorrectColor(fgColor);
@@ -119,26 +132,24 @@
119 pal.setColor(QPalette::AlternateBase, r2);132 pal.setColor(QPalette::AlternateBase, r2);
120 pal.setColor(QPalette::Text, text);133 pal.setColor(QPalette::Text, text);
121 pal.setColor(QPalette::WindowText, fgColor);134 pal.setColor(QPalette::WindowText, fgColor);
122
123 }135 }
124136
125 setPalette(pal);137 setPalette(pal);
126138
127 pushButtonAutoDJ->setPalette(pal);139 pushButtonAutoDJ->setPalette(pal);
128 //m_pTrackTableView->setPalette(pal); //Since we're getting this passed into us already created,140
129 //shouldn't need to set the palette.141 // Since we're getting this passed into us already created, shouldn't need
130}142 // to set the palette.
131143 //m_pTrackTableView->setPalette(pal);
132void DlgAutoDJ::onSearchStarting()144}
133{145
134}146void DlgAutoDJ::onSearchStarting() {
135147}
136void DlgAutoDJ::onSearchCleared()148
137{149void DlgAutoDJ::onSearchCleared() {
138}150}
139151
140void DlgAutoDJ::onSearch(const QString& text)152void DlgAutoDJ::onSearch(const QString& text) {
141{
142 m_pAutoDJTableModel->search(text);153 m_pAutoDJTableModel->search(text);
143}154}
144155
@@ -154,204 +165,427 @@
154 m_pTrackTableView->moveSelection(delta);165 m_pTrackTableView->moveSelection(delta);
155}166}
156167
157void DlgAutoDJ::shufflePlaylist(bool buttonChecked)168void DlgAutoDJ::shufflePlaylist(bool buttonChecked) {
158{
159 Q_UNUSED(buttonChecked);169 Q_UNUSED(buttonChecked);
160 qDebug() << "Shuffling AutoDJ playlist";170 qDebug() << "Shuffling AutoDJ playlist";
161 m_pAutoDJTableModel->shuffleTracks(m_pAutoDJTableModel->index(0, 0));171 int row;
172 if(m_eState == ADJ_DISABLED) {
173 row = 0;
174 } else {
175 row = 1;
176 }
177 m_pAutoDJTableModel->shuffleTracks(m_pAutoDJTableModel->index(row, 0));
162 qDebug() << "Shuffling done";178 qDebug() << "Shuffling done";
163}179}
164180
165void DlgAutoDJ::toggleAutoDJ(bool toggle)181void DlgAutoDJ::skipNext(bool buttonChecked) {
166{182 Q_UNUSED(buttonChecked);
167 if (toggle) //Enable Auto DJ183 qDebug() << "Skip Next";
168 {184 // Load the next song from the queue.
169 if (m_pCOPlay1->get() == 1.0f && m_pCOPlay2->get() == 1.0f) {185 if (m_pCOPlay1Fb->get() == 0.0f) {
170 qDebug() << "One player must be stopped before enabling Auto DJ mode";186 removePlayingTrackFromQueue("[Channel1]");
171 pushButtonAutoDJ->setChecked(false);187 loadNextTrackFromQueue();
172 return;188 } else if (m_pCOPlay2Fb->get() == 0.0f) {
173 }189 removePlayingTrackFromQueue("[Channel2]");
174190 loadNextTrackFromQueue();
191 }
192}
193
194void DlgAutoDJ::fadeNow(bool buttonChecked) {
195 Q_UNUSED(buttonChecked);
196 qDebug() << "Fade Now";
197 if (m_eState == ADJ_IDLE) {
198 m_bFadeNow = true;
199 double crossfader = m_pCOCrossfader->get();
200 if (crossfader <= 0.3f && m_pCOPlay1Fb->get() == 1.0f) {
201 m_posThreshold1 = m_pCOPlayPos1->get() -
202 ((crossfader + 1.0f) / 2 * (m_fadeDuration1));
203 // Repeat is disabled by FadeNow but disables auto Fade
204 m_pCORepeat1->slotSet(0.0f);
205 } else if (crossfader >= -0.3f && m_pCOPlay2Fb->get() == 1.0f) {
206 m_posThreshold2 = m_pCOPlayPos2->get() -
207 ((1.0f - crossfader) / 2 * (m_fadeDuration2));
208 // Repeat is disabled by FadeNow but disables auto Fade
209 m_pCORepeat2->slotSet(0.0f);
210 }
211 }
212}
213
214void DlgAutoDJ::toggleAutoDJ(bool toggle) {
215 bool deck1Playing = m_pCOPlay1Fb->get() == 1.0f;
216 bool deck2Playing = m_pCOPlay2Fb->get() == 1.0f;
217
218 if (toggle) { // Enable Auto DJ
219 if (deck1Playing && deck2Playing) {
220 QMessageBox::warning(
221 NULL, tr("Auto-DJ"),
222 tr("One deck must be stopped to enable Auto-DJ mode."),
223 QMessageBox::Ok);
224 qDebug() << "One deck must be stopped before enabling Auto DJ mode";
225 pushButtonAutoDJ->setChecked(false);
226 return;
227 }
228
229 // Never load the same track if it is already playing
230 if (deck1Playing) {
231 removePlayingTrackFromQueue("[Channel1]");
232 }
233 if (deck2Playing) {
234 removePlayingTrackFromQueue("[Channel2]");
235 }
236
237 TrackPointer nextTrack = getNextTrackFromQueue();
238 if (!nextTrack) {
239 qDebug() << "Queue is empty now";
240 pushButtonAutoDJ->setChecked(false);
241 return;
242 }
243
244 // Track is available so GO
245 pushButtonAutoDJ->setToolTip(tr("Disable Auto DJ"));
175 pushButtonAutoDJ->setText(tr("Disable Auto DJ"));246 pushButtonAutoDJ->setText(tr("Disable Auto DJ"));
176 m_bAutoDJEnabled = true;247 qDebug() << "Auto DJ enabled";
248
177 connect(m_pCOPlayPos1, SIGNAL(valueChanged(double)),249 connect(m_pCOPlayPos1, SIGNAL(valueChanged(double)),
178 this, SLOT(player1PositionChanged(double)));250 this, SLOT(player1PositionChanged(double)));
179 connect(m_pCOPlayPos2, SIGNAL(valueChanged(double)),251 connect(m_pCOPlayPos2, SIGNAL(valueChanged(double)),
180 this, SLOT(player2PositionChanged(double)));252 this, SLOT(player2PositionChanged(double)));
181253
182254 connect(m_pCOPlay1Fb, SIGNAL(valueChanged(double)),
183 //Manually override the "next track is already loaded" flag255 this, SLOT(player1PlayChanged(double)));
184 //because we've already primed a player with the first track.256 connect(m_pCOPlay2Fb, SIGNAL(valueChanged(double)),
185 //We do this so that you don't lose the first song in your257 this, SLOT(player2PlayChanged(double)));
186 //Auto DJ queue if you enable Auto DJ then change your mind258
187 //and disable it right away. This just makes it a little bit259 if (!deck1Playing && !deck2Playing) {
188 //more user friendly. :)260 // both decks are stopped
189 //m_bNextTrackAlreadyLoaded = true;261 m_eState = ADJ_ENABLE_P1LOADED;
190 m_bPlayer1Primed = false;262 // Force Update on load Track
191 m_bPlayer2Primed = false;263 m_pCOPlayPos1->slotSet(-0.001f);
192264 } else {
193 //If there are no tracks in the Auto DJ queue, disable Auto DJ mode.265 m_eState = ADJ_IDLE;
194 /* if (m_pAutoDJTableModel->rowCount() == 0)266 if (deck1Playing) {
195 {267 // deck 1 is already playing
196 //Queue was empty. Disable and return.268 player1PlayChanged(1.0f);
197 pushButtonAutoDJ->setChecked(false);269 } else {
198 return;270 // deck 2 is already playing
199 }*/ //don't need this code, above block takes care of this case.271 player2PlayChanged(1.0f);
200272 }
201 //If only one of the players is playing...273 }
202 if ((m_pCOPlay1->get() == 1.0f && m_pCOPlay2->get() == 0.0f) ||274 // Loads into first deck If stopped else into second else not
203 (m_pCOPlay1->get() == 0.0f && m_pCOPlay2->get() == 1.0f))275 emit(loadTrack(nextTrack));
204 {276 } else { // Disable Auto DJ
205 //Load the first song from the queue.277 pushButtonAutoDJ->setToolTip(tr("Enable Auto DJ"));
206 if (!loadNextTrackFromQueue(false)) {
207 //Queue was empty. Disable and return.
208 pushButtonAutoDJ->setChecked(false);
209 return;
210 }
211 //Set the primed flags so the crossfading algorithm knows
212 //that it doesn't need to load a track into whatever player.
213 if (m_pCOPlay1->get() == 1.0f)
214 {
215 m_bPlayer1Primed = true;
216 }
217 if (m_pCOPlay2->get() == 1.0f)
218 {
219 m_bPlayer2Primed = true;
220 }
221 }
222 //If both players are stopped, start the first one (which should have just had a track loaded into it)
223 else if (m_pCOPlay1->get() == 0.0f && m_pCOPlay2->get() == 0.0f) {
224 //Load the first song from the queue.
225 if (!loadNextTrackFromQueue(false)) {
226 //Queue was empty. Disable and return.
227 pushButtonAutoDJ->setChecked(false);
228 return;
229 }
230 m_pCOCrossfader->slotSet(-1.0f); //Move crossfader to the left!
231 m_pCORepeat1->slotSet(1.0f); //Turn on repeat mode to avoid race condition between async load
232 //and "play" command.
233 m_pCOPlay1->slotSet(1.0f); //Play the track in player 1
234 }
235 }
236 else //Disable Auto DJ
237 {
238 pushButtonAutoDJ->setText(tr("Enable Auto DJ"));278 pushButtonAutoDJ->setText(tr("Enable Auto DJ"));
239 qDebug() << "Auto DJ disabled";279 qDebug() << "Auto DJ disabled";
240 m_bAutoDJEnabled = false;280 m_eState = ADJ_DISABLED;
281 m_bFadeNow = false;
241 m_pCOPlayPos1->disconnect(this);282 m_pCOPlayPos1->disconnect(this);
242 m_pCOPlayPos2->disconnect(this);283 m_pCOPlayPos2->disconnect(this);
243 m_pCORepeat1->slotSet(0.0f); //Turn off repeat mode284 m_pCOPlay1->disconnect(this);
244 m_pCORepeat2->slotSet(0.0f); //Turn off repeat mode285 m_pCOPlay2->disconnect(this);
245 }286 }
246}287}
247288
248void DlgAutoDJ::player1PositionChanged(double value)289void DlgAutoDJ::player1PositionChanged(double value) {
249{290 // 95% playback is when we crossfade and do stuff
250 const float posThreshold = 0.95; //95% playback is when we crossfade and do stuff291 // const float posThreshold = 0.95;
251 if (value > posThreshold)292
252 {293 // 0.05; // 5% playback is crossfade duration
253 //Crossfade!294 const float fadeDuration = m_fadeDuration1;
254 float crossfadeValue = -1.0f + 2*(value-posThreshold)/(1.0f-posThreshold);295
255 m_pCOCrossfader->slotSet(crossfadeValue); //Move crossfader to the right!296 // qDebug() << "player1PositionChanged(" << value << ")";
256 //If the second player doesn't have a new track loaded in it...297 if (m_eState == ADJ_DISABLED) {
257 if (!m_bPlayer2Primed)298 //nothing to do
258 {299 return;
259 qDebug() << "pp1c loading";300 }
260301
261 //Load the next track into Player 2302 bool deck1Playing = m_pCOPlay1Fb->get() == 1.0f;
262 //if (!m_bNextTrackAlreadyLoaded) //Fudge to make us not skip the first track303 bool deck2Playing = m_pCOPlay2Fb->get() == 1.0f;
263 {304
264 if (!loadNextTrackFromQueue(true))305 if (m_eState == ADJ_ENABLE_P1LOADED) {
265 return;306 // Auto DJ Start
266 }307 if (!deck1Playing && !deck2Playing) {
267 //m_bNextTrackAlreadyLoaded = false; //Reset fudge308 m_pCOCrossfader->slotSet(-1.0f); // Move crossfader to the left!
268 m_bPlayer2Primed = true;309 m_pCOPlay1->slotSet(1.0f); // Play the track in player 1
269 }310 removePlayingTrackFromQueue("[Channel1]");
270 //If the second player is stopped...311 } else {
271 if (m_pCOPlay2->get() == 0.0f)312 m_eState = ADJ_IDLE;
272 {313 if (deck1Playing && !deck2Playing) {
273 //Turn off repeat mode to tell Player 1 to stop at the end314 // Here we are, if first deck was playing before starting Auto DJ
274 m_pCORepeat1->slotSet(0.0f);315 // or if it was started just before
275316 loadNextTrackFromQueue();
276 //Turn on repeat mode to tell Player 2 to start playing when the new track is loaded.317 // if we start the deck from code we don`t get a signal
277 //This helps us get around the fact that it takes time for the track to be loaded318 player1PlayChanged(1.0f);
278 //and that is executed asynchronously (so we get around the race condition).319 // call function manually
279 m_pCORepeat2->slotSet(1.0f);320 } else {
280 //Play!321 player2PlayChanged(1.0f);
281 m_pCOPlay2->slotSet(1.0f);322 }
282 }323 }
283324 return;
284 if (value == 1.0f)325 }
285 {326
286 m_pCOPlay1->slotSet(0.0f); //Stop the player327 if (m_eState == ADJ_P2FADING) {
287 m_bPlayer1Primed = false;328 if (deck1Playing && !deck2Playing) {
288 }329 // End State
289 }330 m_pCOCrossfader->slotSet(-1.0f); // Move crossfader to the left!
290}331 // qDebug() << "1: m_pCOCrossfader->slotSet(_-1.0f_);";
291332 m_eState = ADJ_IDLE;
292void DlgAutoDJ::player2PositionChanged(double value)333 loadNextTrackFromQueue();
293{334 }
294 const float posThreshold = 0.95; //95% playback is when we crossfade and do stuff335 return;
295 if (value > posThreshold)336 }
296 {337
297 //Crossfade!338 if (m_eState == ADJ_IDLE) {
298 float crossfadeValue = 1.0f - 2*(value-posThreshold)/(1.0f-posThreshold);339 if (m_pCORepeat1->get() == 1.0f) {
299 m_pCOCrossfader->slotSet(crossfadeValue); //Move crossfader to the right!340 // repeat disables auto DJ
300341 return;
301 //If the first player doesn't have the next track loaded, load a track into342 }
302 //it and start playing it!343 }
303 if (!m_bPlayer1Primed)344
304 {345 if (value >= m_posThreshold1) {
305 //Load the next track into player 1346 if (m_eState == ADJ_IDLE &&
306 //if (!m_bNextTrackAlreadyLoaded) //Fudge to make us not skip the first track347 (deck1Playing || m_posThreshold1 >= 1.0f)) {
307 {348 if (!deck2Playing) {
308 if (!loadNextTrackFromQueue(true))349 // Start Deck 2
309 return;350 player2PlayChanged(1.0f);
310 }351 m_pCOPlay2->slotSet(1.0f);
311 //m_bNextTrackAlreadyLoaded = false; //Reset fudge352 if (fadeDuration < 0.0f) {
312 m_bPlayer1Primed = true;353 // Scroll back for pause between tracks
313 }354 m_pCOPlayPos2->slotSet(m_fadeDuration2);
314 if (m_pCOPlay1->get() == 0.0f)355 }
315 {356 }
316 //Turn off repeat mode to tell Player 2 to stop at the end357 removePlayingTrackFromQueue("[Channel2]");
317 m_pCORepeat2->slotSet(0.0f);358 m_eState = ADJ_P1FADING;
318359 }
319 //Turn on repeat mode to tell Player 1 to start playing when the new track is loaded.360
320 //This helps us get around the fact that it takes time for the track to be loaded361 float posFadeEnd = math_min(1.0, m_posThreshold1 + fadeDuration);
321 //and that is executed asynchronously (so we get around the race condition).362
322 m_pCORepeat1->slotSet(1.0f);363 if (value >= posFadeEnd) {
323 m_pCOPlay1->slotSet(1.0f);364 // Pre-EndState
324 }365 // m_pCOCrossfader->slotSet(1.0f); //Move crossfader to the right!
325366
326 if (value == 1.0f)367 m_pCOPlay1->slotSet(0.0f); // Stop the player
327 {368 //m_posThreshold = 1.0f - fadeDuration; // back to default
328 m_pCOPlay2->slotSet(0.0f); //Stop the player369
329 m_bPlayer2Primed = false;370 // does not work always immediately after stop
330 }371 // loadNextTrackFromQueue();
331 }372 // m_eState = ADJ_IDLE; // Fading ready
332}373 } else {
333374 // Crossfade!
334375 float crossfadeValue = -1.0f +
335bool DlgAutoDJ::loadNextTrackFromQueue(bool removeTopMostBeforeLoading)376 2*(value-m_posThreshold1)/(posFadeEnd-m_posThreshold1);
336{377 // crossfadeValue = -1.0f -> + 1.0f
337 if (removeTopMostBeforeLoading) {378 // Move crossfader to the right!
338 //Only remove the top track if this isn't the start of Auto DJ mode.379 m_pCOCrossfader->slotSet(crossfadeValue);
339 m_pAutoDJTableModel->removeTrack(m_pAutoDJTableModel->index(0, 0));380 // qDebug() << "1: m_pCOCrossfader->slotSet " << crossfadeValue;
340 }381 }
341382 }
342 //Get the track at the top of the playlist...383}
343 TrackPointer nextTrack = m_pAutoDJTableModel->getTrack(m_pAutoDJTableModel->index(0, 0));384
344385void DlgAutoDJ::player2PositionChanged(double value) {
345 if (!nextTrack) //We ran out of tracks in the queue...386 // 95% playback is when we crossfade and do stuff
346 {387 // const float posThreshold = 0.95;
347 //Disable auto DJ and return...388
389 // 0.05; // 5% playback is crossfade duration
390 float fadeDuration = m_fadeDuration2;
391
392 //qDebug() << "player2PositionChanged(" << value << ")";
393 if (m_eState == ADJ_DISABLED) {
394 //nothing to do
395 return;
396 }
397
398 bool deck1Playing = m_pCOPlay1Fb->get() == 1.0f;
399 bool deck2Playing = m_pCOPlay2Fb->get() == 1.0f;
400
401 if (m_eState == ADJ_P1FADING) {
402 if (!deck1Playing && deck2Playing) {
403 // End State
404 // Move crossfader to the right!
405 m_pCOCrossfader->slotSet(1.0f);
406 // qDebug() << "1: m_pCOCrossfader->slotSet(_1.0f_);";
407 m_eState = ADJ_IDLE;
408 loadNextTrackFromQueue();
409 }
410 return;
411 }
412
413 if (m_eState == ADJ_IDLE) {
414 if (m_pCORepeat2->get() == 1.0f) {
415 //repeat disables auto DJ
416 return;
417 }
418 }
419
420 if (value >= m_posThreshold2) {
421 if (m_eState == ADJ_IDLE &&
422 (deck2Playing || m_posThreshold2 >= 1.0f)) {
423 if (!deck1Playing) {
424 player1PlayChanged(1.0f);
425 m_pCOPlay1->slotSet(1.0f);
426 if (fadeDuration < 0) {
427 // Scroll back for pause between tracks
428 m_pCOPlayPos1->slotSet(m_fadeDuration1);
429 }
430 }
431 removePlayingTrackFromQueue("[Channel1]");
432 m_eState = ADJ_P2FADING;
433 }
434
435 float posFadeEnd = math_min(1.0, m_posThreshold2 + fadeDuration);
436
437 if (value >= posFadeEnd) {
438 // Pre-End State
439 //m_pCOCrossfader->slotSet(-1.0f); //Move crossfader to the left!
440
441 m_pCOPlay2->slotSet(0.0f); // Stop the player
442
443 //m_posThreshold = 1.0f - fadeDuration; // back to default
444
445 // does not work always immediately after stop
446 // loadNextTrackFromQueue();
447 // m_eState = ADJ_IDLE; // Fading ready
448 } else {
449 //Crossfade!
450 float crossfadeValue = 1.0f -
451 2*(value-m_posThreshold2)/(posFadeEnd-m_posThreshold2);
452 // crossfadeValue = 1.0f -> + -1.0f
453 m_pCOCrossfader->slotSet(crossfadeValue); //Move crossfader to the right!
454 // qDebug() << "2: m_pCOCrossfader->slotSet " << crossfadeValue;
455 }
456 }
457}
458
459TrackPointer DlgAutoDJ::getNextTrackFromQueue() {
460 // Get the track at the top of the playlist...
461 TrackPointer nextTrack;
462
463 while (true) {
464 nextTrack = m_pAutoDJTableModel->getTrack(
465 m_pAutoDJTableModel->index(0, 0));
466
467 if (nextTrack) {
468 if (nextTrack->exists()) {
469 // found a valid Track
470 return nextTrack;
471 } else {
472 // Remove missing song from auto DJ playlist
473 m_pAutoDJTableModel->removeTrack(
474 m_pAutoDJTableModel->index(0, 0));
475 }
476 } else {
477 // we are running out of tracks
478 break;
479 }
480 }
481 return nextTrack;
482}
483
484bool DlgAutoDJ::loadNextTrackFromQueue() {
485 TrackPointer nextTrack = getNextTrackFromQueue();
486
487 // We ran out of tracks in the queue...
488 if (!nextTrack) {
489 // Disable auto DJ and return...
348 pushButtonAutoDJ->setChecked(false);490 pushButtonAutoDJ->setChecked(false);
491 // And eject track as "End of auto DJ warning"
492 emit(loadTrack(nextTrack));
349 return false;493 return false;
350 }494 }
351495
352 //m_bNextTrackAlreadyLoaded = false;
353
354 emit(loadTrack(nextTrack));496 emit(loadTrack(nextTrack));
355497 return true;
356 return true;498}
499
500bool DlgAutoDJ::removePlayingTrackFromQueue(QString group) {
501 TrackPointer nextTrack, loadedTrack;
502 int nextId = 0, loadedId = 0;
503
504 // Get the track at the top of the playlist...
505 nextTrack = m_pAutoDJTableModel->getTrack(m_pAutoDJTableModel->index(0, 0));
506 if (nextTrack) {
507 nextId = nextTrack->getId();
508 }
509
510 // Get loaded track
511 loadedTrack = PlayerInfo::Instance().getTrackInfo(group);
512 if (loadedTrack) {
513 loadedId = loadedTrack->getId();
514 }
515
516 // When enable auto DJ and Topmost Song is already on second deck, nothing to do
517 //BaseTrackPlayer::getLoadedTrack()
518 //pTrack = PlayerInfo::Instance().getCurrentPlayingTrack();
519
520 if (loadedId != nextId) {
521 // Do not remove when the user has loaded a track manually
522 return false;
523 }
524
525 // remove the top track
526 m_pAutoDJTableModel->removeTrack(m_pAutoDJTableModel->index(0, 0));
527
528 return true;
529}
530
531void DlgAutoDJ::player1PlayChanged(double value) {
532 //qDebug() << "player1PlayChanged(" << value << ")";
533 if (value == 1.0f && m_eState == ADJ_IDLE) {
534 TrackPointer loadedTrack =
535 PlayerInfo::Instance().getTrackInfo("[Channel1]");
536 if (loadedTrack) {
537 int TrackDuration = loadedTrack->getDuration();
538 qDebug() << "TrackDuration = " << TrackDuration;
539
540 int autoDjTransition = 5;
541
542 if (TrackDuration > autoDjTransition) {
543 m_fadeDuration1 = static_cast<float>(autoDjTransition) /
544 static_cast<float>(TrackDuration);
545 } else {
546 m_fadeDuration1 = 0;
547 }
548
549 if (autoDjTransition > 0) {
550 m_posThreshold1 = 1.0f - m_fadeDuration1;
551 } else {
552 // in case of pause
553 m_posThreshold1 = 1.0f;
554 }
555 qDebug() << "m_fadeDuration1 = " << m_fadeDuration1;
556 }
557 }
558}
559
560void DlgAutoDJ::player2PlayChanged(double value) {
561 //qDebug() << "player2PlayChanged(" << value << ")";
562 if (value == 1.0f && m_eState == ADJ_IDLE) {
563 TrackPointer loadedTrack =
564 PlayerInfo::Instance().getTrackInfo("[Channel2]");
565 if (loadedTrack) {
566 int TrackDuration = loadedTrack->getDuration();
567 qDebug() << "TrackDuration = " << TrackDuration;
568
569 int autoDjTransition = 5;
570
571 if (TrackDuration > autoDjTransition) {
572 m_fadeDuration2 = static_cast<float>(autoDjTransition) /
573 static_cast<float>(TrackDuration);
574 } else {
575 m_fadeDuration2 = 0;
576 }
577
578 if (autoDjTransition > 0) {
579 m_posThreshold2 = 1.0f - m_fadeDuration2;
580 } else {
581 // in case of pause
582 m_posThreshold2 = 1.0f;
583 }
584 qDebug() << "m_fadeDuration2 = " << m_fadeDuration2;
585 }
586 }
587}
588
589bool DlgAutoDJ::appendTrack(int trackId) {
590 return m_pAutoDJTableModel->appendTrack(trackId);
357}591}
358592
=== modified file 'mixxx/src/dlgautodj.h'
--- mixxx/src/dlgautodj.h 2011-04-24 06:00:11 +0000
+++ mixxx/src/dlgautodj.h 2012-05-31 20:47:26 +0000
@@ -31,37 +31,59 @@
31 virtual void loadSelectedTrack();31 virtual void loadSelectedTrack();
32 virtual void loadSelectedTrackToGroup(QString group);32 virtual void loadSelectedTrackToGroup(QString group);
33 virtual void moveSelection(int delta);33 virtual void moveSelection(int delta);
34 virtual bool appendTrack(int trackId);
3435
35 public slots:36 public slots:
36 void shufflePlaylist(bool buttonChecked);37 void shufflePlaylist(bool buttonChecked);
38 void skipNext(bool buttonChecked);
39 void fadeNow(bool buttonChecked);
37 void toggleAutoDJ(bool toggle);40 void toggleAutoDJ(bool toggle);
38 void player1PositionChanged(double value);41 void player1PositionChanged(double value);
39 void player2PositionChanged(double value);42 void player2PositionChanged(double value);
43 void player1PlayChanged(double value);
44 void player2PlayChanged(double value);
4045
41 signals:46 signals:
42 void loadTrack(TrackPointer tio);47 void loadTrack(TrackPointer tio);
43 void loadTrackToPlayer(TrackPointer tio, QString group);48 void loadTrackToPlayer(TrackPointer tio, QString group);
4449
45 private:50 private:
46 bool loadNextTrackFromQueue(bool removeTopMostBeforeLoading);51 enum ADJstates {
52 ADJ_IDLE = 0,
53 ADJ_P1FADING,
54 ADJ_P2FADING,
55 ADJ_ENABLE_P1LOADED,
56 ADJ_ENABLE_P1PLAYING,
57 ADJ_DISABLED
58 };
59
60 TrackPointer getNextTrackFromQueue();
61 bool loadNextTrackFromQueue();
62 bool removePlayingTrackFromQueue(QString group);
4763
48 ConfigObject<ConfigValue>* m_pConfig;64 ConfigObject<ConfigValue>* m_pConfig;
49 TrackCollection* m_pTrackCollection;65 TrackCollection* m_pTrackCollection;
50 WTrackTableView* m_pTrackTableView;66 WTrackTableView* m_pTrackTableView;
51 PlaylistTableModel* m_pAutoDJTableModel;67 PlaylistTableModel* m_pAutoDJTableModel;
52 PlaylistDAO& m_playlistDao;68 PlaylistDAO& m_playlistDao;
53 bool m_bAutoDJEnabled;69
54 bool m_bNextTrackAlreadyLoaded; /** Makes our Auto DJ logic assume the70 // Makes our Auto DJ logic assume the next track that should be played is
55 next track that should be played is71 // already loaded. We need this flag to make our
56 already loaded. We need this flag to72 // first-track-gets-loaded-but- not-removed-from-the-queue behaviour work.
57 make our first-track-gets-loaded-but-73 bool m_bNextTrackAlreadyLoaded;
58 not-removed-from-the-queue behaviour74
59 work. */75 bool m_bFadeNow;
60 bool m_bPlayer1Primed, m_bPlayer2Primed;76 enum ADJstates m_eState;
77 float m_posThreshold1;
78 float m_posThreshold2;
79 float m_fadeDuration1;
80 float m_fadeDuration2;
61 ControlObjectThreadMain* m_pCOPlayPos1;81 ControlObjectThreadMain* m_pCOPlayPos1;
62 ControlObjectThreadMain* m_pCOPlayPos2;82 ControlObjectThreadMain* m_pCOPlayPos2;
63 ControlObjectThreadMain* m_pCOPlay1;83 ControlObjectThreadMain* m_pCOPlay1;
64 ControlObjectThreadMain* m_pCOPlay2;84 ControlObjectThreadMain* m_pCOPlay2;
85 ControlObjectThreadMain* m_pCOPlay1Fb;
86 ControlObjectThreadMain* m_pCOPlay2Fb;
65 ControlObjectThreadMain* m_pCORepeat1;87 ControlObjectThreadMain* m_pCORepeat1;
66 ControlObjectThreadMain* m_pCORepeat2;88 ControlObjectThreadMain* m_pCORepeat2;
67 ControlObjectThreadMain* m_pCOCrossfader;89 ControlObjectThreadMain* m_pCOCrossfader;
@@ -82,7 +104,7 @@
82104
83105
84#define _blah if ((QDate::currentDate().day() == 1) && (QDate::currentDate().month() == 4)) \106#define _blah if ((QDate::currentDate().day() == 1) && (QDate::currentDate().month() == 4)) \
85 pushButtonAutoDJ->setText("\x45\x6e\x61\x62\x6c\x65\x20\x50\x65\x65" \107 pushButtonAutoDJ->setText("\x45\x6e\x61\x62\x6c\x65\x20\x50\x65\x65" \
86 "\x20\x42\x72\x65\x61\x6b\x20\x4d\x6f\x64\x65")108 "\x20\x42\x72\x65\x61\x6b\x20\x4d\x6f\x64\x65")
87109
88110
89111
=== modified file 'mixxx/src/dlgprepare.h'
--- mixxx/src/dlgprepare.h 2011-03-26 12:29:21 +0000
+++ mixxx/src/dlgprepare.h 2012-05-31 20:47:26 +0000
@@ -6,6 +6,7 @@
6#include "configobject.h"6#include "configobject.h"
7#include "library/libraryview.h"7#include "library/libraryview.h"
8#include "library/trackcollection.h"8#include "library/trackcollection.h"
9#include "library/preparelibrarytablemodel.h"
910
10class PrepareLibraryTableModel;11class PrepareLibraryTableModel;
11class WPrepareCratesTableView;12class WPrepareCratesTableView;
@@ -29,6 +30,7 @@
29 virtual void loadSelectedTrack();30 virtual void loadSelectedTrack();
30 virtual void loadSelectedTrackToGroup(QString group);31 virtual void loadSelectedTrackToGroup(QString group);
31 virtual void moveSelection(int delta);32 virtual void moveSelection(int delta);
33 inline const QString currentSearch() { return m_pPrepareLibraryTableModel->currentSearch(); };
3234
33 public slots:35 public slots:
34 void tableSelectionChanged(const QItemSelection& selected,36 void tableSelectionChanged(const QItemSelection& selected,
3537
=== modified file 'mixxx/src/dlgrecording.cpp'
--- mixxx/src/dlgrecording.cpp 2011-11-04 23:15:03 +0000
+++ mixxx/src/dlgrecording.cpp 2012-05-31 20:47:26 +0000
@@ -119,6 +119,7 @@
119void DlgRecording::onSearchCleared()119void DlgRecording::onSearchCleared()
120{120{
121}121}
122
122void DlgRecording::refreshBrowseModel(){123void DlgRecording::refreshBrowseModel(){
123 m_browseModel.setPath(m_recordingDir);124 m_browseModel.setPath(m_recordingDir);
124}125}
125126
=== modified file 'mixxx/src/dlgrecording.h'
--- mixxx/src/dlgrecording.h 2011-03-31 18:47:04 +0000
+++ mixxx/src/dlgrecording.h 2012-05-31 20:47:26 +0000
@@ -35,6 +35,7 @@
35 virtual void loadSelectedTrackToGroup(QString group);35 virtual void loadSelectedTrackToGroup(QString group);
36 virtual void moveSelection(int delta);36 virtual void moveSelection(int delta);
37 void refreshBrowseModel();37 void refreshBrowseModel();
38 inline const QString currentSearch() { return m_proxyModel.currentSearch(); }
3839
39 public slots:40 public slots:
40 void toggleRecording(bool toggle);41 void toggleRecording(bool toggle);
4142
=== modified file 'mixxx/src/library/autodjfeature.cpp'
--- mixxx/src/library/autodjfeature.cpp 2011-10-12 17:29:43 +0000
+++ mixxx/src/library/autodjfeature.cpp 2012-05-31 20:47:26 +0000
@@ -23,6 +23,7 @@
23 m_pConfig(pConfig),23 m_pConfig(pConfig),
24 m_pTrackCollection(pTrackCollection),24 m_pTrackCollection(pTrackCollection),
25 m_playlistDao(pTrackCollection->getPlaylistDAO()) {25 m_playlistDao(pTrackCollection->getPlaylistDAO()) {
26 m_pAutoDJView = NULL;
26}27}
2728
28AutoDJFeature::~AutoDJFeature() {29AutoDJFeature::~AutoDJFeature() {
@@ -36,19 +37,19 @@
36 return QIcon(":/images/library/ic_library_autodj.png");37 return QIcon(":/images/library/ic_library_autodj.png");
37}38}
3839
39void AutoDJFeature::bindWidget(WLibrarySidebar* sidebarWidget,40void AutoDJFeature::bindWidget(WLibrarySidebar* /*sidebarWidget*/,
40 WLibrary* libraryWidget,41 WLibrary* libraryWidget,
41 MixxxKeyboard* keyboard) {42 MixxxKeyboard* keyboard) {
4243
43 DlgAutoDJ* pAutoDJView = new DlgAutoDJ(libraryWidget,44 m_pAutoDJView = new DlgAutoDJ(libraryWidget,
44 m_pConfig,45 m_pConfig,
45 m_pTrackCollection,46 m_pTrackCollection,
46 keyboard);47 keyboard);
47 pAutoDJView->installEventFilter(keyboard);48 m_pAutoDJView->installEventFilter(keyboard);
48 libraryWidget->registerView(m_sAutoDJViewName, pAutoDJView);49 libraryWidget->registerView(m_sAutoDJViewName, m_pAutoDJView);
49 connect(pAutoDJView, SIGNAL(loadTrack(TrackPointer)),50 connect(m_pAutoDJView, SIGNAL(loadTrack(TrackPointer)),
50 this, SIGNAL(loadTrack(TrackPointer)));51 this, SIGNAL(loadTrack(TrackPointer)));
51 connect(pAutoDJView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),52 connect(m_pAutoDJView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),
52 this, SIGNAL(loadTrackToPlayer(TrackPointer, QString)));53 this, SIGNAL(loadTrackToPlayer(TrackPointer, QString)));
53}54}
5455
@@ -58,19 +59,18 @@
5859
59void AutoDJFeature::activate() {60void AutoDJFeature::activate() {
60 //qDebug() << "AutoDJFeature::activate()";61 //qDebug() << "AutoDJFeature::activate()";
61 //emit(showTrackModel(m_pAutoDJTableModelProxy));62 emit(switchToView(m_sAutoDJViewName));
62 emit(switchToView("Auto DJ"));63 emit(restoreSearch(QString())); //Null String disables search box
63}64}
6465
65void AutoDJFeature::activateChild(const QModelIndex& index) {66void AutoDJFeature::activateChild(const QModelIndex& /*index*/) {
6667}
67}68
6869void AutoDJFeature::onRightClick(const QPoint& /*globalPos*/) {
69void AutoDJFeature::onRightClick(const QPoint& globalPos) {70}
70}71
7172void AutoDJFeature::onRightClickChild(const QPoint& /*globalPos*/,
72void AutoDJFeature::onRightClickChild(const QPoint& globalPos,73 QModelIndex /*index*/) {
73 QModelIndex index) {
74}74}
7575
76bool AutoDJFeature::dropAccept(QUrl url) {76bool AutoDJFeature::dropAccept(QUrl url) {
@@ -98,12 +98,18 @@
98 }98 }
9999
100 // TODO(XXX) No feedback on whether this worked.100 // TODO(XXX) No feedback on whether this worked.
101 int playlistId = m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE);101 if( m_pAutoDJView ){
102 m_playlistDao.appendTrackToPlaylist(trackId, playlistId);102 m_pAutoDJView->appendTrack(trackId);
103 }
104 else{
105 int playlistId = m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE);
106 m_playlistDao.appendTrackToPlaylist(trackId, playlistId);
107 }
108
103 return true;109 return true;
104}110}
105111
106bool AutoDJFeature::dropAcceptChild(const QModelIndex& index, QUrl url) {112bool AutoDJFeature::dropAcceptChild(const QModelIndex& /*index*/, QUrl /*url*/) {
107 return false;113 return false;
108}114}
109115
@@ -112,10 +118,10 @@
112 return SoundSourceProxy::isFilenameSupported(file.fileName());118 return SoundSourceProxy::isFilenameSupported(file.fileName());
113}119}
114120
115bool AutoDJFeature::dragMoveAcceptChild(const QModelIndex& index,121bool AutoDJFeature::dragMoveAcceptChild(const QModelIndex& /*index*/,
116 QUrl url) {122 QUrl /*url*/) {
117 return false;123 return false;
118}124}
119void AutoDJFeature::onLazyChildExpandation(const QModelIndex &index){125void AutoDJFeature::onLazyChildExpandation(const QModelIndex& /*index*/){
120 //Nothing to do because the childmodel is not of lazy nature.126 //Nothing to do because the childmodel is not of lazy nature.
121}127}
122128
=== modified file 'mixxx/src/library/autodjfeature.h'
--- mixxx/src/library/autodjfeature.h 2011-03-10 13:37:21 +0000
+++ mixxx/src/library/autodjfeature.h 2012-05-31 20:47:26 +0000
@@ -11,6 +11,7 @@
11#include "library/dao/playlistdao.h"11#include "library/dao/playlistdao.h"
12#include "configobject.h"12#include "configobject.h"
13#include "treeitemmodel.h"13#include "treeitemmodel.h"
14#include "dlgautodj.h"
1415
15class PlaylistTableModel;16class PlaylistTableModel;
16class TrackCollection;17class TrackCollection;
@@ -50,6 +51,7 @@
50 PlaylistDAO& m_playlistDao;51 PlaylistDAO& m_playlistDao;
51 const static QString m_sAutoDJViewName;52 const static QString m_sAutoDJViewName;
52 TreeItemModel m_childModel;53 TreeItemModel m_childModel;
54 DlgAutoDJ* m_pAutoDJView;
53};55};
5456
5557
5658
=== modified file 'mixxx/src/library/basesqltablemodel.cpp'
--- mixxx/src/library/basesqltablemodel.cpp 2011-12-18 18:50:40 +0000
+++ mixxx/src/library/basesqltablemodel.cpp 2012-05-31 20:47:26 +0000
@@ -18,6 +18,7 @@
18 QString settingsNamespace)18 QString settingsNamespace)
19 : QAbstractTableModel(pParent),19 : QAbstractTableModel(pParent),
20 TrackModel(db, settingsNamespace),20 TrackModel(db, settingsNamespace),
21 m_currentSearch(""),
21 m_pTrackCollection(pTrackCollection),22 m_pTrackCollection(pTrackCollection),
22 m_trackDAO(m_pTrackCollection->getTrackDAO()),23 m_trackDAO(m_pTrackCollection->getTrackDAO()),
23 m_database(db) {24 m_database(db) {
@@ -528,7 +529,7 @@
528 // waveform widget to load a track into a Player).529 // waveform widget to load a track into a Player).
529 defaultFlags |= Qt::ItemIsDragEnabled;530 defaultFlags |= Qt::ItemIsDragEnabled;
530531
531 int row = index.row();532 //int row = index.row(); // not used
532 int column = index.column();533 int column = index.column();
533534
534 if ( column == fieldIndex(LIBRARYTABLE_FILETYPE)535 if ( column == fieldIndex(LIBRARYTABLE_FILETYPE)
535536
=== modified file 'mixxx/src/library/browse/browsefeature.cpp'
--- mixxx/src/library/browse/browsefeature.cpp 2012-03-13 04:36:19 +0000
+++ mixxx/src/library/browse/browsefeature.cpp 2012-05-31 20:47:26 +0000
@@ -141,8 +141,9 @@
141}141}
142142
143void BrowseFeature::activate() {143void BrowseFeature::activate() {
144 emit(restoreSearch(m_currentSearch));144 emit(restoreSearch(QString()));
145}145}
146
146/*147/*
147 * Note: This is executed whenever you single click on an child item148 * Note: This is executed whenever you single click on an child item
148 * Single clicks will not populate sub folders149 * Single clicks will not populate sub folders
149150
=== modified file 'mixxx/src/library/browse/browsefeature.h'
--- mixxx/src/library/browse/browsefeature.h 2011-03-30 21:53:33 +0000
+++ mixxx/src/library/browse/browsefeature.h 2012-05-31 20:47:26 +0000
@@ -54,7 +54,6 @@
54 ProxyTrackModel m_proxyModel;54 ProxyTrackModel m_proxyModel;
55 TrackCollection* m_pTrackCollection;55 TrackCollection* m_pTrackCollection;
56 FolderTreeModel m_childModel;56 FolderTreeModel m_childModel;
57 QString m_currentSearch;
58};57};
5958
60#endif /* BROWSEFEATURE_H */59#endif /* BROWSEFEATURE_H */
6160
=== modified file 'mixxx/src/library/browse/browsetablemodel.cpp'
--- mixxx/src/library/browse/browsetablemodel.cpp 2011-12-22 10:56:03 +0000
+++ mixxx/src/library/browse/browsetablemodel.cpp 2012-05-31 20:47:26 +0000
@@ -112,23 +112,23 @@
112}112}
113113
114int BrowseTableModel::getTrackId(const QModelIndex& index) const {114int BrowseTableModel::getTrackId(const QModelIndex& index) const {
115 Q_UNUSED(index);115 Q_UNUSED(index);
116 // We can't implement this as it stands.116 // We can't implement this as it stands.
117 return -1;117 return -1;
118}118}
119119
120const QLinkedList<int> BrowseTableModel::getTrackRows(int trackId) const {120const QLinkedList<int> BrowseTableModel::getTrackRows(int trackId) const {
121 Q_UNUSED(trackId);121 Q_UNUSED(trackId);
122 // We can't implement this as it stands.122 // We can't implement this as it stands.
123 return QLinkedList<int>();123 return QLinkedList<int>();
124}124}
125125
126void BrowseTableModel::search(const QString& searchText) {126void BrowseTableModel::search(const QString& searchText) {
127 Q_UNUSED(searchText);127 Q_UNUSED(searchText);
128}128}
129129
130const QString BrowseTableModel::currentSearch() const {130const QString BrowseTableModel::currentSearch() const {
131 return QString();131 return QString("");
132}132}
133133
134bool BrowseTableModel::isColumnInternal(int) {134bool BrowseTableModel::isColumnInternal(int) {
@@ -215,7 +215,7 @@
215{215{
216 Q_UNUSED(index);216 Q_UNUSED(index);
217 Q_UNUSED(location);217 Q_UNUSED(location);
218 return false;218 return false;
219}219}
220220
221QMimeData* BrowseTableModel::mimeData(const QModelIndexList &indexes) const {221QMimeData* BrowseTableModel::mimeData(const QModelIndexList &indexes) const {
@@ -318,7 +318,7 @@
318{318{
319 Q_UNUSED(role);319 Q_UNUSED(role);
320320
321 if(!index.isValid())321 if(!index.isValid())
322 return false;322 return false;
323 qDebug() << "BrowseTableModel::setData(" << index.data() << ")";323 qDebug() << "BrowseTableModel::setData(" << index.data() << ")";
324 int row = index.row();324 int row = index.row();
325325
=== modified file 'mixxx/src/library/cratefeature.cpp'
--- mixxx/src/library/cratefeature.cpp 2011-12-09 02:49:02 +0000
+++ mixxx/src/library/cratefeature.cpp 2012-05-31 20:47:26 +0000
@@ -137,6 +137,7 @@
137void CrateFeature::activate() {137void CrateFeature::activate() {
138 emit(showPage(QUrl("qrc:/html/crates.html")));138 emit(showPage(QUrl("qrc:/html/crates.html")));
139 emit(switchToView("CRATEHOME"));139 emit(switchToView("CRATEHOME"));
140 emit(restoreSearch(QString())); //disable search on crate home
140}141}
141142
142void CrateFeature::activateChild(const QModelIndex& index) {143void CrateFeature::activateChild(const QModelIndex& index) {
143144
=== modified file 'mixxx/src/library/dao/cratedao.h'
--- mixxx/src/library/dao/cratedao.h 2012-05-04 05:38:59 +0000
+++ mixxx/src/library/dao/cratedao.h 2012-05-31 20:47:26 +0000
@@ -50,6 +50,8 @@
50 void changed(int crateId);50 void changed(int crateId);
51 void trackAdded(int crateId, int trackId);51 void trackAdded(int crateId, int trackId);
52 void trackRemoved(int crateId, int trackId);52 void trackRemoved(int crateId, int trackId);
53 void renamed(int crateId);
54 void lockChanged(int crateId);
5355
54 private:56 private:
55 QSqlDatabase& m_database;57 QSqlDatabase& m_database;
5658
=== modified file 'mixxx/src/library/dao/playlistdao.cpp'
--- mixxx/src/library/dao/playlistdao.cpp 2012-05-04 05:38:59 +0000
+++ mixxx/src/library/dao/playlistdao.cpp 2012-05-31 20:47:26 +0000
@@ -505,7 +505,7 @@
505 return tracksAdded;505 return tracksAdded;
506}506}
507507
508void PlaylistDAO::addToAutoDJQueue(int playlistId) {508void PlaylistDAO::addToAutoDJQueue(int playlistId, bool bTop) {
509 //qDebug() << "Adding tracks from playlist " << playlistId << " to the Auto-DJ Queue";509 //qDebug() << "Adding tracks from playlist " << playlistId << " to the Auto-DJ Queue";
510510
511 // Query the PlaylistTracks database to locate tracks in the selected playlist511 // Query the PlaylistTracks database to locate tracks in the selected playlist
@@ -520,7 +520,15 @@
520 // Get the ID of the Auto-DJ playlist520 // Get the ID of the Auto-DJ playlist
521 int autoDJId = getPlaylistIdFromName(AUTODJ_TABLE);521 int autoDJId = getPlaylistIdFromName(AUTODJ_TABLE);
522 // Loop through the tracks, adding them to the Auto-DJ Queue522 // Loop through the tracks, adding them to the Auto-DJ Queue
523 while(query.next()) {523
524 appendTrackToPlaylist(query.value(0).toInt(), autoDJId);524 int i = 2; // Start at position 2 because position 1 was already loaded to the deck
525
526 while (query.next()) {
527 if (bTop) {
528 insertTrackIntoPlaylist(query.value(0).toInt(), autoDJId, i++);
529 }
530 else {
531 appendTrackToPlaylist(query.value(0).toInt(), autoDJId);
532 }
525 }533 }
526}534}
527535
=== modified file 'mixxx/src/library/dao/playlistdao.h'
--- mixxx/src/library/dao/playlistdao.h 2012-05-04 05:38:59 +0000
+++ mixxx/src/library/dao/playlistdao.h 2012-05-31 20:47:26 +0000
@@ -57,13 +57,15 @@
57 /** Inserts a list of tracks into playlist*/57 /** Inserts a list of tracks into playlist*/
58 int insertTracksIntoPlaylist(QList<int> trackIds, int playlistId, int position);58 int insertTracksIntoPlaylist(QList<int> trackIds, int playlistId, int position);
59 /** Add a playlist to the Auto-DJ Queue */59 /** Add a playlist to the Auto-DJ Queue */
60 void addToAutoDJQueue(int playlistId);60 void addToAutoDJQueue(int playlistId, bool bTop);
61 signals:61 signals:
62 void added(int playlistId);62 void added(int playlistId);
63 void deleted(int playlistId);63 void deleted(int playlistId);
64 void changed(int playlistId);64 void changed(int playlistId);
65 void trackAdded(int playlistId, int trackId, int position);65 void trackAdded(int playlistId, int trackId, int position);
66 void trackRemoved(int playlistId, int trackId, int position);66 void trackRemoved(int playlistId, int trackId, int position);
67 void renamed(int playlistId);
68 void lockChanged(int playlistId);
67 private:69 private:
68 QSqlDatabase& m_database;70 QSqlDatabase& m_database;
69 DISALLOW_COPY_AND_ASSIGN(PlaylistDAO);71 DISALLOW_COPY_AND_ASSIGN(PlaylistDAO);
7072
=== modified file 'mixxx/src/library/itunes/itunesfeature.cpp'
--- mixxx/src/library/itunes/itunesfeature.cpp 2011-10-16 03:12:52 +0000
+++ mixxx/src/library/itunes/itunesfeature.cpp 2012-05-31 20:47:26 +0000
@@ -116,6 +116,7 @@
116 tr("Select your iTunes library"),116 tr("Select your iTunes library"),
117 QDir::homePath(), "*.xml");117 QDir::homePath(), "*.xml");
118 if (m_dbfile.isEmpty() || !QFile::exists(m_dbfile)) {118 if (m_dbfile.isEmpty() || !QFile::exists(m_dbfile)) {
119 emit(showTrackModel(m_pITunesTrackModel));
119 return;120 return;
120 }121 }
121 settings.setValue(ITDB_PATH_KEY, m_dbfile);122 settings.setValue(ITDB_PATH_KEY, m_dbfile);
@@ -138,10 +139,8 @@
138 //calls a slot in the sidebar model such that 'iTunes (isLoading)' is displayed.139 //calls a slot in the sidebar model such that 'iTunes (isLoading)' is displayed.
139 emit (featureIsLoading(this));140 emit (featureIsLoading(this));
140 }141 }
141 else{
142 emit(showTrackModel(m_pITunesTrackModel));
143 }
144142
143 emit(showTrackModel(m_pITunesTrackModel));
145}144}
146145
147void ITunesFeature::activateChild(const QModelIndex& index) {146void ITunesFeature::activateChild(const QModelIndex& index) {
148147
=== modified file 'mixxx/src/library/playlistfeature.cpp'
--- mixxx/src/library/playlistfeature.cpp 2012-03-27 18:17:26 +0000
+++ mixxx/src/library/playlistfeature.cpp 2012-05-31 20:47:26 +0000
@@ -102,6 +102,7 @@
102void PlaylistFeature::activate() {102void PlaylistFeature::activate() {
103 emit(showPage(QUrl("qrc:/html/playlists.html")));103 emit(showPage(QUrl("qrc:/html/playlists.html")));
104 emit(switchToView("PLAYLISTHOME"));104 emit(switchToView("PLAYLISTHOME"));
105 emit(restoreSearch(QString())); // Null String disables search box
105}106}
106107
107void PlaylistFeature::activateChild(const QModelIndex& index) {108void PlaylistFeature::activateChild(const QModelIndex& index) {
@@ -448,7 +449,7 @@
448 new PlaylistTableModel(this, m_pTrackCollection,449 new PlaylistTableModel(this, m_pTrackCollection,
449 "mixxx.db.model.playlist_export"));450 "mixxx.db.model.playlist_export"));
450451
451 pPlaylistTableModel->setPlaylist(m_pPlaylistTableModel->getPlaylist());452 pPlaylistTableModel->setPlaylist(m_pPlaylistTableModel->getPlaylistId());
452 pPlaylistTableModel->setSort(pPlaylistTableModel->fieldIndex(PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder);453 pPlaylistTableModel->setSort(pPlaylistTableModel->fieldIndex(PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder);
453 pPlaylistTableModel->select();454 pPlaylistTableModel->select();
454 int rows = pPlaylistTableModel->rowCount();455 int rows = pPlaylistTableModel->rowCount();
@@ -481,12 +482,18 @@
481482
482void PlaylistFeature::slotAddToAutoDJ() {483void PlaylistFeature::slotAddToAutoDJ() {
483 //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data();484 //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data();
485 addToAutoDJ(false); // Top = True
486}
487
488void PlaylistFeature::addToAutoDJ(bool bTop) {
489 //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data();
484490
485 if (m_lastRightClickedIndex.isValid()) {491 if (m_lastRightClickedIndex.isValid()) {
486 int playlistId = m_playlistDao.getPlaylistIdFromName(492 int playlistId = m_playlistDao.getPlaylistIdFromName(
487 m_lastRightClickedIndex.data().toString());493 m_lastRightClickedIndex.data().toString());
488 if (playlistId >= 0) {494 if (playlistId >= 0) {
489 m_playlistDao.addToAutoDJQueue(playlistId);495 // Insert this playlist
496 m_playlistDao.addToAutoDJQueue(playlistId, bTop);
490 }497 }
491 }498 }
492 emit(featureUpdated());499 emit(featureUpdated());
493500
=== modified file 'mixxx/src/library/playlistfeature.h'
--- mixxx/src/library/playlistfeature.h 2011-11-27 06:59:02 +0000
+++ mixxx/src/library/playlistfeature.h 2012-05-31 20:47:26 +0000
@@ -59,6 +59,7 @@
59 private:59 private:
60 void constructChildModel();60 void constructChildModel();
61 void clearChildModel();61 void clearChildModel();
62 void addToAutoDJ(bool bTop);
6263
63 TrackCollection* m_pTrackCollection;64 TrackCollection* m_pTrackCollection;
64 PlaylistTableModel* m_pPlaylistTableModel;65 PlaylistTableModel* m_pPlaylistTableModel;
6566
=== modified file 'mixxx/src/library/playlisttablemodel.cpp'
--- mixxx/src/library/playlisttablemodel.cpp 2012-05-04 05:38:59 +0000
+++ mixxx/src/library/playlisttablemodel.cpp 2012-05-31 20:47:26 +0000
@@ -5,7 +5,6 @@
5#include "library/trackcollection.h"5#include "library/trackcollection.h"
6#include "library/playlisttablemodel.h"6#include "library/playlisttablemodel.h"
7#include "library/queryutil.h"7#include "library/queryutil.h"
8
9#include "mixxxutils.cpp"8#include "mixxxutils.cpp"
109
11PlaylistTableModel::PlaylistTableModel(QObject* parent,10PlaylistTableModel::PlaylistTableModel(QObject* parent,
@@ -64,6 +63,12 @@
64 initHeaderData();63 initHeaderData();
65 setSearch("");64 setSearch("");
66 setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);65 setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);
66 setSort(defaultSortColumn(),defaultSortOrder());
67}
68
69int PlaylistTableModel::getPlaylistId()
70{
71 return m_iPlaylistId;
67}72}
6873
69bool PlaylistTableModel::addTrack(const QModelIndex& index, QString location) {74bool PlaylistTableModel::addTrack(const QModelIndex& index, QString location) {
@@ -94,6 +99,16 @@
94 return true;99 return true;
95}100}
96101
102bool PlaylistTableModel::appendTrack(int trackId) {
103 if (trackId < 0) {
104 return false;
105 }
106
107 m_playlistDao.appendTrackToPlaylist(trackId, m_iPlaylistId);
108
109 select(); //Repopulate the data model.
110 return true;
111}
97112
98int PlaylistTableModel::addTracks(const QModelIndex& index, QList<QString> locations) {113int PlaylistTableModel::addTracks(const QModelIndex& index, QList<QString> locations) {
99 const int positionColumn = fieldIndex(PLAYLISTTRACKSTABLE_POSITION);114 const int positionColumn = fieldIndex(PLAYLISTTRACKSTABLE_POSITION);
@@ -272,32 +287,38 @@
272287
273 //Print out any SQL error, if there was one.288 //Print out any SQL error, if there was one.
274 if (query.lastError().isValid()) {289 if (query.lastError().isValid()) {
275 qDebug() << query.lastError();290 qDebug() << query.lastError();
276 }291 }
277292
278 select();293 select();
279}294}
280295
281void PlaylistTableModel::shuffleTracks(const QModelIndex& currentIndex) {296void PlaylistTableModel::shuffleTracks(const QModelIndex& shuffleStartIndex) {
282 int numOfTracks = rowCount();297 int numOfTracks = rowCount();
283 int seed = QDateTime::currentDateTime().toTime_t();298 int seed = QDateTime::currentDateTime().toTime_t();
284 qsrand(seed);299 qsrand(seed);
285 QSqlQuery query(m_pTrackCollection->getDatabase());300 QSqlQuery query(m_pTrackCollection->getDatabase());
286 const int positionColumnIndex = fieldIndex(PLAYLISTTRACKSTABLE_POSITION);301 const int positionColumnIndex = fieldIndex(PLAYLISTTRACKSTABLE_POSITION);
287 int currentPosition = currentIndex.sibling(currentIndex.row(), positionColumnIndex).data().toInt();302 int shuffleStartRow = shuffleStartIndex.row();
288 int shuffleStartIndex = currentPosition + 1;
289303
290 m_pTrackCollection->getDatabase().transaction();304 m_pTrackCollection->getDatabase().transaction();
291305
292 // This is a simple Fisher-Yates shuffling algorithm306 // This is a simple Fisher-Yates shuffling algorithm
293 for (int i=numOfTracks-1; i >= shuffleStartIndex; i--)307 for (int i=numOfTracks-1; i >= shuffleStartRow; i--)
294 {308 {
295 int random = int(qrand() / (RAND_MAX + 1.0) * (numOfTracks + 1 - shuffleStartIndex) + shuffleStartIndex);309 int oldPosition = index(i, positionColumnIndex).data().toInt();
296 qDebug() << "Swapping tracks " << i << " and " << random;310 int random = int(qrand() / (RAND_MAX + 1.0) * (numOfTracks - shuffleStartRow) + shuffleStartRow + 1);
311 qDebug() << "Swapping tracks " << oldPosition << " and " << random;
297 QString swapQuery = "UPDATE PlaylistTracks SET position=%1 WHERE position=%2 AND playlist_id=%3";312 QString swapQuery = "UPDATE PlaylistTracks SET position=%1 WHERE position=%2 AND playlist_id=%3";
298 query.exec(swapQuery.arg(-1).arg(i).arg(m_iPlaylistId));313 query.exec(swapQuery.arg(QString::number(-1),
299 query.exec(swapQuery.arg(i).arg(random).arg(m_iPlaylistId));314 QString::number(oldPosition),
300 query.exec(swapQuery.arg(random).arg(-1).arg(m_iPlaylistId));315 QString::number(m_iPlaylistId)));
316 query.exec(swapQuery.arg(QString::number(oldPosition),
317 QString::number(random),
318 QString::number(m_iPlaylistId)));
319 query.exec(swapQuery.arg(QString::number(random),
320 QString::number(-1),
321 QString::number(m_iPlaylistId)));
301322
302 if (query.lastError().isValid())323 if (query.lastError().isValid())
303 qDebug() << query.lastError();324 qDebug() << query.lastError();
@@ -336,6 +357,7 @@
336}357}
337358
338QItemDelegate* PlaylistTableModel::delegateForColumn(const int i) {359QItemDelegate* PlaylistTableModel::delegateForColumn(const int i) {
360 Q_UNUSED(i);
339 return NULL;361 return NULL;
340}362}
341363
342364
=== modified file 'mixxx/src/library/playlisttablemodel.h'
--- mixxx/src/library/playlisttablemodel.h 2012-05-04 05:38:59 +0000
+++ mixxx/src/library/playlisttablemodel.h 2012-05-31 20:47:26 +0000
@@ -19,9 +19,7 @@
19 QString settingsNamespace);19 QString settingsNamespace);
20 virtual ~PlaylistTableModel();20 virtual ~PlaylistTableModel();
21 void setPlaylist(int playlistId);21 void setPlaylist(int playlistId);
22 int getPlaylist() const {22 int getPlaylistId(void);
23 return m_iPlaylistId;
24 }
25 virtual TrackPointer getTrack(const QModelIndex& index) const;23 virtual TrackPointer getTrack(const QModelIndex& index) const;
2624
27 virtual void search(const QString& searchText);25 virtual void search(const QString& searchText);
@@ -30,6 +28,7 @@
30 virtual void removeTrack(const QModelIndex& index);28 virtual void removeTrack(const QModelIndex& index);
31 virtual void removeTracks(const QModelIndexList& indices);29 virtual void removeTracks(const QModelIndexList& indices);
32 virtual bool addTrack(const QModelIndex& index, QString location);30 virtual bool addTrack(const QModelIndex& index, QString location);
31 virtual bool appendTrack(int trackId);
33 // Adding multiple tracks at one to a playlist. Returns the number of32 // Adding multiple tracks at one to a playlist. Returns the number of
34 // successful additions.33 // successful additions.
35 virtual int addTracks(const QModelIndex& index, QList<QString> locations);34 virtual int addTracks(const QModelIndex& index, QList<QString> locations);
3635
=== modified file 'mixxx/src/library/preparefeature.cpp'
--- mixxx/src/library/preparefeature.cpp 2011-03-26 12:29:21 +0000
+++ mixxx/src/library/preparefeature.cpp 2012-05-31 20:47:26 +0000
@@ -41,31 +41,35 @@
41void PrepareFeature::bindWidget(WLibrarySidebar* sidebarWidget,41void PrepareFeature::bindWidget(WLibrarySidebar* sidebarWidget,
42 WLibrary* libraryWidget,42 WLibrary* libraryWidget,
43 MixxxKeyboard* keyboard) {43 MixxxKeyboard* keyboard) {
44 DlgPrepare* pPrepareView = new DlgPrepare(libraryWidget,44 m_pPrepareView = new DlgPrepare(libraryWidget,
45 m_pConfig,45 m_pConfig,
46 m_pTrackCollection);46 m_pTrackCollection);
47 connect(pPrepareView, SIGNAL(loadTrack(TrackPointer)),47 connect(m_pPrepareView, SIGNAL(loadTrack(TrackPointer)),
48 this, SIGNAL(loadTrack(TrackPointer)));48 this, SIGNAL(loadTrack(TrackPointer)));
49 connect(pPrepareView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),49 connect(m_pPrepareView, SIGNAL(loadTrackToPlayer(TrackPointer, QString)),
50 this, SIGNAL(loadTrackToPlayer(TrackPointer, QString)));50 this, SIGNAL(loadTrackToPlayer(TrackPointer, QString)));
51 connect(pPrepareView, SIGNAL(analyzeTracks(QList<int>)),51 connect(m_pPrepareView, SIGNAL(analyzeTracks(QList<int>)),
52 this, SLOT(analyzeTracks(QList<int>)));52 this, SLOT(analyzeTracks(QList<int>)));
53 connect(pPrepareView, SIGNAL(stopAnalysis()),53 connect(m_pPrepareView, SIGNAL(stopAnalysis()),
54 this, SLOT(stopAnalysis()));54 this, SLOT(stopAnalysis()));
5555
56 connect(this, SIGNAL(analysisActive(bool)),56 connect(this, SIGNAL(analysisActive(bool)),
57 pPrepareView, SLOT(analysisActive(bool)));57 m_pPrepareView, SLOT(analysisActive(bool)));
58 connect(this, SIGNAL(trackAnalysisProgress(TrackPointer, int)),58 connect(this, SIGNAL(trackAnalysisProgress(TrackPointer, int)),
59 pPrepareView, SLOT(trackAnalysisProgress(TrackPointer, int)));59 m_pPrepareView, SLOT(trackAnalysisProgress(TrackPointer, int)));
60 connect(this, SIGNAL(trackAnalysisFinished(TrackPointer)),60 connect(this, SIGNAL(trackAnalysisFinished(TrackPointer)),
61 pPrepareView, SLOT(trackAnalysisFinished(TrackPointer)));61 m_pPrepareView, SLOT(trackAnalysisFinished(TrackPointer)));
62 pPrepareView->installEventFilter(keyboard);62
63 connect(this, SIGNAL(trackAnalysisFinished(TrackPointer)),
64 m_pPrepareView, SLOT(trackAnalysisFinished(TrackPointer)));
65
66 m_pPrepareView->installEventFilter(keyboard);
6367
64 // Let the DlgPrepare know whether or not analysis is active.68 // Let the DlgPrepare know whether or not analysis is active.
65 bool bAnalysisActive = m_pAnalyserQueue != NULL;69 bool bAnalysisActive = m_pAnalyserQueue != NULL;
66 emit(analysisActive(bAnalysisActive));70 emit(analysisActive(bAnalysisActive));
6771
68 libraryWidget->registerView(m_sPrepareViewName, pPrepareView);72 libraryWidget->registerView(m_sPrepareViewName, m_pPrepareView);
69}73}
7074
71TreeItemModel* PrepareFeature::getChildModel() {75TreeItemModel* PrepareFeature::getChildModel() {
@@ -75,6 +79,7 @@
75void PrepareFeature::activate() {79void PrepareFeature::activate() {
76 //qDebug() << "PrepareFeature::activate()";80 //qDebug() << "PrepareFeature::activate()";
77 emit(switchToView(m_sPrepareViewName));81 emit(switchToView(m_sPrepareViewName));
82 emit(restoreSearch(m_pPrepareView->currentSearch()));
78}83}
7984
80void PrepareFeature::activateChild(const QModelIndex& index) {85void PrepareFeature::activateChild(const QModelIndex& index) {
8186
=== modified file 'mixxx/src/library/preparefeature.h'
--- mixxx/src/library/preparefeature.h 2011-03-26 12:29:21 +0000
+++ mixxx/src/library/preparefeature.h 2012-05-31 20:47:26 +0000
@@ -9,6 +9,7 @@
9#include "library/libraryfeature.h"9#include "library/libraryfeature.h"
10#include "configobject.h"10#include "configobject.h"
11#include "treeitemmodel.h"11#include "treeitemmodel.h"
12#include "dlgprepare.h"
1213
13class AnalyserQueue;14class AnalyserQueue;
14class LibraryTableModel;15class LibraryTableModel;
@@ -63,6 +64,7 @@
63 int m_iOldBpmEnabled;64 int m_iOldBpmEnabled;
64 TreeItemModel m_childModel;65 TreeItemModel m_childModel;
65 const static QString m_sPrepareViewName;66 const static QString m_sPrepareViewName;
67 DlgPrepare* m_pPrepareView;
66};68};
6769
6870
6971
=== modified file 'mixxx/src/library/proxytrackmodel.cpp'
--- mixxx/src/library/proxytrackmodel.cpp 2011-09-25 08:08:35 +0000
+++ mixxx/src/library/proxytrackmodel.cpp 2012-05-31 20:47:26 +0000
@@ -11,7 +11,8 @@
11 // ProxyTrackModel proxies settings requests to the composed TrackModel,11 // ProxyTrackModel proxies settings requests to the composed TrackModel,
12 // don't initialize its TrackModel with valid parameters.12 // don't initialize its TrackModel with valid parameters.
13 : TrackModel(QSqlDatabase(), ""),13 : TrackModel(QSqlDatabase(), ""),
14 m_bHandleSearches(bHandleSearches) {14 m_bHandleSearches(bHandleSearches),
15 m_currentSearch("") {
15 m_pTrackModel = dynamic_cast<TrackModel*>(pTrackModel);16 m_pTrackModel = dynamic_cast<TrackModel*>(pTrackModel);
16 Q_ASSERT(m_pTrackModel && pTrackModel);17 Q_ASSERT(m_pTrackModel && pTrackModel);
17 setSourceModel(pTrackModel);18 setSourceModel(pTrackModel);
1819
=== modified file 'mixxx/src/library/recording/recordingfeature.cpp'
--- mixxx/src/library/recording/recordingfeature.cpp 2011-04-10 18:23:52 +0000
+++ mixxx/src/library/recording/recordingfeature.cpp 2012-05-31 20:47:26 +0000
@@ -23,8 +23,9 @@
23 TrackCollection* pTrackCollection,23 TrackCollection* pTrackCollection,
24 RecordingManager* pRecordingManager)24 RecordingManager* pRecordingManager)
25 : LibraryFeature(parent),25 : LibraryFeature(parent),
26 m_pConfig(pConfig), m_pRecordingView(0),26 m_pConfig(pConfig),
27 m_pTrackCollection(pTrackCollection),27 m_pTrackCollection(pTrackCollection),
28 m_pRecordingView(0),
28 m_pRecordingManager(pRecordingManager){29 m_pRecordingManager(pRecordingManager){
2930
30}31}
@@ -48,6 +49,8 @@
48 WLibrary *libraryWidget,49 WLibrary *libraryWidget,
49 MixxxKeyboard *keyboard)50 MixxxKeyboard *keyboard)
50{51{
52 Q_UNUSED(sidebarWidget);
53
51 //The view will be deleted by LibraryWidget54 //The view will be deleted by LibraryWidget
52 m_pRecordingView = new DlgRecording(libraryWidget,55 m_pRecordingView = new DlgRecording(libraryWidget,
53 m_pConfig,56 m_pConfig,
@@ -64,35 +67,47 @@
64}67}
6568
66bool RecordingFeature::dropAccept(QUrl url) {69bool RecordingFeature::dropAccept(QUrl url) {
70 Q_UNUSED(url);
67 return false;71 return false;
68}72}
6973
70bool RecordingFeature::dropAcceptChild(const QModelIndex& index, QUrl url) {74bool RecordingFeature::dropAcceptChild(const QModelIndex& index, QUrl url) {
75 Q_UNUSED(index);
76 Q_UNUSED(url);
71 return false;77 return false;
72}78}
7379
74bool RecordingFeature::dragMoveAccept(QUrl url) {80bool RecordingFeature::dragMoveAccept(QUrl url) {
81 Q_UNUSED(url);
75 return false;82 return false;
76}83}
7784
78bool RecordingFeature::dragMoveAcceptChild(const QModelIndex& index, QUrl url) {85bool RecordingFeature::dragMoveAcceptChild(const QModelIndex& index, QUrl url) {
86 Q_UNUSED(index);
87 Q_UNUSED(url);
79 return false;88 return false;
80}89}
8190
82void RecordingFeature::activate() {91void RecordingFeature::activate() {
83 m_pRecordingView->refreshBrowseModel();92 m_pRecordingView->refreshBrowseModel();
84 emit(switchToView("Recording"));93 emit(switchToView(m_sRecordingViewName));
94 emit(restoreSearch(m_pRecordingView->currentSearch()));
85}95}
8696
87void RecordingFeature::activateChild(const QModelIndex& index) {97void RecordingFeature::activateChild(const QModelIndex& index) {
8898 Q_UNUSED(index);
89}99}
90100
91void RecordingFeature::onRightClick(const QPoint& globalPos) {101void RecordingFeature::onRightClick(const QPoint& globalPos) {
102 Q_UNUSED(globalPos);
92}103}
93104
94void RecordingFeature::onRightClickChild(const QPoint& globalPos, QModelIndex index) {105void RecordingFeature::onRightClickChild(const QPoint& globalPos, QModelIndex index) {
106 Q_UNUSED(globalPos);
107 Q_UNUSED(index);
95}108}
109
96void RecordingFeature::onLazyChildExpandation(const QModelIndex &index){110void RecordingFeature::onLazyChildExpandation(const QModelIndex &index){
97 //Nothing to do here since we have no child models111 Q_UNUSED(index);
112 // Nothing to do here since we have no child models
98}113}
99114
=== modified file 'mixxx/src/library/recording/recordingfeature.h'
--- mixxx/src/library/recording/recordingfeature.h 2011-04-10 18:23:52 +0000
+++ mixxx/src/library/recording/recordingfeature.h 2012-05-31 20:47:26 +0000
@@ -53,7 +53,6 @@
53 ConfigObject<ConfigValue>* m_pConfig;53 ConfigObject<ConfigValue>* m_pConfig;
54 TrackCollection* m_pTrackCollection;54 TrackCollection* m_pTrackCollection;
55 FolderTreeModel m_childModel;55 FolderTreeModel m_childModel;
56 QString m_currentSearch;
57 const static QString m_sRecordingViewName;56 const static QString m_sRecordingViewName;
58 DlgRecording* m_pRecordingView;57 DlgRecording* m_pRecordingView;
59 RecordingManager* m_pRecordingManager;58 RecordingManager* m_pRecordingManager;
6059
=== modified file 'mixxx/src/library/rhythmbox/rhythmboxfeature.cpp'
--- mixxx/src/library/rhythmbox/rhythmboxfeature.cpp 2012-05-14 20:28:12 +0000
+++ mixxx/src/library/rhythmbox/rhythmboxfeature.cpp 2012-05-31 20:47:26 +0000
@@ -100,9 +100,8 @@
100 //calls a slot in the sidebar model such that 'Rhythmbox (isLoading)' is displayed.100 //calls a slot in the sidebar model such that 'Rhythmbox (isLoading)' is displayed.
101 emit (featureIsLoading(this));101 emit (featureIsLoading(this));
102 }102 }
103 else
104 emit(showTrackModel(m_pRhythmboxTrackModel));
105103
104 emit(showTrackModel(m_pRhythmboxTrackModel));
106}105}
107106
108void RhythmboxFeature::activateChild(const QModelIndex& index) {107void RhythmboxFeature::activateChild(const QModelIndex& index) {
109108
=== modified file 'mixxx/src/library/traktor/traktorfeature.cpp'
--- mixxx/src/library/traktor/traktorfeature.cpp 2011-10-18 05:12:35 +0000
+++ mixxx/src/library/traktor/traktorfeature.cpp 2012-05-31 20:47:26 +0000
@@ -109,9 +109,9 @@
109 m_title = tr("(loading) Traktor");109 m_title = tr("(loading) Traktor");
110 //calls a slot in the sidebar model such that 'iTunes (isLoading)' is displayed.110 //calls a slot in the sidebar model such that 'iTunes (isLoading)' is displayed.
111 emit (featureIsLoading(this));111 emit (featureIsLoading(this));
112 } else {
113 emit(showTrackModel(m_pTraktorTableModel));
114 }112 }
113
114 emit(showTrackModel(m_pTraktorTableModel));
115}115}
116116
117void TraktorFeature::activateChild(const QModelIndex& index) {117void TraktorFeature::activateChild(const QModelIndex& index) {
118118
=== modified file 'mixxx/src/soundmanager.h'
--- mixxx/src/soundmanager.h 2011-10-16 02:09:36 +0000
+++ mixxx/src/soundmanager.h 2012-05-31 20:47:26 +0000
@@ -92,7 +92,7 @@
92#ifdef __PORTAUDIO__92#ifdef __PORTAUDIO__
93 bool m_paInitialized;93 bool m_paInitialized;
94 unsigned int m_jackSampleRate;94 unsigned int m_jackSampleRate;
95#endif95#endif
96 QHash<AudioOutput, const AudioSource*> m_registeredSources;96 QHash<AudioOutput, const AudioSource*> m_registeredSources;
97 QHash<AudioInput, AudioDestination*> m_registeredDestinations;97 QHash<AudioInput, AudioDestination*> m_registeredDestinations;
9898
9999
=== modified file 'mixxx/src/widget/wsearchlineedit.cpp'
--- mixxx/src/widget/wsearchlineedit.cpp 2012-03-13 03:40:29 +0000
+++ mixxx/src/widget/wsearchlineedit.cpp 2012-05-31 20:47:26 +0000
@@ -117,7 +117,17 @@
117 }117 }
118}118}
119119
120// slot
120void WSearchLineEdit::restoreSearch(const QString& text) {121void WSearchLineEdit::restoreSearch(const QString& text) {
122 if(text.isNull()) {
123 // disable
124 setEnabled(false);
125 blockSignals(true);
126 setText("- - -");
127 blockSignals(false);
128 return;
129 }
130 setEnabled(true);
121 qDebug() << "WSearchLineEdit::restoreSearch(" << text << ")";131 qDebug() << "WSearchLineEdit::restoreSearch(" << text << ")";
122 blockSignals(true);132 blockSignals(true);
123 setText(text);133 setText(text);
@@ -136,6 +146,7 @@
136146
137void WSearchLineEdit::slotSetupTimer(const QString& text)147void WSearchLineEdit::slotSetupTimer(const QString& text)
138{148{
149 Q_UNUSED(text);
139 m_searchTimer.stop();150 m_searchTimer.stop();
140 //300 milliseconds timeout151 //300 milliseconds timeout
141 m_searchTimer.start(300);152 m_searchTimer.start(300);
142153
=== modified file 'mixxx/src/widget/wtracktableview.cpp'
--- mixxx/src/widget/wtracktableview.cpp 2012-05-04 05:38:59 +0000
+++ mixxx/src/widget/wtracktableview.cpp 2012-05-31 20:47:26 +0000
@@ -816,6 +816,15 @@
816}816}
817817
818void WTrackTableView::slotSendToAutoDJ() {818void WTrackTableView::slotSendToAutoDJ() {
819 // append to auto DJ
820 sendToAutoDJ(false); // bTop = false
821}
822
823void WTrackTableView::slotSendToAutoDJTop() {
824 sendToAutoDJ(true); // bTop = true
825}
826
827void WTrackTableView::sendToAutoDJ(bool bTop) {
819 if (!modelHasCapabilities(TrackModel::TRACKMODELCAPS_ADDTOAUTODJ)) {828 if (!modelHasCapabilities(TrackModel::TRACKMODELCAPS_ADDTOAUTODJ)) {
820 return;829 return;
821 }830 }
822831
=== modified file 'mixxx/src/widget/wtracktableview.h'
--- mixxx/src/widget/wtracktableview.h 2012-05-04 03:00:08 +0000
+++ mixxx/src/widget/wtracktableview.h 2012-05-31 20:47:26 +0000
@@ -46,6 +46,7 @@
46 void slotNextTrackInfo();46 void slotNextTrackInfo();
47 void slotPrevTrackInfo();47 void slotPrevTrackInfo();
48 void slotSendToAutoDJ();48 void slotSendToAutoDJ();
49 void slotSendToAutoDJTop();
49 void slotReloadTrackMetadata();50 void slotReloadTrackMetadata();
50 void slotResetPlayed();51 void slotResetPlayed();
51 void addSelectionToPlaylist(int iPlaylistId);52 void addSelectionToPlaylist(int iPlaylistId);
@@ -54,6 +55,7 @@
54 void doSortByColumn(int headerSection);55 void doSortByColumn(int headerSection);
5556
56 private:57 private:
58 void sendToAutoDJ(bool bTop);
57 void showTrackInfo(QModelIndex index);59 void showTrackInfo(QModelIndex index);
58 void createActions();60 void createActions();
59 void dragMoveEvent(QDragMoveEvent * event);61 void dragMoveEvent(QDragMoveEvent * event);
@@ -90,6 +92,7 @@
9092
91 // Send to Auto-DJ Action93 // Send to Auto-DJ Action
92 QAction *m_pAutoDJAct;94 QAction *m_pAutoDJAct;
95 QAction *m_pAutoDJTopAct;
9396
94 // Remove from table97 // Remove from table
95 QAction *m_pRemoveAct;98 QAction *m_pRemoveAct;

Subscribers

People subscribed via source and target branches