![]() |
Mixxx
|
00001 // playermanager.cpp 00002 // Created 6/1/2010 by RJ Ryan (rryan@mit.edu) 00003 00004 #include "playermanager.h" 00005 00006 #include "controlobject.h" 00007 #include "trackinfoobject.h" 00008 #include "deck.h" 00009 #include "sampler.h" 00010 #include "analyserqueue.h" 00011 #include "controlobject.h" 00012 #include "samplerbank.h" 00013 #include "library/library.h" 00014 #include "library/trackcollection.h" 00015 #include "engine/enginemaster.h" 00016 00017 PlayerManager::PlayerManager(ConfigObject<ConfigValue> *pConfig, 00018 EngineMaster* pEngine, 00019 Library* pLibrary) 00020 : m_pConfig(pConfig), 00021 m_pEngine(pEngine), 00022 m_pLibrary(pLibrary), 00023 m_pCONumDecks(new ControlObject(ConfigKey("[Master]", "num_decks"))), 00024 m_pCONumSamplers(new ControlObject(ConfigKey("[Master]", "num_samplers"))) { 00025 00026 m_pAnalyserQueue = AnalyserQueue::createDefaultAnalyserQueue(m_pConfig); 00027 00028 // This is parented to the PlayerManager so does not need to be deleted 00029 SamplerBank* pSamplerBank = new SamplerBank(this); 00030 Q_UNUSED(pSamplerBank); 00031 00032 connect(m_pLibrary, SIGNAL(loadTrackToPlayer(TrackPointer, QString)), 00033 this, SLOT(slotLoadTrackToPlayer(TrackPointer, QString))); 00034 connect(m_pLibrary, SIGNAL(loadTrack(TrackPointer)), 00035 this, SLOT(slotLoadTrackIntoNextAvailableDeck(TrackPointer))); 00036 00037 // Redundant 00038 m_pCONumDecks->set(0); 00039 m_pCONumSamplers->set(0); 00040 } 00041 00042 PlayerManager::~PlayerManager() { 00043 // No need to delete anything because they are all parented to us and will 00044 // be destroyed when we are destroyed. 00045 m_players.clear(); 00046 m_decks.clear(); 00047 m_samplers.clear(); 00048 00049 delete m_pCONumSamplers; 00050 delete m_pCONumDecks; 00051 delete m_pAnalyserQueue; 00052 } 00053 00054 unsigned int PlayerManager::numDecks() const { 00055 return m_decks.size(); 00056 } 00057 00058 unsigned int PlayerManager::numSamplers() const { 00059 return m_samplers.size(); 00060 } 00061 00062 Deck* PlayerManager::addDeck() { 00063 Deck* pDeck; 00064 QString group = groupForDeck(numDecks()); 00065 int number = numDecks() + 1; 00066 00067 EngineChannel::ChannelOrientation orientation = EngineChannel::LEFT; 00068 if (number % 2 == 0) 00069 orientation = EngineChannel::RIGHT; 00070 00071 pDeck = new Deck(this, m_pConfig, m_pEngine, orientation, m_pAnalyserQueue, group); 00072 00073 // Connect the player to the analyser queue so that loaded tracks are 00074 // analysed. 00075 connect(pDeck, SIGNAL(newTrackLoaded(TrackPointer)), 00076 m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackPointer))); 00077 00078 Q_ASSERT(!m_players.contains(group)); 00079 m_players[group] = pDeck; 00080 m_decks.append(pDeck); 00081 m_pCONumDecks->add(1); 00082 00083 return pDeck; 00084 } 00085 00086 Sampler* PlayerManager::addSampler() { 00087 Sampler* pSampler; 00088 QString group = groupForSampler(numSamplers()); 00089 00090 // All samplers are in the center 00091 EngineChannel::ChannelOrientation orientation = EngineChannel::CENTER; 00092 00093 pSampler = new Sampler(this, m_pConfig, m_pEngine, orientation, group); 00094 00095 // Connect the player to the analyser queue so that loaded tracks are 00096 // analysed. 00097 connect(pSampler, SIGNAL(newTrackLoaded(TrackPointer)), 00098 m_pAnalyserQueue, SLOT(queueAnalyseTrack(TrackPointer))); 00099 00100 Q_ASSERT(!m_players.contains(group)); 00101 m_players[group] = pSampler; 00102 m_samplers.append(pSampler); 00103 m_pCONumSamplers->add(1); 00104 00105 return pSampler; 00106 } 00107 00108 BaseTrackPlayer* PlayerManager::getPlayer(QString group) const { 00109 if (m_players.contains(group)) { 00110 return m_players[group]; 00111 } 00112 return NULL; 00113 } 00114 00115 00116 Deck* PlayerManager::getDeck(unsigned int deck) const { 00117 if (deck < 1 || deck > numDecks()) { 00118 qWarning() << "Warning PlayerManager::getDeck() called with invalid index: " 00119 << deck; 00120 return NULL; 00121 } 00122 return m_decks[deck - 1]; 00123 } 00124 00125 Sampler* PlayerManager::getSampler(unsigned int sampler) const { 00126 if (sampler < 1 || sampler > numSamplers()) { 00127 qWarning() << "Warning PlayerManager::getSampler() called with invalid index: " 00128 << sampler; 00129 return NULL; 00130 } 00131 return m_samplers[sampler - 1]; 00132 } 00133 00134 void PlayerManager::slotLoadTrackToPlayer(TrackPointer pTrack, QString group) { 00135 BaseTrackPlayer* pPlayer = getPlayer(group); 00136 00137 if (pPlayer == NULL) { 00138 qWarning() << "Invalid group argument " << group << " to slotLoadTrackToPlayer."; 00139 return; 00140 } 00141 00142 pPlayer->slotLoadTrack(pTrack); 00143 } 00144 00145 void PlayerManager::slotLoadToPlayer(QString location, QString group) { 00146 BaseTrackPlayer* pPlayer = getPlayer(group); 00147 00148 if (pPlayer == NULL) { 00149 qWarning() << "Invalid group argument " << group << " to slotLoadToPlayer."; 00150 return; 00151 } 00152 00153 TrackPointer pTrack = lookupTrack(location); 00154 00155 //Load the track into the Player. 00156 pPlayer->slotLoadTrack(pTrack); 00157 } 00158 00159 void PlayerManager::slotLoadTrackIntoNextAvailableDeck(TrackPointer pTrack) 00160 { 00161 QList<Deck*>::iterator it = m_decks.begin(); 00162 while (it != m_decks.end()) { 00163 Deck* pDeck = *it; 00164 ControlObject* playControl = 00165 ControlObject::getControl(ConfigKey(pDeck->getGroup(), "play")); 00166 if (playControl && playControl->get() != 1.) { 00167 pDeck->slotLoadTrack(pTrack, false); 00168 break; 00169 } 00170 it++; 00171 } 00172 } 00173 00174 void PlayerManager::slotLoadTrackIntoNextAvailableSampler(TrackPointer pTrack) 00175 { 00176 QList<Sampler*>::iterator it = m_samplers.begin(); 00177 while (it != m_samplers.end()) { 00178 Sampler* pSampler = *it; 00179 ControlObject* playControl = 00180 ControlObject::getControl(ConfigKey(pSampler->getGroup(), "play")); 00181 if (playControl && playControl->get() != 1.) { 00182 pSampler->slotLoadTrack(pTrack, false); 00183 break; 00184 } 00185 it++; 00186 } 00187 } 00188 00189 TrackPointer PlayerManager::lookupTrack(QString location) { 00190 // Try to get TrackPointer from library, identified by location. 00191 TrackDAO& trackDao = m_pLibrary->getTrackCollection()->getTrackDAO(); 00192 TrackPointer pTrack = trackDao.getTrack(trackDao.getTrackId(location)); 00193 // If not, create a new TrackPointer 00194 if (pTrack == NULL) 00195 { 00196 pTrack = TrackPointer(new TrackInfoObject(location)); 00197 } 00198 return pTrack; 00199 } 00200 00201 void PlayerManager::slotLoadToDeck(QString location, int deck) { 00202 Deck* pDeck = getDeck(deck); 00203 00204 if (pDeck == NULL) { 00205 qWarning() << "Invalid deck argument " << deck << " to slotLoadToDeck."; 00206 return; 00207 } 00208 00209 TrackPointer pTrack = lookupTrack(location); 00210 00211 //Load the track into the Deck. 00212 pDeck->slotLoadTrack(pTrack); 00213 } 00214 00215 void PlayerManager::slotLoadToSampler(QString location, int sampler) { 00216 Sampler* pSampler = getSampler(sampler); 00217 00218 if (pSampler == NULL) { 00219 qWarning() << "Invalid sampler argument " << sampler << " to slotLoadToSampler."; 00220 return; 00221 } 00222 00223 TrackPointer pTrack = lookupTrack(location); 00224 00225 //Load the track into the Sampler. 00226 pSampler->slotLoadTrack(pTrack); 00227 } 00228