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

@@ -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 ) :