Fix various bugs when using JACK (#4005)

* Fix crash on closing
* Fix audio rendering artifacts
* Make LMMS work properly after rendering
This commit is contained in:
Hyunjin Song
2017-12-03 11:27:49 +09:00
committed by GitHub
parent d711b8b55e
commit dd4a73eb4b
2 changed files with 11 additions and 3 deletions

View File

@@ -37,6 +37,7 @@
#include <QtCore/QVector>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QMutexLocker>
#include "AudioDevice.h"
#include "AudioDeviceSetupWidget.h"
@@ -107,6 +108,7 @@ private:
bool m_active;
bool m_stopped;
QMutex m_processingMutex;
MidiJack *m_midiClient;
QVector<jack_port_t *> m_outputPorts;

View File

@@ -71,6 +71,7 @@ AudioJack::AudioJack( bool & _success_ful, Mixer* _mixer ) :
AudioJack::~AudioJack()
{
stopProcessing();
#ifdef AUDIO_PORT_SUPPORT
while( m_portMap.size() )
{
@@ -200,6 +201,7 @@ bool AudioJack::initJackClient()
void AudioJack::startProcessing()
{
QMutexLocker m( &m_processingMutex );
m_stopped = false;
if( m_active || m_client == NULL )
@@ -252,6 +254,8 @@ void AudioJack::startProcessing()
void AudioJack::stopProcessing()
{
QMutexLocker m( &m_processingMutex );
m_stopped = true;
}
@@ -338,6 +342,8 @@ void AudioJack::renamePort( AudioPort * _port )
int AudioJack::processCallback( jack_nframes_t _nframes, void * _udata )
{
QMutexLocker m( &m_processingMutex );
// do midi processing first so that midi input can
// add to the following sound processing
if( m_midiClient && _nframes > 0 )
@@ -397,15 +403,15 @@ int AudioJack::processCallback( jack_nframes_t _nframes, void * _udata )
if( m_framesDoneInCurBuf == m_framesToDoInCurBuf )
{
m_framesToDoInCurBuf = getNextBuffer( m_outBuf );
m_framesDoneInCurBuf = 0;
if( !m_framesToDoInCurBuf )
{
m_stopped = true;
break;
}
m_framesDoneInCurBuf = 0;
}
}
if( m_stopped == true )
if( _nframes != done )
{
for( int c = 0; c < channels(); ++c )
{