* test for failure of open() should be == -1, not == 0
This causes Open() to behave as intended, only creating the
m_MidiReader thread if the MIDI device is successfully opened.
* unconditionally initialize m_Mutex in Open()
* conditionally close m_MidiReader in Close(), if NULL do nothing
* make m_MidiFd and m_MidiWrFd the same file descriptor. The MIDI
device special file can only be opened once at a time.
calling SetDeviceName.
The call trace goes something like this:
Synth.C
main() ==> Synth *synth=new Synth; ==> Synth::Synth()
==> MidiDevice::Get()->SetDeviceName(SpiralInfo::MIDIFILE);
SpiralSound/Midi.h
MidiDevice::Get() ==> m_Singleton=new MidiDevice;
==> MidiDevice::MidiDevice() ==> MidiDevice::Open()
==> MidiDevice::SetDeviceName
patches/patch-ao works around this problem by closing the prematurely
opened private variable representing the MIDI device, and setting it to
NULL. MidiDevice methods check for NULL and re-initialize the private
variable, this time opening the MIDI device path after SetDeviceName.
* Totally replaced audio core code with SSM plugin code,
modified for static linking.
* Uses 32bit floating point format internally.
* New midi device handling.
* New OSS output code.
* New funky sliders.
* Updated for fltk 1.1.0