diff --git a/headers/os/midi/Midi.h b/headers/os/midi/Midi.h index de6bb00388..08fdd2a701 100644 --- a/headers/os/midi/Midi.h +++ b/headers/os/midi/Midi.h @@ -116,7 +116,6 @@ private: volatile thread_id threadId; volatile bool isRunning; - uint8 _reserved1[3]; uint32 _reserved2[5]; }; diff --git a/headers/os/midi/MidiSynth.h b/headers/os/midi/MidiSynth.h index abf90c663c..1cb4b24502 100644 --- a/headers/os/midi/MidiSynth.h +++ b/headers/os/midi/MidiSynth.h @@ -83,8 +83,6 @@ private: bigtime_t creationTime; int16 transpose; bool inputEnabled; - - uint32 _reserved; }; #endif // _MIDI_SYNTH_H diff --git a/headers/os/midi2/MidiEndpoint.h b/headers/os/midi2/MidiEndpoint.h index d80d85ef32..00be7ce688 100644 --- a/headers/os/midi2/MidiEndpoint.h +++ b/headers/os/midi2/MidiEndpoint.h @@ -69,7 +69,7 @@ private: int32 fId; BString fName; int32 fRefCount; - BMessage* fProperties; + BMessage *fProperties; bool fIsLocal; bool fIsConsumer; bool fIsRegistered; diff --git a/headers/os/midi2/MidiProducer.h b/headers/os/midi2/MidiProducer.h index d58c1f9e05..ffcfadc0be 100644 --- a/headers/os/midi2/MidiProducer.h +++ b/headers/os/midi2/MidiProducer.h @@ -45,10 +45,10 @@ private: bool LockProducer() const; void UnlockProducer() const; + BList *fConnections; mutable BLocker fLocker; - BList fConnections; - - uint32 _reserved[10]; + + uint32 _reserved[2]; }; class BMidiLocalProducer : public BMidiProducer diff --git a/headers/os/midi2/MidiRoster.h b/headers/os/midi2/MidiRoster.h index 9c574f0406..d902dd07de 100644 --- a/headers/os/midi2/MidiRoster.h +++ b/headers/os/midi2/MidiRoster.h @@ -76,7 +76,7 @@ private: status_t SendRequest(BMessage*, BMessage*); BPrivate::BMidiRosterLooper* fLooper; - BMessenger fServer; + BMessenger *fServer; uint32 _reserved[16]; }; diff --git a/src/kits/midi/MidiSynth.cpp b/src/kits/midi/MidiSynth.cpp index 7e808ecebc..fdd1854597 100644 --- a/src/kits/midi/MidiSynth.cpp +++ b/src/kits/midi/MidiSynth.cpp @@ -58,8 +58,7 @@ status_t BMidiSynth::EnableInput(bool enable, bool loadInstruments) status_t err = B_OK; inputEnabled = enable; - if (loadInstruments) - { + if (loadInstruments) { err = be_synth->synth->LoadAllInstruments(); } diff --git a/src/kits/midi/SoftSynth.cpp b/src/kits/midi/SoftSynth.cpp index 6b657d3f91..ead561b677 100644 --- a/src/kits/midi/SoftSynth.cpp +++ b/src/kits/midi/SoftSynth.cpp @@ -49,8 +49,6 @@ BSoftSynth::BSoftSynth() fLimiterThreshold = 7; fReverbEnabled = true; fReverbMode = B_REVERB_BALLROOM; - - Init(); } @@ -63,13 +61,14 @@ BSoftSynth::~BSoftSynth() // didn't release our endpoints. Unload(); - Done(); } bool -BSoftSynth::InitCheck(void) const +BSoftSynth::InitCheck() { + if (!fSynth) + Init(); return fInitCheck; } @@ -77,8 +76,7 @@ BSoftSynth::InitCheck(void) const void BSoftSynth::Unload(void) { - /* TODO: purge samples from memory */ - + Done(); free(fInstrumentsFile); fInstrumentsFile = NULL; } @@ -121,9 +119,7 @@ BSoftSynth::SetInstrumentsFile(const char* path) status_t BSoftSynth::LoadAllInstruments() { - /* TODO: Should load all of the instruments from the sample bank. */ - - UNIMPLEMENTED + InitCheck(); return B_OK; } @@ -182,7 +178,6 @@ BSoftSynth::SetSamplingRate(int32 rate) { if (rate == 22050 || rate == 44100 || rate == 48000) { fSampleRate = rate; - Init(); return B_OK; } @@ -250,7 +245,6 @@ BSoftSynth::SetMaxVoices(int32 max) { if (max > 0 && max <= 4096) { fMaxVoices = max; - Init(); return B_OK; } @@ -439,6 +433,7 @@ BSoftSynth::AllNotesOff(bool justChannel, uint32 time) void BSoftSynth::Init() { + status_t err; fInitCheck = false; Done(); @@ -448,6 +443,12 @@ BSoftSynth::Init() fluid_settings_setint(fSettings, "synth.polyphony", fMaxVoices); fSynth = new_fluid_synth(fSettings); + if (!fSynth) + return; + + err = fluid_synth_sfload(fSynth, fInstrumentsFile, 1); + if (err < B_OK) + return; media_raw_audio_format format = media_raw_audio_format::wildcard; format.channel_count = 2; @@ -455,7 +456,7 @@ BSoftSynth::Init() format.format = media_raw_audio_format::B_AUDIO_FLOAT; fSoundPlayer = new BSoundPlayer(&format, "Soft Synth", &PlayBuffer, NULL, this); - status_t err = fSoundPlayer->InitCheck(); + err = fSoundPlayer->InitCheck(); if (err != B_OK) return; @@ -473,11 +474,16 @@ BSoftSynth::Done() fSoundPlayer->SetHasData(false); fSoundPlayer->Stop(); delete fSoundPlayer; + fSoundPlayer = NULL; } - if (fSynth) + if (fSynth) { delete_fluid_synth(fSynth); - if (fSettings) + fSynth = NULL; + } + if (fSettings) { delete_fluid_settings(fSettings); + fSettings = NULL; + } } diff --git a/src/kits/midi/SoftSynth.h b/src/kits/midi/SoftSynth.h index 5cba693f9c..dc02e0d35d 100644 --- a/src/kits/midi/SoftSynth.h +++ b/src/kits/midi/SoftSynth.h @@ -71,7 +71,7 @@ class BSoftSynth { public: - bool InitCheck() const; + bool InitCheck(); void Unload(); bool IsLoaded() const; diff --git a/src/kits/midi/Synth.cpp b/src/kits/midi/Synth.cpp index aaebd89e14..24f5eaa1df 100644 --- a/src/kits/midi/Synth.cpp +++ b/src/kits/midi/Synth.cpp @@ -24,7 +24,8 @@ #include #include "debug.h" -#include "Synth.h" +#include +#include #include "SoftSynth.h" BSynth* be_synth = NULL; @@ -58,12 +59,15 @@ BSynth::~BSynth() status_t BSynth::LoadSynthData(entry_ref* instrumentsFile) { - if (instrumentsFile == NULL) - { + if (instrumentsFile == NULL) { return B_BAD_VALUE; } - return synth->SetInstrumentsFile(instrumentsFile->name); + BPath path(instrumentsFile); + status_t err = path.InitCheck(); + if (err != B_OK) + return err; + return synth->SetInstrumentsFile(path.Path()); } //------------------------------------------------------------------------------ diff --git a/src/kits/midi2/MidiEndpoint.cpp b/src/kits/midi2/MidiEndpoint.cpp index f9baa8953a..ee826858c1 100644 --- a/src/kits/midi2/MidiEndpoint.cpp +++ b/src/kits/midi2/MidiEndpoint.cpp @@ -243,8 +243,8 @@ BMidiEndpoint::BMidiEndpoint(const char* name_) fIsLocal = false; fIsRegistered = false; fIsAlive = true; - - fProperties = new BMessage; + + fProperties = new BMessage(); } @@ -257,7 +257,6 @@ BMidiEndpoint::~BMidiEndpoint() "you should use Release() to dispose of endpoints; " "do not \"delete\" them or allocate them on the stack!"); } - delete fProperties; } diff --git a/src/kits/midi2/MidiProducer.cpp b/src/kits/midi2/MidiProducer.cpp index d75ca7858e..dcfc1ecca7 100644 --- a/src/kits/midi2/MidiProducer.cpp +++ b/src/kits/midi2/MidiProducer.cpp @@ -49,7 +49,7 @@ BMidiProducer::IsConnected(BMidiConsumer* cons) const if (cons != NULL) { if (LockProducer()) { - isConnected = fConnections.HasItem(cons); + isConnected = fConnections->HasItem(cons); UnlockProducer(); } } @@ -79,15 +79,16 @@ BMidiProducer::Connections() const BMidiProducer::BMidiProducer(const char* name) : BMidiEndpoint(name), - fLocker("MidiProducerLock"), - fConnections() + fLocker("MidiProducerLock") { fIsConsumer = false; + fConnections = new BList(); } BMidiProducer::~BMidiProducer() { + delete fConnections; } @@ -146,12 +147,13 @@ BMidiProducer::SendConnectRequest( void BMidiProducer::ConnectionMade(BMidiConsumer* consumer) { - ASSERT(consumer != NULL) + if (consumer == NULL) + return; if (LockProducer()) { - ASSERT(!fConnections.HasItem(consumer)) + ASSERT(!fConnections->HasItem(consumer)) - fConnections.AddItem(consumer); + fConnections->AddItem(consumer); UnlockProducer(); } @@ -164,12 +166,13 @@ BMidiProducer::ConnectionMade(BMidiConsumer* consumer) bool BMidiProducer::ConnectionBroken(BMidiConsumer* consumer) { - ASSERT(consumer != NULL) - + if (consumer == NULL) + return false; + bool wasConnected = false; if (LockProducer()) { - wasConnected = fConnections.RemoveItem(consumer); + wasConnected = fConnections->RemoveItem(consumer); UnlockProducer(); } @@ -184,7 +187,7 @@ BMidiProducer::ConnectionBroken(BMidiConsumer* consumer) int32 BMidiProducer::CountConsumers() const { - return fConnections.CountItems(); + return fConnections->CountItems(); } @@ -193,7 +196,7 @@ BMidiProducer::ConsumerAt(int32 index) const { ASSERT(index >= 0 && index < CountConsumers()) - return (BMidiConsumer*) fConnections.ItemAt(index); + return (BMidiConsumer*) fConnections->ItemAt(index); } diff --git a/src/kits/midi2/MidiRoster.cpp b/src/kits/midi2/MidiRoster.cpp index a8782b64fc..217bd04bca 100644 --- a/src/kits/midi2/MidiRoster.cpp +++ b/src/kits/midi2/MidiRoster.cpp @@ -213,7 +213,6 @@ BMidiRoster::MidiRoster() BMidiRoster::BMidiRoster() - : fServer(MIDI_SERVER_SIGNATURE) { TRACE(("BMidiRoster::BMidiRoster")) @@ -232,8 +231,9 @@ BMidiRoster::BMidiRoster() BMessage msg; msg.what = MSG_REGISTER_APP; msg.AddMessenger("midi:messenger", BMessenger(fLooper)); + fServer = new BMessenger(MIDI_SERVER_SIGNATURE); - if (fServer.SendMessage(&msg, fLooper, TIMEOUT) != B_OK) { + if (fServer->SendMessage(&msg, fLooper, TIMEOUT) != B_OK) { WARN("Cannot send request to midi_server"); return; } @@ -256,6 +256,7 @@ BMidiRoster::~BMidiRoster() fLooper->Lock(); fLooper->Quit(); } + delete fServer; } @@ -336,7 +337,7 @@ BMidiRoster::DeleteLocal(BMidiEndpoint* endp) // a reply from the server. If something went wrong, the // object will be destroyed regardless. - fServer.SendMessage(&msg, (BHandler*) NULL, TIMEOUT); + fServer->SendMessage(&msg, (BHandler*) NULL, TIMEOUT); // If the endpoint was successfully created, we must remove // it from the list of endpoints. If creation failed, then @@ -358,7 +359,7 @@ BMidiRoster::SendRequest(BMessage* msg, BMessage* reply) ASSERT(msg != NULL) ASSERT(reply != NULL) - status_t err = fServer.SendMessage(msg, reply, TIMEOUT, TIMEOUT); + status_t err = fServer->SendMessage(msg, reply, TIMEOUT, TIMEOUT); if (err != B_OK) { WARN("Cannot send request to midi_server"); diff --git a/src/servers/midi/Jamfile b/src/servers/midi/Jamfile index d4f64f0ca3..cc4c9938f0 100644 --- a/src/servers/midi/Jamfile +++ b/src/servers/midi/Jamfile @@ -1,5 +1,7 @@ SubDir HAIKU_TOP src servers midi ; +SetSubDirSupportedPlatformsBeOSCompatible ; + UsePrivateHeaders midi ; AddResources midi_server :