Skip to content

Commit

Permalink
Don't restore audio device during exporting (LMMS#4083)
Browse files Browse the repository at this point in the history
Fixes deadlock on multi-track export with SDL
  • Loading branch information
PhysSong authored Mar 2, 2018
1 parent 3dd18b4 commit bd45599
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 7 deletions.
1 change: 1 addition & 0 deletions include/Mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ class EXPORT Mixer : public QObject
void setAudioDevice( AudioDevice * _dev,
const struct qualitySettings & _qs,
bool _needs_fifo );
void storeAudioDevice();
void restoreAudioDevice();
inline AudioDevice * audioDev()
{
Expand Down
1 change: 0 additions & 1 deletion include/ProjectRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ public slots:

AudioFileDevice * m_fileDev;
Mixer::qualitySettings m_qualitySettings;
Mixer::qualitySettings m_oldQualitySettings;

volatile int m_progress;
volatile bool m_abort;
Expand Down
1 change: 1 addition & 0 deletions include/RenderManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ private slots:
void restoreMutedState();

const Mixer::qualitySettings m_qualitySettings;
const Mixer::qualitySettings m_oldQualitySettings;
const OutputSettings m_outputSettings;
ProjectRenderer::ExportFileFormats m_format;
QString m_outputPath;
Expand Down
14 changes: 11 additions & 3 deletions src/core/Mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,8 +579,6 @@ void Mixer::setAudioDevice( AudioDevice * _dev )
{
stopProcessing();

m_oldAudioDev = m_audioDev;

if( _dev == NULL )
{
printf( "param _dev == NULL in Mixer::setAudioDevice(...). "
Expand Down Expand Up @@ -608,7 +606,6 @@ void Mixer::setAudioDevice( AudioDevice * _dev,
stopProcessing();

m_qualitySettings = _qs;
m_oldAudioDev = m_audioDev;

if( _dev == NULL )
{
Expand All @@ -630,6 +627,17 @@ void Mixer::setAudioDevice( AudioDevice * _dev,



void Mixer::storeAudioDevice()
{
if( !m_oldAudioDev )
{
m_oldAudioDev = m_audioDev;
}
}




void Mixer::restoreAudioDevice()
{
if( m_oldAudioDev != NULL )
Expand Down
3 changes: 0 additions & 3 deletions src/core/ProjectRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ ProjectRenderer::ProjectRenderer( const Mixer::qualitySettings & qualitySettings
QThread( Engine::mixer() ),
m_fileDev( NULL ),
m_qualitySettings( qualitySettings ),
m_oldQualitySettings( Engine::mixer()->currentQualitySettings() ),
m_progress( 0 ),
m_abort( false )
{
Expand All @@ -103,8 +102,6 @@ ProjectRenderer::ProjectRenderer( const Mixer::qualitySettings & qualitySettings

ProjectRenderer::~ProjectRenderer()
{
Engine::mixer()->restoreAudioDevice(); // also deletes audio-dev
Engine::mixer()->changeQuality( m_oldQualitySettings );
}


Expand Down
6 changes: 6 additions & 0 deletions src/core/RenderManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,22 @@ RenderManager::RenderManager(
ProjectRenderer::ExportFileFormats fmt,
QString outputPath) :
m_qualitySettings(qualitySettings),
m_oldQualitySettings( Engine::mixer()->currentQualitySettings() ),
m_outputSettings(outputSettings),
m_format(fmt),
m_outputPath(outputPath),
m_activeRenderer(NULL)
{
Engine::mixer()->storeAudioDevice();
}

RenderManager::~RenderManager()
{
delete m_activeRenderer;
m_activeRenderer = NULL;

Engine::mixer()->restoreAudioDevice(); // Also deletes audio dev.
Engine::mixer()->changeQuality( m_oldQualitySettings );
}

void RenderManager::abortProcessing()
Expand Down

0 comments on commit bd45599

Please sign in to comment.