Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/playermanager.cpp

Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines