Merge pull request #2822 from jasp00/rm-track

Fix removal of track when notes are playing
This commit is contained in:
Javier Serrano Polo
2016-06-17 20:14:24 +00:00
committed by GitHub
67 changed files with 152 additions and 25 deletions

View File

@@ -28,12 +28,14 @@
#include <QtCore/QPair>
#include <QtCore/QMutex>
#include <QtCore/QThread>
#include <samplerate.h>
#include "Mixer.h"
#include "lmms_basics.h"
#include "TabWidget.h"
class AudioPort;
class Mixer;
class AudioDevice

View File

@@ -28,6 +28,7 @@
#include "AudioDevice.h"
#include "AudioDeviceSetupWidget.h"
#include "MicroTimer.h"
#include "Mixer.h"
class AudioDummy : public AudioDevice, public QThread

View File

@@ -29,7 +29,6 @@
#include <QtCore/QMutex>
#include <QtCore/QMutexLocker>
#include "Mixer.h"
#include "MemoryManager.h"
#include "PlayHandle.h"

View File

@@ -51,6 +51,8 @@ public:
#include <portaudio.h>
#endif
#include <QtCore/QSemaphore>
#include "AudioDevice.h"
#include "AudioDeviceSetupWidget.h"

View File

@@ -39,7 +39,6 @@
#include <math.h>
#include "lmms_basics.h"
#include "Mixer.h"
#include "templates.h"
#include "lmms_constants.h"
#include "interpolation.h"

View File

@@ -28,9 +28,9 @@
#define CONTROLLER_H
#include "Engine.h"
#include "Mixer.h"
#include "Model.h"
#include "JournallingObject.h"
#include "templates.h"
#include "ValueBuffer.h"
class ControllerDialog;

View File

@@ -32,6 +32,8 @@
#include <string.h>
#include "Mixer.h"
class DummyInstrument : public Instrument
{

View File

@@ -28,7 +28,6 @@
#include "Model.h"
#include "SerializingObject.h"
#include "Mixer.h"
#include "AutomatableModel.h"
class Effect;

View File

@@ -26,7 +26,6 @@
#define FX_MIXER_H
#include "Model.h"
#include "Mixer.h"
#include "EffectChain.h"
#include "JournallingObject.h"
#include "ThreadableJob.h"

View File

@@ -25,7 +25,6 @@
#ifndef INSTRUMENT_SOUND_SHAPING_H
#define INSTRUMENT_SOUND_SHAPING_H
#include "Mixer.h"
#include "ComboBoxModel.h"

View File

@@ -29,21 +29,11 @@
#include "lmmsconfig.h"
#ifndef LMMS_USE_3RDPARTY_LIBSRC
#include <samplerate.h>
#else
#ifndef OUT_OF_TREE_BUILD
#include "src/3rdparty/samplerate/samplerate.h"
#else
#include <samplerate.h>
#endif
#endif
#include <QtCore/QMutex>
#include <QtCore/QThread>
#include <QtCore/QVector>
#include <QtCore/QWaitCondition>
#include <samplerate.h>
#include "lmms_basics.h"
@@ -346,6 +336,9 @@ public:
inline bool isMetronomeActive() const { return m_metronomeActive; }
inline void setMetronomeActive(bool value = true) { m_metronomeActive = value; }
void requestChangeInModel();
void doneChangeInModel();
signals:
void qualitySettingsChanged();
@@ -388,6 +381,9 @@ private:
const surroundSampleFrame * renderNextBuffer();
void runChangesInModel();
QVector<AudioPort *> m_audioPorts;
@@ -420,6 +416,8 @@ private:
struct qualitySettings m_qualitySettings;
float m_masterGain;
bool m_isProcessing;
// audio device stuff
AudioDevice * m_audioDev;
AudioDevice * m_oldAudioDev;
@@ -444,6 +442,15 @@ private:
bool m_metronomeActive;
bool m_changesSignal;
bool m_waitForMixer;
unsigned int m_changes;
QMutex m_changesMutex;
QMutex m_doChangesMutex;
QMutex m_waitChangesMutex;
QWaitCondition m_changesMixerCondition;
QWaitCondition m_changesRequestCondition;
friend class LmmsCore;
friend class MixerWorkerThread;

View File

@@ -27,6 +27,7 @@
#include "AudioFileDevice.h"
#include "lmmsconfig.h"
#include "Mixer.h"
class ProjectRenderer : public QThread

View File

@@ -38,7 +38,6 @@
#include "lmms_basics.h"
#include "lmms_math.h"
#include "shared_object.h"
#include "Mixer.h"
#include "MemoryManager.h"

View File

@@ -25,9 +25,9 @@
#ifndef SAMPLE_PLAY_HANDLE_H
#define SAMPLE_PLAY_HANDLE_H
#include "Mixer.h"
#include "SampleBuffer.h"
#include "AutomatableModel.h"
#include "PlayHandle.h"
class BBTrack;
class SampleTCO;

View File

@@ -29,7 +29,8 @@
#include <QtCore/QList>
#include <QtCore/QPair>
#include "Mixer.h"
#include "MidiTime.h"
#include "PlayHandle.h"
#include "SampleBuffer.h"
class BBTrack;

View File

@@ -29,7 +29,7 @@
#include <QWidget>
#include <QPixmap>
#include "Mixer.h"
#include "lmms_basics.h"
class VisualizationWidget : public QWidget

View File

@@ -40,6 +40,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "InstrumentPlayHandle.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "Knob.h"
#include "Song.h"

View File

@@ -35,6 +35,7 @@
#include "Engine.h"
#include "Song.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "interpolation.h"
#include "gui_templates.h"

View File

@@ -32,6 +32,7 @@
#include "InstrumentTrack.h"
#include "Knob.h"
#include "LedCheckbox.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "Oscillator.h"
#include "PixmapButton.h"

View File

@@ -32,6 +32,7 @@
#include "gui_templates.h"
#include "InstrumentPlayHandle.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include <QApplication>
#include <QFileDialog>

View File

@@ -31,6 +31,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "KickerOsc.h"

View File

@@ -37,7 +37,6 @@
#include "InstrumentView.h"
#include "LedCheckbox.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include <QMutex>

View File

@@ -33,6 +33,7 @@
#include "Song.h"
#include "lmms_math.h"
#include "interpolation.h"
#include "Mixer.h"
#include "Oscillator.h"
#include "embed.cpp"

View File

@@ -40,6 +40,7 @@
#include "Engine.h"
#include "InstrumentPlayHandle.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include <QDomDocument>
#include <QFile>

View File

@@ -33,6 +33,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "Oscillator.h"
#include "PixmapButton.h"

View File

@@ -32,6 +32,7 @@
#include "base64.h"
#include "InstrumentTrack.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "PixmapButton.h"
#include "ToolTip.h"

View File

@@ -33,6 +33,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "InstrumentPlayHandle.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "Knob.h"
#include "Song.h"

View File

@@ -49,6 +49,7 @@ float frnd(float range)
#include "Song.h"
#include "MidiEvent.h"
#include "MidiTime.h"
#include "Mixer.h"
#include "embed.cpp"

View File

@@ -35,6 +35,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "PixmapButton.h"
#include "ToolTip.h"

View File

@@ -37,6 +37,7 @@
#include "gui_templates.h"
#include "GuiApplication.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "embed.cpp"

View File

@@ -33,6 +33,7 @@
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Knob.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "PixmapButton.h"
#include "SampleBuffer.h"

View File

@@ -38,6 +38,7 @@
#include "InstrumentTrack.h"
#include "VstPlugin.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "GuiApplication.h"
#include "PixmapButton.h"
#include "StringPairDrag.h"

View File

@@ -29,6 +29,7 @@
#include "vibed.h"
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "ToolTip.h"
#include "base64.h"

View File

@@ -48,6 +48,7 @@
#include "ConfigManager.h"
#include "GuiApplication.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "Song.h"
#include "templates.h"
#include "FileDialog.h"

View File

@@ -32,7 +32,6 @@
#include <QTimer>
#include <QWidget>
#include "Mixer.h"
#include "JournallingObject.h"
#include "communication.h"

View File

@@ -32,6 +32,7 @@
#include "ToolTip.h"
#include "Song.h"
#include "lmms_math.h"
#include "Mixer.h"
#include "interpolation.h"
#include "embed.cpp"

View File

@@ -42,6 +42,7 @@
#include "StringPairDrag.h"
#include "RemoteZynAddSubFx.h"
#include "LocalZynAddSubFx.h"
#include "Mixer.h"
#include "ControllerConnection.h"
#include "embed.cpp"

View File

@@ -27,6 +27,7 @@
#include "AutomationPattern.h"
#include "ControllerConnection.h"
#include "lmms_math.h"
#include "Mixer.h"
float AutomatableModel::s_copiedValue = 0;
long AutomatableModel::s_periodCounter = 0;

View File

@@ -28,6 +28,7 @@
#include "AutomationPatternView.h"
#include "AutomationTrack.h"
#include "Note.h"
#include "ProjectJournal.h"
#include "BBTrackContainer.h"
#include "Song.h"

View File

@@ -26,6 +26,7 @@
#include "BufferManager.h"
#include "FxMixer.h"
#include "Mixer.h"
#include "MixerWorkerThread.h"
#include "MixHelpers.h"
#include "Song.h"

View File

@@ -28,6 +28,7 @@
#include "embed.h"
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "NotePlayHandle.h"
#include "PresetPreviewPlayHandle.h"

View File

@@ -31,6 +31,7 @@
#include "EnvelopeAndLfoParameters.h"
#include "Instrument.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "NotePlayHandle.h"

View File

@@ -71,12 +71,17 @@ Mixer::Mixer( bool renderOnly ) :
m_numWorkers( QThread::idealThreadCount()-1 ),
m_qualitySettings( qualitySettings::Mode_Draft ),
m_masterGain( 1.0f ),
m_isProcessing( false ),
m_audioDev( NULL ),
m_oldAudioDev( NULL ),
m_audioDevStartFailed( false ),
m_globalMutex( QMutex::Recursive ),
m_profiler(),
m_metronomeActive(false)
m_metronomeActive(false),
m_changesSignal( false ),
m_waitForMixer( true ),
m_changes( 0 ),
m_doChangesMutex( QMutex::Recursive )
{
for( int i = 0; i < 2; ++i )
{
@@ -151,6 +156,8 @@ Mixer::Mixer( bool renderOnly ) :
Mixer::~Mixer()
{
runChangesInModel();
for( int w = 0; w < m_numWorkers; ++w )
{
m_workers[w]->quit();
@@ -208,6 +215,8 @@ void Mixer::startProcessing( bool _needs_fifo )
}
m_audioDev->startProcessing();
m_isProcessing = true;
}
@@ -215,6 +224,8 @@ void Mixer::startProcessing( bool _needs_fifo )
void Mixer::stopProcessing()
{
m_isProcessing = false;
if( m_fifoWriter != NULL )
{
m_fifoWriter->finish();
@@ -447,6 +458,8 @@ const surroundSampleFrame * Mixer::renderNextBuffer()
emit nextAudioBuffer( m_readBuf );
runChangesInModel();
// and trigger LFOs
EnvelopeAndLfoParameters::instances()->trigger();
Controller::triggerFrameCounter();
@@ -734,6 +747,58 @@ bool Mixer::hasNotePlayHandles()
void Mixer::requestChangeInModel()
{
m_changesMutex.lock();
m_changes++;
m_changesMutex.unlock();
m_doChangesMutex.lock();
if ( m_isProcessing && m_waitForMixer )
{
m_waitForMixer = false;
m_waitChangesMutex.lock();
m_changesSignal = true;
m_changesRequestCondition.wait( &m_waitChangesMutex );
m_waitChangesMutex.unlock();
}
}
void Mixer::doneChangeInModel()
{
m_changesMutex.lock();
bool moreChanges = --m_changes;
m_changesMutex.unlock();
if( !moreChanges )
{
m_waitForMixer = true;
m_changesSignal = false;
m_changesMixerCondition.wakeOne();
}
m_doChangesMutex.unlock();
}
void Mixer::runChangesInModel()
{
if( m_changesSignal )
{
m_waitChangesMutex.lock();
m_changesRequestCondition.wakeOne();
m_changesMixerCondition.wait( &m_waitChangesMutex );
m_waitChangesMutex.unlock();
}
}
AudioDevice * Mixer::tryAudioDevices()
{
bool success_ful = false;

View File

@@ -31,6 +31,7 @@
#include "Instrument.h"
#include "MidiEvent.h"
#include "MidiPort.h"
#include "Mixer.h"
#include "Song.h"

View File

@@ -31,6 +31,7 @@
#include "Instrument.h"
#include "InstrumentTrack.h"
#include "MidiPort.h"
#include "Mixer.h"
#include "DataFile.h"
#include "NotePlayHandle.h"
#include "PluginFactory.h"

View File

@@ -59,6 +59,7 @@
#include "endian_handling.h"
#include "Engine.h"
#include "interpolation.h"
#include "Mixer.h"
#include "templates.h"
#include "FileDialog.h"

View File

@@ -27,6 +27,7 @@
#include "BBTrack.h"
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "Pattern.h"
#include "SampleBuffer.h"
#include "SampleTrack.h"

View File

@@ -27,6 +27,7 @@
#include "BBTrack.h"
#include "Engine.h"
#include "InstrumentTrack.h"
#include "Mixer.h"
#include "Pattern.h"
#include "SampleBuffer.h"
#include "SampleTrack.h"

View File

@@ -34,6 +34,7 @@
#include "ConfigManager.h"
#include "Engine.h"
#include "LcdSpinBox.h"
#include "Mixer.h"
#include "gui_templates.h"
#include "templates.h"

View File

@@ -27,6 +27,7 @@
#include "AudioDevice.h"
#include "ConfigManager.h"
#include "debug.h"
#include "Mixer.h"

View File

@@ -34,6 +34,8 @@
#include <vorbis/vorbisenc.h>
#include <cstring>
#include "Mixer.h"
AudioFileOgg::AudioFileOgg( const sample_rate_t _sample_rate,
const ch_cnt_t _channels,

View File

@@ -25,6 +25,7 @@
#include "AudioFileWave.h"
#include "endian_handling.h"
#include "Mixer.h"
AudioFileWave::AudioFileWave( const sample_rate_t _sample_rate,

View File

@@ -40,6 +40,7 @@
#include "LcdSpinBox.h"
#include "AudioPort.h"
#include "MainWindow.h"
#include "Mixer.h"

View File

@@ -32,6 +32,7 @@
#include "endian_handling.h"
#include "LcdSpinBox.h"
#include "Mixer.h"
#include "Engine.h"
#include "gui_templates.h"
#include "templates.h"

View File

@@ -27,6 +27,7 @@
#include "EffectChain.h"
#include "FxMixer.h"
#include "Engine.h"
#include "Mixer.h"
#include "MixHelpers.h"
#include "BufferManager.h"
#include "ValueBuffer.h"

View File

@@ -48,6 +48,7 @@ void AudioPortAudioSetupUtil::updateChannels()
#include "templates.h"
#include "ComboBox.h"
#include "LcdSpinBox.h"
#include "Mixer.h"
AudioPortAudio::AudioPortAudio( bool & _success_ful, Mixer * _mixer ) :

View File

@@ -32,6 +32,7 @@
#include "endian_handling.h"
#include "ConfigManager.h"
#include "LcdSpinBox.h"
#include "Mixer.h"
#include "gui_templates.h"
#include "templates.h"
#include "Engine.h"

View File

@@ -33,6 +33,7 @@
#include "debug.h"
#include "ConfigManager.h"
#include "gui_templates.h"
#include "Mixer.h"
#include "templates.h"

View File

@@ -36,6 +36,7 @@
#include "templates.h"
#include "ComboBox.h"
#include "LcdSpinBox.h"
#include "Mixer.h"
AudioSoundIo::AudioSoundIo( bool & outSuccessful, Mixer * _mixer ) :
AudioDevice( tLimit<ch_cnt_t>(

View File

@@ -27,6 +27,7 @@
#include "MidiPort.h"
#include "MidiClient.h"
#include "Note.h"
#include "Song.h"

View File

@@ -34,6 +34,7 @@
#include "MidiController.h"
#include "MidiClient.h"
#include "MidiPortMenu.h"
#include "Mixer.h"
#include "LcdSpinBox.h"
#include "LedCheckbox.h"
#include "ComboBox.h"

View File

@@ -46,6 +46,7 @@
#include "Instrument.h"
#include "InstrumentTrack.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "DataFile.h"
#include "PluginFactory.h"
#include "PresetPreviewPlayHandle.h"

View File

@@ -43,6 +43,7 @@
#include "embed.h"
#include "GuiApplication.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "gui_templates.h"
#include "InstrumentTrack.h"
#include "Song.h"

View File

@@ -47,6 +47,7 @@
#include "LcdSpinBox.h"
#include "MainWindow.h"
#include "MeterDialog.h"
#include "Mixer.h"
#include "TextFloat.h"
#include "TimeLineWidget.h"
#include "ToolTip.h"

View File

@@ -30,6 +30,7 @@
#include "GuiApplication.h"
#include "gui_templates.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "embed.h"
#include "Engine.h"
#include "ToolTip.h"

View File

@@ -69,6 +69,7 @@
#include "MainWindow.h"
#include "MidiClient.h"
#include "MidiPortMenu.h"
#include "Mixer.h"
#include "MixHelpers.h"
#include "DataFile.h"
#include "NotePlayHandle.h"
@@ -154,11 +155,15 @@ int InstrumentTrack::baseNote() const
InstrumentTrack::~InstrumentTrack()
{
Engine::mixer()->requestChangeInModel();
// kill all running notes and the iph
silenceAllNotes( true );
// now we're save deleting the instrument
if( m_instrument ) delete m_instrument;
Engine::mixer()->doneChangeInModel();
}

View File

@@ -44,11 +44,13 @@
#include "StringPairDrag.h"
#include "Knob.h"
#include "MainWindow.h"
#include "Mixer.h"
#include "GuiApplication.h"
#include "EffectRackView.h"
#include "TrackLabelButton.h"
#include "ConfigManager.h"
#include "panning_constants.h"
#include "volume.h"
SampleTCO::SampleTCO( Track * _track ) :