diff --git a/src/qprojectM-pulseaudio/QPulseAudioThread.cpp b/src/qprojectM-pulseaudio/QPulseAudioThread.cpp index aab399ec2..c5b24db88 100644 --- a/src/qprojectM-pulseaudio/QPulseAudioThread.cpp +++ b/src/qprojectM-pulseaudio/QPulseAudioThread.cpp @@ -46,7 +46,7 @@ pa_io_event * QPulseAudioThread::stdio_event = NULL; char * QPulseAudioThread::server = NULL; char * QPulseAudioThread::stream_name = NULL, *QPulseAudioThread::client_name = NULL, *QPulseAudioThread::device =0; - QMutex QPulseAudioThread::s_audioMutex; + QMutex * QPulseAudioThread::s_audioMutex; int QPulseAudioThread::verbose = 0; pa_volume_t QPulseAudioThread::volume = PA_VOLUME_NORM; @@ -60,10 +60,10 @@ QPulseAudioThread::SourceContainer::const_iterator QPulseAudioThread::s_sourcePo QProjectM ** QPulseAudioThread::s_projectMPtr = 0; -QPulseAudioThread::QPulseAudioThread ( int _argc, char **_argv, QProjectM * _projectM, QObject * parent ) : QThread ( parent ), argc ( _argc ), argv ( _argv ), m_projectM ( _projectM ) +QPulseAudioThread::QPulseAudioThread ( int _argc, char **_argv, QProjectM * _projectM, QObject * parent, QMutex * audioMutex ) : QThread ( parent ), argc ( _argc ), argv ( _argv ), m_projectM ( _projectM ) { s_projectMPtr = new QProjectM*; - + s_audioMutex = audioMutex; *s_projectMPtr = m_projectM; } @@ -259,9 +259,7 @@ void QPulseAudioThread::pa_stream_success_callback(pa_stream *s, int success, vo if (pausedFlag) qDebug() << "pause"; else { - qDebug() << "play"; - s_audioMutex.unlock(); - qDebug() << "UNLOCK: success callback"; + qDebug() << "play"; } @@ -273,7 +271,7 @@ void QPulseAudioThread::pa_stream_success_callback(pa_stream *s, int success, vo QMutex * QPulseAudioThread::mutex() { -return &s_audioMutex; +return s_audioMutex; } void QPulseAudioThread::cork() @@ -456,7 +454,7 @@ void QPulseAudioThread::stdout_callback ( pa_mainloop_api*a, pa_io_event *e, int //int * int_buf = (int *) buffer; //qDebug() << "LOCK: add pcm"; - s_audioMutex.lock(); + s_audioMutex->lock(); QProjectM ** prjmPtr = static_cast ( userdata ); QProjectM * prjm = *prjmPtr; @@ -466,7 +464,7 @@ void QPulseAudioThread::stdout_callback ( pa_mainloop_api*a, pa_io_event *e, int prjm->pcm()->addPCMfloat ( buffer+buffer_index, buffer_length / ( sizeof ( float ) ) ); - s_audioMutex.unlock(); + s_audioMutex->unlock(); //qDebug() << "UNLOCK: add pcm"; assert ( buffer_length ); diff --git a/src/qprojectM-pulseaudio/QPulseAudioThread.hpp b/src/qprojectM-pulseaudio/QPulseAudioThread.hpp index d09b9e77c..dd8df1d3e 100644 --- a/src/qprojectM-pulseaudio/QPulseAudioThread.hpp +++ b/src/qprojectM-pulseaudio/QPulseAudioThread.hpp @@ -25,7 +25,7 @@ class QPulseAudioThread : public QThread public: typedef QHash SourceContainer; QPulseAudioThread () {} - QPulseAudioThread(int _argc, char **_argv, QProjectM * projectM, QObject *parent); + QPulseAudioThread(int _argc, char **_argv, QProjectM * projectM, QObject *parent, QMutex * audioMutex); virtual ~QPulseAudioThread(); void run(); void cleanup(); @@ -45,10 +45,7 @@ class QPulseAudioThread : public QThread public slots: inline void projectM_New(QProjectM * projectM) { m_projectM = projectM; - *s_projectMPtr = m_projectM; - qDebug() << "CORKING"; - cork(); - + *s_projectMPtr = m_projectM; } void cork(); @@ -89,7 +86,7 @@ class QPulseAudioThread : public QThread static void pa_stream_success_callback(pa_stream *s, int success, void *userdata); - static QMutex s_audioMutex; + static QMutex * s_audioMutex; static SourceContainer s_sourceList; static SourceContainer::const_iterator s_sourcePosition; int argc; diff --git a/src/qprojectM-pulseaudio/qprojectM-pulseaudio.cpp b/src/qprojectM-pulseaudio/qprojectM-pulseaudio.cpp index 903f9019e..bc21f3f46 100644 --- a/src/qprojectM-pulseaudio/qprojectM-pulseaudio.cpp +++ b/src/qprojectM-pulseaudio/qprojectM-pulseaudio.cpp @@ -93,7 +93,10 @@ int main ( int argc, char*argv[] ) std::string config_file; config_file = read_config(); - QProjectM_MainWindow * mainWindow = new QProjectM_MainWindow ( config_file, 0); + + QMutex audioMutex; + + QProjectM_MainWindow * mainWindow = new QProjectM_MainWindow ( config_file, &audioMutex); QAction pulseAction("Pulse audio settings...", mainWindow); @@ -101,18 +104,14 @@ int main ( int argc, char*argv[] ) mainWindow->registerSettingsAction(&pulseAction); mainWindow->show(); - QPulseAudioThread * pulseThread = new QPulseAudioThread(argc, argv, mainWindow->qprojectM(), mainWindow); - mainWindow->qprojectMWidget()->setAudioMutex(pulseThread->mutex()); - - // First projectM_Initialized() has already happened, so manually start + QPulseAudioThread * pulseThread = new QPulseAudioThread(argc, argv, mainWindow->qprojectM(), mainWindow, &audioMutex); + pulseThread->start(); QApplication::connect (mainWindow->qprojectMWidget(), SIGNAL(projectM_Initialized(QProjectM *)), pulseThread, SLOT(projectM_New(QProjectM*))); - QApplication::connect - (mainWindow->qprojectMWidget(), SIGNAL(projectM_BeforeDestroy()), pulseThread, SLOT(cork()), Qt::DirectConnection); - + QPulseAudioDeviceChooser devChooser(pulseThread, mainWindow); QApplication::connect(&pulseAction, SIGNAL(triggered()), &devChooser, SLOT(open()));