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:
@@ -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;
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user