Browse Source

Some tests for rtmidi output, not working yet

tags/1.9.4
falkTX 11 years ago
parent
commit
972f7316d9
3 changed files with 80 additions and 27 deletions
  1. +12
    -14
      source/backend/engine/CarlaEngineJack.cpp
  2. +4
    -3
      source/backend/engine/CarlaEngineJuce.cpp
  3. +64
    -10
      source/backend/engine/CarlaEngineRtAudio.cpp

+ 12
- 14
source/backend/engine/CarlaEngineJack.cpp View File

@@ -1521,27 +1521,24 @@ protected:
{
jackbridge_midi_clear_buffer(eventOut);

uint8_t size = 0;
uint8_t data[3] = { 0, 0, 0 };
const uint8_t* dataPtr = data;

for (ushort i=0; i < kMaxEngineEventInternalCount; ++i)
{
const EngineEvent& engineEvent(pData->events.out[i]);

uint8_t size = 0;
uint8_t data[3] = { 0, 0, 0 };
const uint8_t* dataPtr = data;

switch (engineEvent.type)
{
case kEngineEventTypeNull:
if (engineEvent.type == kEngineEventTypeNull)
break;

case kEngineEventTypeControl:
else if (engineEvent.type == kEngineEventTypeControl)
{
const EngineControlEvent& ctrlEvent(engineEvent.ctrl);
ctrlEvent.convertToMidiData(engineEvent.channel, size, data);
break;
dataPtr = data;
}

case kEngineEventTypeMidi:
else if (engineEvent.type == kEngineEventTypeMidi)
{
const EngineMidiEvent& midiEvent(engineEvent.midi);

@@ -1550,10 +1547,11 @@ protected:
if (size > EngineMidiEvent::kDataSize && midiEvent.dataExt != nullptr)
dataPtr = midiEvent.dataExt;
else
dataPtr = midiEvent.dataExt;

break;
dataPtr = midiEvent.data;
}
else
{
continue;
}

if (size > 0)


+ 4
- 3
source/backend/engine/CarlaEngineJuce.cpp View File

@@ -497,7 +497,8 @@ protected:
FloatVectorOperations::clear(outputChannelData[i], numSamples);

// initialize input events
carla_zeroStruct<EngineEvent>(pData->events.in, kMaxEngineEventInternalCount);
carla_zeroStruct<EngineEvent>(pData->events.in, kMaxEngineEventInternalCount);
carla_zeroStruct<EngineEvent>(pData->events.out, kMaxEngineEventInternalCount);

if (fMidiInEvents.mutex.tryLock())
{
@@ -589,7 +590,7 @@ protected:
for (; i < EngineMidiEvent::kDataSize; ++i)
midiEvent.data[i] = 0;

fMidiInEvents.appendNonRT(midiEvent);
fMidiInEvents.append(midiEvent);
}

// -------------------------------------------------------------------
@@ -740,7 +741,7 @@ private:
clear();
}

void appendNonRT(const RtMidiEvent& event)
void append(const RtMidiEvent& event)
{
mutex.lock();
dataPending.append(event);


+ 64
- 10
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -637,8 +637,9 @@ protected:

FLOAT_CLEAR(outsPtr, nframes*fAudioOutCount);

// initialize input events
carla_zeroStruct<EngineEvent>(pData->events.in, kMaxEngineEventInternalCount);
// initialize events
carla_zeroStruct<EngineEvent>(pData->events.in, kMaxEngineEventInternalCount);
carla_zeroStruct<EngineEvent>(pData->events.out, kMaxEngineEventInternalCount);

if (fMidiInEvents.mutex.tryLock())
{
@@ -680,10 +681,59 @@ protected:
{
}

// output events
//if (fMidiOuts.count() > 0)
{
// TODO
//fMidiOutEvents...
// FIXME - use lock

uint8_t size = 0;
uint8_t data[3] = { 0, 0, 0 };
const uint8_t* dataPtr = data;
std::vector<uint8_t> vector;

for (ushort i=0; i < kMaxEngineEventInternalCount; ++i)
{
const EngineEvent& engineEvent(pData->events.out[i]);

if (engineEvent.type == kEngineEventTypeNull)
break;

if (engineEvent.type == kEngineEventTypeControl)
{
const EngineControlEvent& ctrlEvent(engineEvent.ctrl);
ctrlEvent.convertToMidiData(engineEvent.channel, size, data);
dataPtr = data;
}
else if (engineEvent.type == kEngineEventTypeMidi)
{
const EngineMidiEvent& midiEvent(engineEvent.midi);

size = midiEvent.size;

if (size > EngineMidiEvent::kDataSize && midiEvent.dataExt != nullptr)
dataPtr = midiEvent.dataExt;
else
dataPtr = midiEvent.data;
}
else
{
continue;
}

if (size > 0)
{
vector.reserve(size);
std::memcpy(vector.data(), dataPtr, size);

for (LinkedList<MidiOutPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
{
MidiOutPort& outPort(it.getValue());
CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr);

outPort.port->sendMessage(&vector);
}
vector.clear();
}
}
}

runPendingRtEvents();
@@ -727,7 +777,7 @@ protected:
for (; i < EngineMidiEvent::kDataSize; ++i)
midiEvent.data[i] = 0;

fMidiInEvents.appendNonRT(midiEvent);
fMidiInEvents.append(midiEvent);
}

// -------------------------------------------------------------------
@@ -820,7 +870,13 @@ protected:
return false;
}

rtMidiOut->openPort(rtMidiPortIndex, portName);
try {
rtMidiOut->openPort(rtMidiPortIndex, portName);
}
catch(...) {
delete rtMidiOut;
return false;
};

MidiOutPort midiPort;
midiPort.port = rtMidiOut;
@@ -923,7 +979,6 @@ private:
RtLinkedList<RtMidiEvent> data;
RtLinkedList<RtMidiEvent> dataPending;

// FIXME - 32, 512 + append_sleepy? check plugin code
RtMidiEvents()
: dataPool(512, 512),
data(dataPool),
@@ -934,7 +989,7 @@ private:
clear();
}

void appendNonRT(const RtMidiEvent& event)
void append(const RtMidiEvent& event)
{
mutex.lock();
dataPending.append(event);
@@ -956,7 +1011,6 @@ private:
};

RtMidiEvents fMidiInEvents;
//RtMidiEvents fMidiOutEvents;

#define handlePtr ((CarlaEngineRtAudio*)userData)



Loading…
Cancel
Save