From d30512e906f8a5a85695a31050a230737e328ac3 Mon Sep 17 00:00:00 2001 From: jerl1 Date: Sat, 16 Nov 2002 00:24:16 +0000 Subject: [PATCH] BMidiPort is complete, just need some testing, compile and work with Midi_Player_Replacement (All other BMidi class from libmidi). BMidiPortConsumer act like a filter for sending data from new MidiKit to old MidiKit. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1955 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/midi/MidiPort.cpp | 524 +++++++++++++++++------------ src/kits/midi/MidiPortConsumer.cpp | 74 ++++ 2 files changed, 391 insertions(+), 207 deletions(-) create mode 100644 src/kits/midi/MidiPortConsumer.cpp diff --git a/src/kits/midi/MidiPort.cpp b/src/kits/midi/MidiPort.cpp index 25713638d7..1290ce0f01 100644 --- a/src/kits/midi/MidiPort.cpp +++ b/src/kits/midi/MidiPort.cpp @@ -1,207 +1,317 @@ -/** - * @file MidiPort.cpp - * - * @author Matthijs Hollemans - */ - -#include "debug.h" -#include "MidiPort.h" - -//------------------------------------------------------------------------------ - -BMidiPort::BMidiPort(const char* name) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -BMidiPort::~BMidiPort() -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -status_t BMidiPort::InitCheck() const -{ - UNIMPLEMENTED - return B_NO_INIT; -} - -//------------------------------------------------------------------------------ - -status_t BMidiPort::Open(const char* name) -{ - UNIMPLEMENTED - return B_ERROR; -} - -//------------------------------------------------------------------------------ - -void BMidiPort::Close() -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -const char* BMidiPort::PortName() const -{ - UNIMPLEMENTED - return NULL; -} - -//------------------------------------------------------------------------------ - -void BMidiPort::NoteOff( - uchar channel, uchar note, uchar velocity, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::NoteOn( - uchar channel, uchar note, uchar velocity, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::KeyPressure( - uchar channel, uchar note, uchar pressure, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::ControlChange( - uchar channel, uchar controlNumber, uchar controlValue, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::ProgramChange( - uchar channel, uchar programNumber, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::ChannelPressure(uchar channel, uchar pressure, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::SystemExclusive(void* data, size_t dataLength, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::SystemCommon( - uchar status, uchar data1, uchar data2, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::SystemRealTime(uchar status, uint32 time) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -status_t BMidiPort::Start() -{ - UNIMPLEMENTED - return B_ERROR; -} - -//------------------------------------------------------------------------------ - -void BMidiPort::Stop() -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -int32 BMidiPort::CountDevices() -{ - UNIMPLEMENTED - return 0; -} - -//------------------------------------------------------------------------------ - -status_t BMidiPort::GetDeviceName(int32 n, char* name, size_t bufSize) -{ - UNIMPLEMENTED - return B_ERROR; -} - -//------------------------------------------------------------------------------ - -void BMidiPort::_ReservedMidiPort1() { } -void BMidiPort::_ReservedMidiPort2() { } -void BMidiPort::_ReservedMidiPort3() { } - -//------------------------------------------------------------------------------ - -void BMidiPort::Run() -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -void BMidiPort::Dispatch( - const unsigned char* buffer, size_t size, bigtime_t when) -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - -ssize_t BMidiPort::Read(void* buffer, size_t numBytes) const -{ - UNIMPLEMENTED - return 0; -} - -//------------------------------------------------------------------------------ - -ssize_t BMidiPort::Write(void* buffer, size_t numBytes, uint32 time) const -{ - UNIMPLEMENTED - return 0; -} - -//------------------------------------------------------------------------------ - -void BMidiPort::ScanDevices() -{ - UNIMPLEMENTED -} - -//------------------------------------------------------------------------------ - +/** + * @file MidiPort.cpp + * + * @author Jerome Leveque + */ + +//---------------------------------------- + +#include "MidiPortConsumer.cpp" + +//---------------------------------------- + +#include +#include +#include + +#include + +//#define DEBUG + +//---------------------------------------- +//Public function + +BMidiPort::BMidiPort(const char *name = NULL) + : BMidi(), + remote_source(NULL), + remote_sink(NULL), + fCStatus(B_ERROR), + _fDevices(new BList) +{ + local_source = new BMidiLocalProducer("MidiPortGlue(out)"); + if (local_source != NULL) + local_source->Register(); + local_sink = new BMidiPortConsumer(this, "MidiPortGlue(in)"); + if (local_sink != NULL) + local_sink->Register(); + + ScanDevices(); + Open(name); +} + +//----------------- + +BMidiPort::~BMidiPort() +{ + Close(); + delete fName; + if (local_source) + local_source->Release(); + if (local_sink) + local_sink->Release(); +} + +//---------------------------------------- + +status_t BMidiPort::InitCheck() const +{ +return fCStatus; +} + +//----------------- + +status_t BMidiPort::Open(const char *name) +{ + if (name == NULL) + return fCStatus = B_ERROR; + + if (remote_source != NULL) + { + if (local_sink != NULL) + { + remote_source->Disconnect(local_sink); + } + remote_source->Release(); + remote_source = NULL; + } + if (remote_sink != NULL) + { + if (local_source != NULL) + { + local_source->Disconnect(remote_sink); + } + remote_sink->Release(); + remote_sink = NULL; + } + +int32 id = 0; + BMidiRoster *roster = BMidiRoster::MidiRoster(); + if (roster == NULL) + return fCStatus = B_ERROR; + BMidiEndpoint *endpt = NULL; + while ((endpt = roster->NextEndpoint(&id)) != NULL) + { + if (strcmp(endpt->Name(), name) == 0) + {//An endpoint have the same name as we want + fName = new char[strlen(name)]; + if (fName != NULL) + strcpy(fName, name); + if (endpt->IsProducer()) + { + remote_source = (BMidiProducer*)endpt; + endpt->Acquire(); //Because we always call Release() + } + if (endpt->IsConsumer()) + { + remote_sink = (BMidiConsumer*)endpt; + endpt->Acquire();//Because we always call Release() + if (local_source != NULL) + local_source->Connect(remote_sink); + } + } + endpt->Release(); + } +return fCStatus = B_OK; +} + +//----------------- + +void BMidiPort::Close() +{ + if ((local_sink != NULL) && (remote_source != NULL)) + { + remote_source->Disconnect(local_sink); + remote_source->Release(); + remote_source = NULL; + } + if ((local_source != NULL) && (remote_sink != NULL)) + { + local_source->Disconnect(remote_sink); + remote_sink->Release(); + remote_sink = NULL; + } +} + +//----------------- + +int32 BMidiPort::CountDevices() +{ +return _fDevices->CountItems(); +} + +//----------------- + +status_t BMidiPort::GetDeviceName(int32 n, char *name, size_t bufSize) +{ +BMidiEndpoint *endpt = (BMidiEndpoint*)_fDevices->ItemAt(n); + if (endpt == NULL) + return B_BAD_VALUE; + size_t size = strlen(endpt->Name()); + if (size > bufSize) + return B_NAME_TOO_LONG; + if (strlen(strcpy(name, endpt->Name())) == size) + return B_OK; + else + return B_ERROR; +} + +//----------------- + +const char *BMidiPort::PortName() const +{ +return fName; +} + +//---------------------------------------- + +void BMidiPort::NoteOff(uchar channel, uchar note, uchar velocity, uint32 time = B_NOW) +{ + local_source->SprayNoteOff(channel, note, velocity, 0); +} + +//----------------- + +void BMidiPort::NoteOn(uchar channel, uchar note, uchar velocity, uint32 time = B_NOW) +{ + local_source->SprayNoteOn(channel, note, velocity, 0); +} + +//----------------- + +void BMidiPort::KeyPressure(uchar channel, uchar note, uchar pressure, uint32 time = B_NOW) +{ + local_source->SprayKeyPressure(channel, note, pressure, 0); +} + +//----------------- + +void BMidiPort::ControlChange(uchar channel, uchar controlNumber, uchar controlValue, uint32 time = B_NOW) +{ + local_source->SprayControlChange(channel, controlNumber, controlValue, 0); +} + +//----------------- + +void BMidiPort::ProgramChange(uchar channel, uchar programNumber, uint32 time = B_NOW) +{ + local_source->SprayProgramChange(channel, programNumber, 0); +} + +//----------------- + +void BMidiPort::ChannelPressure(uchar channel, uchar pressure, uint32 time = B_NOW) +{ + local_source->SprayChannelPressure(channel, pressure, 0); +} + +//----------------- + +void BMidiPort::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time = B_NOW) +{ + local_source->SprayPitchBend(channel, lsb, msb, 0); +} + +//----------------- + +void BMidiPort::SystemExclusive(void* data, size_t dataLength, uint32 time = B_NOW) +{ + local_source->SpraySystemExclusive(data, dataLength, 0); +} + +//----------------- + +void BMidiPort::SystemCommon(uchar statusByte, uchar data1, uchar data2, uint32 time = B_NOW) +{ + local_source->SpraySystemCommon(statusByte, data1, data2, 0); +} + +//----------------- + +void BMidiPort::SystemRealTime(uchar statusByte, uint32 time = B_NOW) +{ + local_source->SpraySystemRealTime(statusByte, 0); +} + +//---------------------------------------- + +status_t BMidiPort::Start() +{ + if ((local_sink != NULL) && (remote_source != NULL)) + if ((fCStatus = remote_source->Connect(local_sink)) != B_OK) + return fCStatus; + else + { + return BMidi::Start(); + } + else + return fCStatus = B_ERROR; +} + +//----------------- + +void BMidiPort::Stop() +{ + if ((remote_source != NULL) && (local_sink != NULL)) + { + remote_source->Disconnect(local_sink); + } + BMidi::Stop(); +} + +//---------------------------------------- +//Private Function + +void BMidiPort::_ReservedMidiPort1() {} +void BMidiPort::_ReservedMidiPort2() {} +void BMidiPort::_ReservedMidiPort3() {} + +//---------------------------------------- +//Not Used function + +void BMidiPort::Dispatch(const unsigned char *buffer, size_t size, bigtime_t when) {} +ssize_t BMidiPort::Read(void *buffer, size_t numBytes) const { return 0; } +ssize_t BMidiPort::Write(void *buffer, size_t numBytes, uint32 time) const { return 0; } + +//----------------- +//Used function + +void BMidiPort::Run() +{ + while(KeepRunning()) + snooze(50000); +} + +//----------------- + +void BMidiPort::ScanDevices() +{ +int32 id = 0; + BMidiRoster *roster = BMidiRoster::MidiRoster(); + if (roster == NULL) + return; + BMidiEndpoint *endpt = NULL; + while ((endpt = roster->NextEndpoint(&id)) != NULL) + { + bool additem = true; + for (int32 i = 0; i < _fDevices->CountItems(); i++) + { + BMidiEndpoint *endpoint = (BMidiEndpoint*)_fDevices->ItemAt(i); + if (strcmp(endpt->Name(), endpoint->Name()) == 0) + additem = false; + } + if (additem) + _fDevices->AddItem(endpt); + endpt->Release(); + } +} + +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- +//---------------------------------------- diff --git a/src/kits/midi/MidiPortConsumer.cpp b/src/kits/midi/MidiPortConsumer.cpp new file mode 100644 index 0000000000..6c4d239240 --- /dev/null +++ b/src/kits/midi/MidiPortConsumer.cpp @@ -0,0 +1,74 @@ +/** + * @file MidiPort.cpp + * + * @author Jerome Leveque + */ + +//---------------------------------------- + +#include +#include + +//---------------------------------------- + +class BMidiPortConsumer : public BMidiLocalConsumer +{ +public: + BMidiPortConsumer(BMidiPort *toPort, const char *name = NULL) + : BMidiLocalConsumer(name), port(toPort) {} + + void NoteOff(uchar channel, uchar note, uchar velocity, bigtime_t time) + { + port->SprayNoteOff(channel, note, velocity, B_NOW); + } + + void NoteOn(uchar channel, uchar note, uchar velocity, bigtime_t time) + { + port->SprayNoteOn(channel, note, velocity, B_NOW); + } + + void KeyPressure(uchar channel, uchar note, uchar pressure, bigtime_t time) + { + port->SprayKeyPressure(channel, note, pressure, B_NOW); + } + + void ControlChange(uchar channel, uchar controlNumber, uchar controlValue, bigtime_t time) + { + port->SprayControlChange(channel, controlNumber, controlValue, B_NOW); + } + + void ProgramChange(uchar channel, uchar programNumber, bigtime_t time) + { + port->SprayProgramChange(channel, programNumber, B_NOW); + } + + void ChannelPressure(uchar channel, uchar pressure, bigtime_t time) + { + port->SprayChannelPressure(channel, pressure, B_NOW); + } + + void PitchBend(uchar channel, uchar lsb, uchar msb, bigtime_t time) + { + port->SprayPitchBend(channel, lsb, msb, B_NOW); + } + + void SystemExclusive(void *data, size_t dataLength, bigtime_t time) + { + port->SpraySystemExclusive(data, dataLength, B_NOW); + } + + void SystemCommon(uchar statusByte, uchar data1, uchar data2, bigtime_t time) + { + port->SpraySystemCommon(statusByte, data1, data2, B_NOW); + } + + void SystemRealTime(uchar statusByte, bigtime_t time) + { + port->SpraySystemRealTime(statusByte, B_NOW); + } + +private: + BMidiPort *port; + +}; +