BaseTrackPlayer::BaseTrackPlayer(QObject* pParent, ConfigObject<ConfigValue>* pConfig, EngineMaster* pMixingEngine, EffectsManager* pEffectsManager, EngineChannel::ChannelOrientation defaultOrientation, QString group, bool defaultMaster, bool defaultHeadphones) : BasePlayer(pParent, group), m_pConfig(pConfig), m_pLoadedTrack(), m_pLowFilter(NULL), m_pMidFilter(NULL), m_pHighFilter(NULL), m_pLowFilterKill(NULL), m_pMidFilterKill(NULL), m_pHighFilterKill(NULL), m_replaygainPending(false) { m_pChannel = new EngineDeck(getGroup(), pConfig, pMixingEngine, pEffectsManager, defaultOrientation); EngineBuffer* pEngineBuffer = m_pChannel->getEngineBuffer(); pMixingEngine->addChannel(m_pChannel); // Set the routing option defaults for the master and headphone mixes. { ControlObject::set(ConfigKey(getGroup(), "master"), (double)defaultMaster); ControlObject::set(ConfigKey(getGroup(), "pfl"), (double)defaultHeadphones); } // Connect our signals and slots with the EngineBuffer's signals and // slots. This will let us know when the reader is done loading a track, and // let us request that the reader load a track. connect(this, SIGNAL(loadTrack(TrackPointer, bool)), pEngineBuffer, SLOT(slotLoadTrack(TrackPointer, bool))); connect(pEngineBuffer, SIGNAL(trackLoaded(TrackPointer)), this, SLOT(slotFinishLoading(TrackPointer))); connect(pEngineBuffer, SIGNAL(trackLoadFailed(TrackPointer, QString)), this, SLOT(slotLoadFailed(TrackPointer, QString))); connect(pEngineBuffer, SIGNAL(trackUnloaded(TrackPointer)), this, SLOT(slotUnloadTrack(TrackPointer))); // Get loop point control objects m_pLoopInPoint = new ControlObjectThread( getGroup(),"loop_start_position"); m_pLoopOutPoint = new ControlObjectThread( getGroup(),"loop_end_position"); // Duration of the current song, we create this one because nothing else does. m_pDuration = new ControlObject(ConfigKey(getGroup(), "duration")); // Waveform controls m_pWaveformZoom = new ControlPotmeter(ConfigKey(group, "waveform_zoom"), WaveformWidgetRenderer::s_waveformMinZoom, WaveformWidgetRenderer::s_waveformMaxZoom); m_pWaveformZoom->set(1.0); m_pWaveformZoom->setStepCount(WaveformWidgetRenderer::s_waveformMaxZoom - WaveformWidgetRenderer::s_waveformMinZoom); m_pWaveformZoom->setSmallStepCount(WaveformWidgetRenderer::s_waveformMaxZoom - WaveformWidgetRenderer::s_waveformMinZoom); m_pEndOfTrack = new ControlObject(ConfigKey(group, "end_of_track")); m_pEndOfTrack->set(0.); m_pPreGain = new ControlObjectSlave(ConfigKey(group, "pregain")); //BPM of the current song m_pBPM = new ControlObjectThread(group, "file_bpm"); m_pKey = new ControlObjectThread(group, "file_key"); m_pReplayGain = new ControlObjectThread(group, "replaygain"); m_pPlay = new ControlObjectThread(group, "play"); connect(m_pPlay, SIGNAL(valueChanged(double)), this, SLOT(slotPlayToggled(double))); }
BaseTrackPlayer::BaseTrackPlayer(QObject* pParent, ConfigObject<ConfigValue>* pConfig, EngineMaster* pMixingEngine, EngineChannel::ChannelOrientation defaultOrientation, QString group, bool defaultMaster, bool defaultHeadphones) : BasePlayer(pParent, group), m_pConfig(pConfig), m_pLoadedTrack() { // Need to strdup the string because EngineChannel will save the pointer, // but we might get deleted before the EngineChannel. TODO(XXX) // pSafeGroupName is leaked. It's like 5 bytes so whatever. const char* pSafeGroupName = strdup(getGroup().toAscii().constData()); m_pChannel = new EngineDeck(pSafeGroupName, pConfig, defaultOrientation); EngineBuffer* pEngineBuffer = m_pChannel->getEngineBuffer(); pMixingEngine->addChannel(m_pChannel); // Set the routing option defaults for the master and headphone mixes. { ControlObjectThreadMain* pMaster = new ControlObjectThreadMain( getGroup(), "master"); pMaster->slotSet(defaultMaster); delete pMaster; ControlObjectThreadMain* pHeadphones = new ControlObjectThreadMain( getGroup(), "pfl"); pHeadphones->slotSet(defaultHeadphones); delete pHeadphones; } // Connect our signals and slots with the EngineBuffer's signals and // slots. This will let us know when the reader is done loading a track, and // let us request that the reader load a track. connect(this, SIGNAL(loadTrack(TrackPointer, bool)), pEngineBuffer, SLOT(slotLoadTrack(TrackPointer, bool))); connect(pEngineBuffer, SIGNAL(trackLoaded(TrackPointer)), this, SLOT(slotFinishLoading(TrackPointer))); connect(pEngineBuffer, SIGNAL(trackLoadFailed(TrackPointer, QString)), this, SLOT(slotLoadFailed(TrackPointer, QString))); connect(pEngineBuffer, SIGNAL(trackUnloaded(TrackPointer)), this, SLOT(slotUnloadTrack(TrackPointer))); //Get cue point control object m_pCuePoint = new ControlObjectThreadMain( getGroup(),"cue_point"); // Get loop point control objects m_pLoopInPoint = new ControlObjectThreadMain( getGroup(),"loop_start_position"); m_pLoopOutPoint = new ControlObjectThreadMain( getGroup(),"loop_end_position"); //Playback position within the currently loaded track (in this player). m_pPlayPosition = new ControlObjectThreadMain( getGroup(), "playposition"); // Duration of the current song, we create this one because nothing else does. m_pDuration = new ControlObject(ConfigKey(getGroup(), "duration")); // Waveform controls m_pWaveformZoom = new ControlPotmeter(ConfigKey(group, "waveform_zoom"), WaveformWidgetRenderer::s_waveformMinZoom, WaveformWidgetRenderer::s_waveformMaxZoom); m_pWaveformZoom->set(1.0); m_pWaveformZoom->setStep(1.0); m_pWaveformZoom->setSmallStep(1.0); m_pEndOfTrack = new ControlObject(ConfigKey(group, "end_of_track")); m_pEndOfTrack->set(0.); //BPM of the current song m_pBPM = new ControlObjectThreadMain(group, "file_bpm"); m_pReplayGain = new ControlObjectThreadMain(group, "replaygain"); m_pPlay = new ControlObjectThreadMain(group, "play"); }