Fixed warnings.

Applied our coding style a bit, but the class members should be renamed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13526 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-07-07 12:42:57 +00:00
parent d1ab37cbcc
commit 7142b1a749
3 changed files with 327 additions and 497 deletions

View File

@ -33,8 +33,7 @@
//------------------------------------------------------------------------------
struct BMidiEvent
{
struct BMidiEvent {
BMidiEvent()
{
byte1 = 0;
@ -59,9 +58,9 @@ struct BMidiEvent
int32 tempo; // beats per minute
};
//------------------------------------------------------------------------------
static int compare_events(const void* event1, const void* event2)
static int
compare_events(const void* event1, const void* event2)
{
BMidiEvent* e1 = *((BMidiEvent**) event1);
BMidiEvent* e2 = *((BMidiEvent**) event2);
@ -69,7 +68,9 @@ static int compare_events(const void* event1, const void* event2)
return (e1->time - e2->time);
}
//------------------------------------------------------------------------------
// #pragma mark -
BMidiStore::BMidiStore()
{
@ -87,22 +88,21 @@ BMidiStore::BMidiStore()
instruments = new bool[128];
}
//------------------------------------------------------------------------------
BMidiStore::~BMidiStore()
{
for (int32 t = 0; t < events->CountItems(); ++t)
{
for (int32 t = 0; t < events->CountItems(); ++t) {
delete EventAt(t);
}
delete events;
delete[] instruments;
}
//------------------------------------------------------------------------------
void BMidiStore::NoteOff(
uchar channel, uchar note, uchar velocity, uint32 time)
void
BMidiStore::NoteOff(uchar channel, uchar note, uchar velocity,
uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -113,10 +113,10 @@ void BMidiStore::NoteOff(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::NoteOn(
uchar channel, uchar note, uchar velocity, uint32 time)
void
BMidiStore::NoteOn(uchar channel, uchar note,
uchar velocity, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -127,10 +127,10 @@ void BMidiStore::NoteOn(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::KeyPressure(
uchar channel, uchar note, uchar pressure, uint32 time)
void
BMidiStore::KeyPressure(uchar channel, uchar note,
uchar pressure, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -141,10 +141,10 @@ void BMidiStore::KeyPressure(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::ControlChange(
uchar channel, uchar controlNumber, uchar controlValue, uint32 time)
void
BMidiStore::ControlChange(uchar channel, uchar controlNumber,
uchar controlValue, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -155,10 +155,10 @@ void BMidiStore::ControlChange(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::ProgramChange(
uchar channel, uchar programNumber, uint32 time)
void
BMidiStore::ProgramChange(uchar channel, uchar programNumber,
uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -168,9 +168,9 @@ void BMidiStore::ProgramChange(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::ChannelPressure(uchar channel, uchar pressure, uint32 time)
void
BMidiStore::ChannelPressure(uchar channel, uchar pressure, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -180,9 +180,9 @@ void BMidiStore::ChannelPressure(uchar channel, uchar pressure, uint32 time)
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time)
void
BMidiStore::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -193,9 +193,9 @@ void BMidiStore::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time)
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::SystemExclusive(void* data, size_t length, uint32 time)
void
BMidiStore::SystemExclusive(void* data, size_t length, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -207,10 +207,10 @@ void BMidiStore::SystemExclusive(void* data, size_t length, uint32 time)
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::SystemCommon(
uchar status, uchar data1, uchar data2, uint32 time)
void
BMidiStore::SystemCommon(uchar status, uchar data1,
uchar data2, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -221,9 +221,9 @@ void BMidiStore::SystemCommon(
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::SystemRealTime(uchar status, uint32 time)
void
BMidiStore::SystemRealTime(uchar status, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -232,9 +232,9 @@ void BMidiStore::SystemRealTime(uchar status, uint32 time)
AddEvent(event);
}
//------------------------------------------------------------------------------
void BMidiStore::TempoChange(int32 beatsPerMinute, uint32 time)
void
BMidiStore::TempoChange(int32 beatsPerMinute, uint32 time)
{
BMidiEvent* event = new BMidiEvent;
event->time = time;
@ -246,49 +246,40 @@ void BMidiStore::TempoChange(int32 beatsPerMinute, uint32 time)
AddEvent(event);
}
//------------------------------------------------------------------------------
status_t BMidiStore::Import(const entry_ref* ref)
status_t
BMidiStore::Import(const entry_ref* ref)
{
memset(instruments, 0, 128 * sizeof(bool));
try
{
try {
file = new BFile(ref, B_READ_ONLY);
if (file->InitCheck() != B_OK)
{
throw file->InitCheck();
}
char fourcc[4];
ReadFourCC(fourcc);
if (strncmp(fourcc, "MThd", 4) != 0)
{
throw (status_t) B_BAD_MIDI_DATA;
}
if (Read32Bit() != 6)
{
throw (status_t) B_BAD_MIDI_DATA;
}
format = Read16Bit();
numTracks = Read16Bit();
ticksPerBeat = Read16Bit();
if (ticksPerBeat & 0x8000) // we don't support SMPTE
{ // time codes, only ticks
ticksPerBeat = 240; // per quarter note
if (ticksPerBeat & 0x8000) {
// we don't support SMPTE time codes,
// only ticks per quarter note
ticksPerBeat = 240;
}
currTrack = 0;
while (currTrack < numTracks)
{
while (currTrack < numTracks) {
ReadChunk();
}
}
catch (status_t e)
{
} catch (status_t e) {
delete file;
file = NULL;
return e;
@ -301,17 +292,14 @@ status_t BMidiStore::Import(const entry_ref* ref)
return B_OK;
}
//------------------------------------------------------------------------------
status_t BMidiStore::Export(const entry_ref* ref, int32 format)
status_t
BMidiStore::Export(const entry_ref* ref, int32 format)
{
try
{
try {
file = new BFile(ref, B_READ_WRITE);
if (file->InitCheck() != B_OK)
{
throw file->InitCheck();
}
SortEvents(true);
@ -322,9 +310,7 @@ status_t BMidiStore::Export(const entry_ref* ref, int32 format)
Write16Bit(ticksPerBeat);
WriteTrack();
}
catch (status_t e)
{
} catch (status_t e) {
delete file;
file = NULL;
return e;
@ -335,41 +321,40 @@ status_t BMidiStore::Export(const entry_ref* ref, int32 format)
return B_OK;
}
//------------------------------------------------------------------------------
void BMidiStore::SortEvents(bool force)
void
BMidiStore::SortEvents(bool force)
{
if (force || needsSorting)
{
if (force || needsSorting) {
events->SortItems(compare_events);
needsSorting = false;
}
}
//------------------------------------------------------------------------------
uint32 BMidiStore::CountEvents() const
uint32
BMidiStore::CountEvents() const
{
return events->CountItems();
}
//------------------------------------------------------------------------------
uint32 BMidiStore::CurrentEvent() const
uint32
BMidiStore::CurrentEvent() const
{
return currentEvent;
}
//------------------------------------------------------------------------------
void BMidiStore::SetCurrentEvent(uint32 eventNumber)
void
BMidiStore::SetCurrentEvent(uint32 eventNumber)
{
currentEvent = eventNumber;
}
//------------------------------------------------------------------------------
uint32 BMidiStore::DeltaOfEvent(uint32 eventNumber) const
uint32
BMidiStore::DeltaOfEvent(uint32 eventNumber) const
{
// Even though the BeBook says that the delta is the time span between
// an event and the first event in the list, this doesn't appear to be
@ -379,42 +364,40 @@ uint32 BMidiStore::DeltaOfEvent(uint32 eventNumber) const
BMidiEvent* event = EventAt(eventNumber);
if (event != NULL)
{
return GetEventTime(event);
}
return 0;
}
//------------------------------------------------------------------------------
uint32 BMidiStore::EventAtDelta(uint32 time) const
uint32
BMidiStore::EventAtDelta(uint32 time) const
{
for (int32 t = 0; t < events->CountItems(); ++t)
{
if (GetEventTime(EventAt(t)) >= time) { return t; }
for (int32 t = 0; t < events->CountItems(); ++t) {
if (GetEventTime(EventAt(t)) >= time)
return t;
}
return 0;
}
//------------------------------------------------------------------------------
uint32 BMidiStore::BeginTime() const
uint32
BMidiStore::BeginTime() const
{
return startTime;
}
//------------------------------------------------------------------------------
void BMidiStore::SetTempo(int32 beatsPerMinute_)
void
BMidiStore::SetTempo(int32 beatsPerMinute_)
{
beatsPerMinute = beatsPerMinute_;
}
//------------------------------------------------------------------------------
int32 BMidiStore::Tempo() const
int32
BMidiStore::Tempo() const
{
return beatsPerMinute;
}
@ -427,7 +410,8 @@ void BMidiStore::_ReservedMidiStore3() { }
//------------------------------------------------------------------------------
void BMidiStore::Run()
void
BMidiStore::Run()
{
// This rather compilicated Run() loop is not only used by BMidiStore
// but also by BMidiSynthFile. The "paused", "finished", and "looping"
@ -436,15 +420,13 @@ void BMidiStore::Run()
paused = false;
finished = false;
int32 timeAdjust;
uint32 baseTime;
int32 timeAdjust = 0;
uint32 baseTime = 0;
bool firstEvent = true;
bool resetTime = false;
while (KeepRunning())
{
if (paused)
{
while (KeepRunning()) {
if (paused) {
resetTime = true;
snooze(100000);
continue;
@ -452,40 +434,28 @@ void BMidiStore::Run()
BMidiEvent* event = EventAt(currentEvent);
if (event == NULL) // no more events
{
if (looping)
{
if (event == NULL) {
// no more events
if (looping) {
resetTime = true;
currentEvent = 0;
}
else
{
} else
break;
}
}
if (firstEvent)
{
if (firstEvent) {
startTime = B_NOW;
baseTime = startTime;
}
else if (resetTime)
{
} else if (resetTime)
baseTime = B_NOW;
}
if (firstEvent || resetTime)
{
if (firstEvent || resetTime) {
timeAdjust = baseTime - GetEventTime(event);
SprayEvent(event, baseTime);
firstEvent = false;
resetTime = false;
}
else
{
} else
SprayEvent(event, GetEventTime(event) + timeAdjust);
}
++currentEvent;
}
@ -494,29 +464,26 @@ void BMidiStore::Run()
paused = false;
if (hookFunc != NULL)
{
(*hookFunc)(hookArg);
}
}
//------------------------------------------------------------------------------
void BMidiStore::AddEvent(BMidiEvent* event)
void
BMidiStore::AddEvent(BMidiEvent* event)
{
events->AddItem(event);
needsSorting = true;
}
//------------------------------------------------------------------------------
void BMidiStore::SprayEvent(const BMidiEvent* event, uint32 time)
void
BMidiStore::SprayEvent(const BMidiEvent* event, uint32 time)
{
uchar byte1 = event->byte1;
uchar byte2 = event->byte2;
uchar byte3 = event->byte3;
switch (byte1 & 0xF0)
{
switch (byte1 & 0xF0) {
case B_NOTE_OFF:
SprayNoteOff((byte1 & 0x0F) + 1, byte2, byte3, time);
return;
@ -546,8 +513,7 @@ void BMidiStore::SprayEvent(const BMidiEvent* event, uint32 time)
return;
case 0xF0:
switch (byte1)
{
switch (byte1) {
case B_SYS_EX_START:
SpraySystemExclusive(event->data, event->length, time);
return;
@ -570,93 +536,80 @@ void BMidiStore::SprayEvent(const BMidiEvent* event, uint32 time)
return;
case B_SYSTEM_RESET:
if ((byte2 == 0x51) && (byte3 == 0x03))
{
if (byte2 == 0x51 && byte3 == 0x03) {
SprayTempoChange(event->tempo, time);
beatsPerMinute = event->tempo;
}
else
{
} else
SpraySystemRealTime(byte1, time);
}
return;
}
return;
}
}
//------------------------------------------------------------------------------
BMidiEvent* BMidiStore::EventAt(int32 index) const
BMidiEvent*
BMidiStore::EventAt(int32 index) const
{
return (BMidiEvent*) events->ItemAt(index);
return (BMidiEvent*)events->ItemAt(index);
}
//------------------------------------------------------------------------------
uint32 BMidiStore::GetEventTime(const BMidiEvent* event) const
uint32
BMidiStore::GetEventTime(const BMidiEvent* event) const
{
if (event->ticks)
{
return TicksToMilliseconds(event->time);
}
else
{
return event->time;
}
}
//------------------------------------------------------------------------------
uint32 BMidiStore::TicksToMilliseconds(uint32 ticks) const
uint32
BMidiStore::TicksToMilliseconds(uint32 ticks) const
{
return ((uint64) ticks * 60000) / (beatsPerMinute * ticksPerBeat);
return ((uint64)ticks * 60000) / (beatsPerMinute * ticksPerBeat);
}
//------------------------------------------------------------------------------
uint32 BMidiStore::MillisecondsToTicks(uint32 ms) const
uint32
BMidiStore::MillisecondsToTicks(uint32 ms) const
{
return ((uint64) ms * beatsPerMinute * ticksPerBeat) / 60000;
return ((uint64)ms * beatsPerMinute * ticksPerBeat) / 60000;
}
//------------------------------------------------------------------------------
void BMidiStore::ReadFourCC(char* fourcc)
void
BMidiStore::ReadFourCC(char* fourcc)
{
if (file->Read(fourcc, 4) != 4)
{
throw (status_t) B_BAD_MIDI_DATA;
}
}
//------------------------------------------------------------------------------
void BMidiStore::WriteFourCC(char a, char b, char c, char d)
void
BMidiStore::WriteFourCC(char a, char b, char c, char d)
{
char fourcc[4] = { a, b, c, d };
if (file->Write(fourcc, 4) != 4)
{
throw (status_t) B_ERROR;
}
}
//------------------------------------------------------------------------------
uint32 BMidiStore::Read32Bit()
uint32
BMidiStore::Read32Bit()
{
uint8 buf[4];
if (file->Read(buf, 4) != 4)
{
throw (status_t) B_BAD_MIDI_DATA;
}
return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
return (buf[0] << 24L) | (buf[1] << 16L) | (buf[2] << 8L) | buf[3];
}
//------------------------------------------------------------------------------
void BMidiStore::Write32Bit(uint32 val)
void
BMidiStore::Write32Bit(uint32 val)
{
uint8 buf[4];
buf[0] = (val >> 24) & 0xFF;
@ -665,128 +618,108 @@ void BMidiStore::Write32Bit(uint32 val)
buf[3] = val & 0xFF;
if (file->Write(buf, 4) != 4)
{
throw (status_t) B_ERROR;
}
}
//------------------------------------------------------------------------------
uint16 BMidiStore::Read16Bit()
uint16
BMidiStore::Read16Bit()
{
uint8 buf[2];
if (file->Read(buf, 2) != 2)
{
throw (status_t) B_BAD_MIDI_DATA;
}
return (buf[0] << 8) | buf[1];
}
//------------------------------------------------------------------------------
void BMidiStore::Write16Bit(uint16 val)
void
BMidiStore::Write16Bit(uint16 val)
{
uint8 buf[2];
buf[0] = (val >> 8) & 0xFF;
buf[1] = val & 0xFF;
if (file->Write(buf, 2) != 2)
{
throw (status_t) B_ERROR;
}
}
//------------------------------------------------------------------------------
uint8 BMidiStore::PeekByte()
uint8
BMidiStore::PeekByte()
{
uint8 buf;
if (file->Read(&buf, 1) != 1)
{
throw (status_t) B_BAD_MIDI_DATA;
}
if (file->Seek(-1, SEEK_CUR) < 0)
{
throw (status_t) B_ERROR;
}
return buf;
}
//------------------------------------------------------------------------------
uint8 BMidiStore::NextByte()
uint8
BMidiStore::NextByte()
{
uint8 buf;
if (file->Read(&buf, 1) != 1)
{
throw (status_t) B_BAD_MIDI_DATA;
}
--byteCount;
return buf;
}
//------------------------------------------------------------------------------
void BMidiStore::WriteByte(uint8 val)
void
BMidiStore::WriteByte(uint8 val)
{
if (file->Write(&val, 1) != 1)
{
throw (status_t) B_ERROR;
}
++byteCount;
}
//------------------------------------------------------------------------------
void BMidiStore::SkipBytes(uint32 length)
void
BMidiStore::SkipBytes(uint32 length)
{
if (file->Seek(length, SEEK_CUR) < 0)
{
if (file->Seek(length, SEEK_CUR) < 0) {
throw (status_t) B_BAD_MIDI_DATA;
}
byteCount -= length;
}
//------------------------------------------------------------------------------
uint32 BMidiStore::ReadVarLength()
uint32
BMidiStore::ReadVarLength()
{
uint32 val;
uint8 byte;
if ((val = NextByte()) & 0x80)
{
if ((val = NextByte()) & 0x80) {
val &= 0x7F;
do
{
do {
val = (val << 7) + ((byte = NextByte()) & 0x7F);
}
while (byte & 0x80);
} while (byte & 0x80);
}
return val;
}
//------------------------------------------------------------------------------
void BMidiStore::WriteVarLength(uint32 val)
void
BMidiStore::WriteVarLength(uint32 val)
{
uint32 buffer = val & 0x7F;
while ((val >>= 7))
{
while ((val >>= 7) != 0) {
buffer <<= 8;
buffer |= ((val & 0x7F) | 0x80);
}
while (true)
{
while (true) {
WriteByte(buffer);
if (buffer & 0x80)
buffer >>= 8;
@ -795,9 +728,9 @@ void BMidiStore::WriteVarLength(uint32 val)
}
}
//------------------------------------------------------------------------------
void BMidiStore::ReadChunk()
void
BMidiStore::ReadChunk()
{
char fourcc[4];
ReadFourCC(fourcc);
@ -805,11 +738,8 @@ void BMidiStore::ReadChunk()
byteCount = Read32Bit();
if (strncmp(fourcc, "MTrk", 4) == 0)
{
ReadTrack();
}
else
{
else {
TRACE(("Skipping '%c%c%c%c' chunk (%lu bytes)",
fourcc[0], fourcc[1], fourcc[2], fourcc[3], byteCount))
@ -817,9 +747,9 @@ void BMidiStore::ReadChunk()
}
}
//------------------------------------------------------------------------------
void BMidiStore::ReadTrack()
void
BMidiStore::ReadTrack()
{
uint8 status = 0;
uint8 data1;
@ -828,18 +758,14 @@ void BMidiStore::ReadTrack()
totalTicks = 0;
while (byteCount > 0)
{
while (byteCount > 0) {
uint32 ticks = ReadVarLength();
totalTicks += ticks;
if (PeekByte() & 0x80)
{
status = NextByte();
}
switch (status & 0xF0)
{
switch (status & 0xF0) {
case B_NOTE_OFF:
case B_NOTE_ON:
case B_KEY_PRESSURE:
@ -867,14 +793,11 @@ void BMidiStore::ReadTrack()
AddEvent(event);
if ((status & 0xF0) == B_PROGRAM_CHANGE)
{
instruments[data1] = true;
}
break;
case 0xF0:
switch (status)
{
switch (status) {
case B_SYS_EX_START:
ReadSystemExclusive();
break;
@ -930,26 +853,25 @@ void BMidiStore::ReadTrack()
++currTrack;
}
//------------------------------------------------------------------------------
void BMidiStore::ReadSystemExclusive()
void
BMidiStore::ReadSystemExclusive()
{
// We do not import sysex's from MIDI files.
SkipBytes(ReadVarLength());
}
//------------------------------------------------------------------------------
void BMidiStore::ReadMetaEvent()
void
BMidiStore::ReadMetaEvent()
{
// We only import the Tempo Change meta event.
uint8 type = NextByte();
uint32 length = ReadVarLength();
if ((type == 0x51) && (length == 3))
{
if (type == 0x51 && length == 3) {
uchar data[3];
data[0] = NextByte();
data[1] = NextByte();
@ -964,51 +886,38 @@ void BMidiStore::ReadMetaEvent()
event->byte3 = 0x03;
event->tempo = 60000000 / val;
AddEvent(event);
}
else
{
} else
SkipBytes(length);
}
}
//------------------------------------------------------------------------------
void BMidiStore::WriteTrack()
void
BMidiStore::WriteTrack()
{
WriteFourCC('M', 'T', 'r', 'k');
off_t lengthPos = file->Position();
Write32Bit(0);
byteCount = 0;
uint32 oldTime;
uint32 oldTime = 0;
uint32 newTime;
for (uint32 t = 0; t < CountEvents(); ++t)
{
for (uint32 t = 0; t < CountEvents(); ++t) {
BMidiEvent* event = EventAt(t);
if (event->ticks)
{
newTime = event->time;
}
else
{
newTime = MillisecondsToTicks(event->time);
}
if (t == 0)
{
WriteVarLength(0);
}
else
{
WriteVarLength(newTime - oldTime);
}
oldTime = newTime;
switch (event->byte1 & 0xF0)
{
switch (event->byte1 & 0xF0) {
case B_NOTE_OFF:
case B_NOTE_ON:
case B_KEY_PRESSURE:
@ -1026,8 +935,7 @@ void BMidiStore::WriteTrack()
break;
case 0xF0:
switch (event->byte1)
{
switch (event->byte1) {
case B_SYS_EX_START:
// We do not export sysex's.
break;
@ -1060,7 +968,6 @@ void BMidiStore::WriteTrack()
break;
}
break;
}
}
@ -1074,14 +981,13 @@ void BMidiStore::WriteTrack()
file->Seek(0, SEEK_END);
}
//------------------------------------------------------------------------------
void BMidiStore::WriteMetaEvent(BMidiEvent* event)
void
BMidiStore::WriteMetaEvent(BMidiEvent* event)
{
// We only export the Tempo Change meta event.
if ((event->byte2 == 0x51) && (event->byte3 == 0x03))
{
if (event->byte2 == 0x51 && event->byte3 == 0x03) {
uint32 val = 60000000 / event->tempo;
WriteByte(0xFF);
@ -1093,5 +999,3 @@ void BMidiStore::WriteMetaEvent(BMidiEvent* event)
}
}
//------------------------------------------------------------------------------

View File

@ -26,9 +26,9 @@
#include "MidiRosterLooper.h"
#include "protocol.h"
//------------------------------------------------------------------------------
const char* BMidiEndpoint::Name() const
const char*
BMidiEndpoint::Name() const
{
const char* str = NULL;
@ -36,8 +36,7 @@ const char* BMidiEndpoint::Name() const
// BString::String() can change when the string is modified,
// e.g. to allocate more space. That's why we lock here too.
if (LockLooper())
{
if (LockLooper()) {
str = name.String();
UnlockLooper();
}
@ -45,106 +44,96 @@ const char* BMidiEndpoint::Name() const
return str;
}
//------------------------------------------------------------------------------
void BMidiEndpoint::SetName(const char* name_)
void
BMidiEndpoint::SetName(const char* newName)
{
if (name_ == NULL)
{
if (newName == NULL) {
WARN("SetName() does not accept a NULL name");
return;
}
else if (IsRemote())
{
if (IsRemote()) {
WARN("SetName() is not allowed on remote endpoints");
return;
}
else if (!IsValid())
{
if (!IsValid())
return;
}
else if (name != name_)
{
BMessage msg;
msg.AddString("midi:name", name_);
if (SendChangeRequest(&msg) == B_OK)
{
if (LockLooper())
{
name.SetTo(name_);
if (name != newName) {
BMessage msg;
msg.AddString("midi:name", newName);
if (SendChangeRequest(&msg) == B_OK) {
if (LockLooper()) {
name.SetTo(newName);
UnlockLooper();
}
}
}
}
//------------------------------------------------------------------------------
int32 BMidiEndpoint::ID() const
int32
BMidiEndpoint::ID() const
{
return id;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsProducer() const
bool
BMidiEndpoint::IsProducer() const
{
return !isConsumer;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsConsumer() const
bool
BMidiEndpoint::IsConsumer() const
{
return isConsumer;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsRemote() const
bool
BMidiEndpoint::IsRemote() const
{
return !isLocal;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsLocal() const
bool
BMidiEndpoint::IsLocal() const
{
return isLocal;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsPersistent() const
bool
BMidiEndpoint::IsPersistent() const
{
return false;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsValid() const
bool
BMidiEndpoint::IsValid() const
{
if (IsLocal())
{
return (ID() > 0);
}
else // remote endpoint
{
// remote endpoint
return IsRegistered();
}
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::Release()
status_t
BMidiEndpoint::Release()
{
int32 old = atomic_add(&refCount, -1);
TRACE(("BMidiEndpoint::Release refCount is now %ld", old - 1))
if (old == 1)
{
if (old == 1) {
// If the reference count of a local endpoint drops to zero,
// we must delete it. The destructor of BMidiLocalXXX calls
// BMidiRoster::DeleteLocal(), which does all the hard work.
@ -152,57 +141,47 @@ status_t BMidiEndpoint::Release()
// deleted if that remote endpoint no longer exists.
if (IsLocal() || !isAlive)
{
delete this;
}
}
else if (old <= 0)
{
} else if (old <= 0) {
debugger("too many calls to Release()");
}
return B_OK;
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::Acquire()
status_t
BMidiEndpoint::Acquire()
{
int32 old = atomic_add(&refCount, 1);
#ifdef DEBUG
int32 old =
#endif
atomic_add(&refCount, 1);
TRACE(("BMidiEndpoint::Acquire refCount is now %ld", old + 1))
return B_OK;
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::SetProperties(const BMessage* properties_)
status_t
BMidiEndpoint::SetProperties(const BMessage* properties_)
{
if (properties_ == NULL)
{
if (properties_ == NULL) {
WARN("SetProperties() does not accept a NULL message")
return B_BAD_VALUE;
}
else if (IsRemote())
{
} else if (IsRemote()) {
WARN("SetProperties() is not allowed on remote endpoints");
return B_ERROR;
}
else if (!IsValid())
{
} else if (!IsValid()) {
return B_ERROR;
}
else
{
} else {
BMessage msg;
msg.AddMessage("midi:properties", properties_);
status_t err = SendChangeRequest(&msg);
if (err == B_OK)
{
if (LockLooper())
{
if (err == B_OK) {
if (LockLooper()) {
*properties = *properties_;
UnlockLooper();
}
@ -212,83 +191,66 @@ status_t BMidiEndpoint::SetProperties(const BMessage* properties_)
}
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::GetProperties(BMessage* properties_) const
status_t
BMidiEndpoint::GetProperties(BMessage* _properties) const
{
if (properties_ == NULL)
{
if (_properties == NULL) {
WARN("GetProperties() does not accept NULL properties")
return B_BAD_VALUE;
}
if (LockLooper())
{
*properties_ = *properties;
if (LockLooper()) {
*_properties = *properties;
UnlockLooper();
}
return B_OK;
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::Register(void)
status_t
BMidiEndpoint::Register(void)
{
if (IsRemote())
{
if (IsRemote()) {
WARN("You cannot Register() remote endpoints");
return B_ERROR;
}
else if (IsRegistered())
{
if (IsRegistered()) {
WARN("This endpoint is already registered");
return B_OK;
}
else if (!IsValid())
{
if (!IsValid())
return B_ERROR;
}
else
{
return SendRegisterRequest(true);
}
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::Unregister(void)
status_t
BMidiEndpoint::Unregister(void)
{
if (IsRemote())
{
if (IsRemote()) {
WARN("You cannot Unregister() remote endpoints");
return B_ERROR;
}
else if (!IsRegistered())
{
if (!IsRegistered()) {
WARN("This endpoint is already unregistered");
return B_OK;
}
else if (!IsValid())
{
if (!IsValid())
return B_ERROR;
}
else
{
return SendRegisterRequest(false);
}
}
//------------------------------------------------------------------------------
BMidiEndpoint::BMidiEndpoint(const char* name_)
{
TRACE(("BMidiEndpoint::BMidiEndpoint"))
if (name_ != NULL)
{
name.SetTo(name_);
}
id = 0;
refCount = 0;
@ -299,14 +261,12 @@ BMidiEndpoint::BMidiEndpoint(const char* name_)
properties = new BMessage;
}
//------------------------------------------------------------------------------
BMidiEndpoint::~BMidiEndpoint()
{
TRACE(("BMidiEndpoint::~BMidiEndpoint (%p)", this))
if (refCount > 0)
{
if (refCount > 0) {
debugger(
"you should use Release() to dispose of endpoints; "
"do not \"delete\" them or allocate them on the stack!");
@ -328,16 +288,15 @@ void BMidiEndpoint::_Reserved8() { }
//------------------------------------------------------------------------------
status_t BMidiEndpoint::SendRegisterRequest(bool registered)
status_t
BMidiEndpoint::SendRegisterRequest(bool registered)
{
BMessage msg;
msg.AddBool("midi:registered", registered);
status_t err = SendChangeRequest(&msg);
if (err == B_OK)
{
if (LockLooper())
{
if (err == B_OK) {
if (LockLooper()) {
isRegistered = registered;
UnlockLooper();
}
@ -346,9 +305,9 @@ status_t BMidiEndpoint::SendRegisterRequest(bool registered)
return err;
}
//------------------------------------------------------------------------------
status_t BMidiEndpoint::SendChangeRequest(BMessage* msg)
status_t
BMidiEndpoint::SendChangeRequest(BMessage* msg)
{
ASSERT(msg != NULL)
@ -357,20 +316,19 @@ status_t BMidiEndpoint::SendChangeRequest(BMessage* msg)
BMessage reply;
status_t err = BMidiRoster::MidiRoster()->SendRequest(msg, &reply);
if (err != B_OK) { return err; }
if (err != B_OK)
return err;
status_t res;
if (reply.FindInt32("midi:result", &res) == B_OK)
{
return res;
}
return B_ERROR;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::IsRegistered() const
bool
BMidiEndpoint::IsRegistered() const
{
// No need to protect this with a lock, because reading
// and writing a bool is always an atomic operation.
@ -378,18 +336,17 @@ bool BMidiEndpoint::IsRegistered() const
return isRegistered;
}
//------------------------------------------------------------------------------
bool BMidiEndpoint::LockLooper() const
bool
BMidiEndpoint::LockLooper() const
{
return BMidiRoster::MidiRoster()->looper->Lock();
}
//------------------------------------------------------------------------------
void BMidiEndpoint::UnlockLooper() const
void
BMidiEndpoint::UnlockLooper() const
{
BMidiRoster::MidiRoster()->looper->Unlock();
}
//------------------------------------------------------------------------------

View File

@ -28,7 +28,6 @@
#include "MidiRoster.h"
#include "protocol.h"
//------------------------------------------------------------------------------
BMidiLocalProducer::BMidiLocalProducer(const char* name)
: BMidiProducer(name)
@ -41,7 +40,6 @@ BMidiLocalProducer::BMidiLocalProducer(const char* name)
BMidiRoster::MidiRoster()->CreateLocal(this);
}
//------------------------------------------------------------------------------
BMidiLocalProducer::~BMidiLocalProducer()
{
@ -50,9 +48,9 @@ BMidiLocalProducer::~BMidiLocalProducer()
BMidiRoster::MidiRoster()->DeleteLocal(this);
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::Connected(BMidiConsumer* cons)
void
BMidiLocalProducer::Connected(BMidiConsumer* cons)
{
ASSERT(cons != NULL)
TRACE(("Connected() %ld to %ld", ID(), cons->ID()))
@ -60,9 +58,9 @@ void BMidiLocalProducer::Connected(BMidiConsumer* cons)
// Do nothing.
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::Disconnected(BMidiConsumer* cons)
void
BMidiLocalProducer::Disconnected(BMidiConsumer* cons)
{
ASSERT(cons != NULL)
TRACE(("Disconnected() %ld from %ld", ID(), cons->ID()))
@ -70,165 +68,143 @@ void BMidiLocalProducer::Disconnected(BMidiConsumer* cons)
// Do nothing.
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayData(
void* data, size_t length, bool atomic, bigtime_t time) const
void
BMidiLocalProducer::SprayData(void* data, size_t length,
bool atomic, bigtime_t time) const
{
SprayEvent(data, length, atomic, time);
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayNoteOff(
uchar channel, uchar note, uchar velocity, bigtime_t time) const
void
BMidiLocalProducer::SprayNoteOff(uchar channel, uchar note,
uchar velocity, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[3];
data[0] = B_NOTE_OFF + channel;
data[1] = note;
data[2] = velocity;
SprayEvent(&data, 3, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayNoteOn(
uchar channel, uchar note, uchar velocity, bigtime_t time) const
void
BMidiLocalProducer::SprayNoteOn(uchar channel, uchar note,
uchar velocity, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[3];
data[0] = B_NOTE_ON + channel;
data[1] = note;
data[2] = velocity;
SprayEvent(&data, 3, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayKeyPressure(
uchar channel, uchar note, uchar pressure, bigtime_t time) const
void
BMidiLocalProducer::SprayKeyPressure(uchar channel, uchar note,
uchar pressure, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[3];
data[0] = B_KEY_PRESSURE + channel;
data[1] = note;
data[2] = pressure;
SprayEvent(&data, 3, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayControlChange(
uchar channel, uchar controlNumber, uchar controlValue,
bigtime_t time) const
void
BMidiLocalProducer::SprayControlChange(uchar channel,
uchar controlNumber, uchar controlValue, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[3];
data[0] = B_CONTROL_CHANGE + channel;
data[1] = controlNumber;
data[2] = controlValue;
SprayEvent(&data, 3, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayProgramChange(
uchar channel, uchar programNumber, bigtime_t time) const
void
BMidiLocalProducer::SprayProgramChange(uchar channel,
uchar programNumber, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[2];
data[0] = B_PROGRAM_CHANGE + channel;
data[1] = programNumber;
SprayEvent(&data, 2, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayChannelPressure(
uchar channel, uchar pressure, bigtime_t time) const
void
BMidiLocalProducer::SprayChannelPressure(uchar channel,
uchar pressure, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[2];
data[0] = B_CHANNEL_PRESSURE + channel;
data[1] = pressure;
SprayEvent(&data, 2, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayPitchBend(
uchar channel, uchar lsb, uchar msb, bigtime_t time) const
void
BMidiLocalProducer::SprayPitchBend(uchar channel,
uchar lsb, uchar msb, bigtime_t time) const
{
if (channel < 16)
{
if (channel < 16) {
uchar data[3];
data[0] = B_PITCH_BEND + channel;
data[1] = lsb;
data[2] = msb;
SprayEvent(&data, 3, true, time);
}
else
{
} else {
debugger("invalid MIDI channel");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SpraySystemExclusive(
void* data, size_t length, bigtime_t time) const
void
BMidiLocalProducer::SpraySystemExclusive(void* data,
size_t length, bigtime_t time) const
{
SprayEvent(data, length, true, time, true);
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SpraySystemCommon(
uchar status, uchar data1, uchar data2, bigtime_t time) const
void
BMidiLocalProducer::SpraySystemCommon(uchar status, uchar data1,
uchar data2, bigtime_t time) const
{
size_t len;
uchar data[3];
@ -236,46 +212,45 @@ void BMidiLocalProducer::SpraySystemCommon(
data[1] = data1;
data[2] = data2;
switch (status)
{
switch (status) {
case B_TUNE_REQUEST:
case B_SYS_EX_END:
len = 1; break;
len = 1;
break;
case B_CABLE_MESSAGE:
case B_MIDI_TIME_CODE:
case B_SONG_SELECT:
len = 2; break;
len = 2;
break;
case B_SONG_POSITION:
len = 3; break;
len = 3;
break;
default:
debugger("invalid system common status");
len = 0;
}
SprayEvent(&data, len, true, time);
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SpraySystemRealTime(
uchar status, bigtime_t time) const
void
BMidiLocalProducer::SpraySystemRealTime(uchar status,
bigtime_t time) const
{
if (status >= B_TIMING_CLOCK)
{
SprayEvent(&status, 1, true, time);
}
else
{
debugger("invalid real time status");
}
}
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayTempoChange(
int32 beatsPerMinute, bigtime_t time) const
void
BMidiLocalProducer::SprayTempoChange(int32 beatsPerMinute,
bigtime_t time) const
{
int32 tempo = 60000000 / beatsPerMinute;
@ -303,14 +278,12 @@ void BMidiLocalProducer::_Reserved8() { }
//------------------------------------------------------------------------------
void BMidiLocalProducer::SprayEvent(
const void* data, size_t length, bool atomic, bigtime_t time,
bool sysex) const
void
BMidiLocalProducer::SprayEvent(const void* data, size_t length,
bool atomic, bigtime_t time, bool sysex) const
{
if (LockProducer())
{
if (CountConsumers() > 0)
{
if (LockProducer()) {
if (CountConsumers() > 0) {
// We don't just send the MIDI event data to all connected
// consumers, we also send a header. The header contains our
// ID (4 bytes), the consumer's ID (4 bytes), the performance
@ -318,32 +291,29 @@ void BMidiLocalProducer::SprayEvent(
// padding (3 bytes). The MIDI event data follows the header.
size_t buf_size = 20 + length;
if (sysex) { buf_size += 2; } // add 0xF0 and 0xF7 markers
if (sysex) {
// add 0xF0 and 0xF7 markers
buf_size += 2;
}
uint8* buffer = (uint8*) malloc(buf_size);
if (buffer != NULL)
{
uint8* buffer = (uint8*)malloc(buf_size);
if (buffer != NULL) {
*((uint32*) (buffer + 0)) = id;
*((bigtime_t*) (buffer + 8)) = time;
*((uint32*) (buffer + 16)) = 0;
*((bool*) (buffer + 16)) = atomic;
if (sysex)
{
if (sysex) {
*((uint8*) (buffer + 20)) = B_SYS_EX_START;
if (data != NULL)
{
memcpy(buffer + 21, data, length);
}
*((uint8*) (buffer + buf_size - 1)) = B_SYS_EX_END;
}
else if (data != NULL)
{
} else if (data != NULL) {
memcpy(buffer + 20, data, length);
}
for (int32 t = 0; t < CountConsumers(); ++t)
{
for (int32 t = 0; t < CountConsumers(); ++t) {
BMidiConsumer* cons = ConsumerAt(t);
*((uint32*) (buffer + 4)) = cons->id;
@ -367,4 +337,3 @@ void BMidiLocalProducer::SprayEvent(
}
}
//------------------------------------------------------------------------------