zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 6063bcaa3de6faa77d4eee5d0853693d145bb62f
parent 195b083795bee6eb2d9e97688d5ff503e9ae7a55
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Sun, 10 Jan 2010 13:08:02 -0500

Oss: Fixing segfault

Diffstat:
Msrc/Nio/OssEngine.cpp | 19+++++++++++++------
Msrc/Nio/OssEngine.h | 2++
2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/Nio/OssEngine.cpp b/src/Nio/OssEngine.cpp @@ -39,7 +39,7 @@ using namespace std; OssEngine::OssEngine(OutMgr *out) - :AudioOut(out) + :AudioOut(out), engThread(NULL) { name = "OSS"; @@ -68,6 +68,7 @@ bool OssEngine::openAudio() if(audio.snd_handle == -1) { cerr << "ERROR - I can't open the " << config.cfg.LinuxOSSWaveOutDev << '.' << endl; + stopAudio(); return false; } ioctl(audio.snd_handle, SNDCTL_DSP_RESET, NULL); @@ -109,14 +110,14 @@ bool OssEngine::Start() } if(!good) { - Stop(); return false; } pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - pthread_create(&pThread, &attr, _thread, this); + engThread = new pthread_t; + pthread_create(engThread, &attr, _thread, this); return true; } @@ -128,7 +129,10 @@ void OssEngine::Stop() enabled = false; stopAudio(); stopMidi(); - pthread_join(pThread, NULL); + if(engThread) + pthread_join(*engThread, NULL); + delete engThread; + engThread = NULL; } void OssEngine::setMidiEn(bool nval) @@ -173,8 +177,11 @@ bool OssEngine::openMidi() { midi.handle = open(config.cfg.LinuxOSSSeqInDev, O_RDONLY, 0); - if(-1 == midi.handle) - return false; + if(-1 == midi.handle) { + stopMidi(); + midi.run = false; + return false; + } midi.run = true; return true; diff --git a/src/Nio/OssEngine.h b/src/Nio/OssEngine.h @@ -65,6 +65,8 @@ class OssEngine: public AudioOut, MidiIn void getMidi(unsigned char *midiPtr); + pthread_t *engThread; + struct { int handle; bool en;