Browse Source

Fix midi input for bridges

tags/1.9.4
falkTX 11 years ago
parent
commit
a62800ecac
5 changed files with 40 additions and 17 deletions
  1. +27
    -4
      source/backend/engine/CarlaEngineBridge.cpp
  2. +1
    -1
      source/backend/engine/CarlaEngineData.cpp
  3. +3
    -3
      source/backend/plugin/BridgePlugin.cpp
  4. +1
    -1
      source/utils/CarlaBridgeUtils.hpp
  5. +8
    -8
      source/utils/CarlaRingBuffer.hpp

+ 27
- 4
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -652,7 +652,7 @@ protected:
const PluginBridgeRtOpcode opcode(fShmRtControl.readOpcode());
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (opcode != kPluginBridgeRtProcess) {
if (opcode != kPluginBridgeRtProcess && opcode != kPluginBridgeRtMidiEvent) {
carla_stdout("CarlaEngineBridgeRtThread::run() - got opcode: %s", PluginBridgeRtOpcode2str(opcode));
}

@@ -752,18 +752,41 @@ protected:

case kPluginBridgeRtMidiEvent: {
const uint32_t time(fShmRtControl.readUInt());
const uint8_t port(fShmRtControl.readByte());
const uint8_t size(fShmRtControl.readByte());
CARLA_SAFE_ASSERT_BREAK(size > 0);

uint8_t data[size];

for (uint32_t i=0; i < size; ++i)
for (uint8_t i=0; i<size; ++i)
data[i] = fShmRtControl.readByte();

if (EngineEvent* const event = getNextFreeInputEvent())
{
event->time = time;
event->fillFromMidiData(size, data);
event->type = kEngineEventTypeMidi;
event->time = time;
event->channel = MIDI_GET_CHANNEL_FROM_DATA(data);

event->midi.port = port;
event->midi.size = size;

if (size > EngineMidiEvent::kDataSize)
{
event->midi.dataExt = data;
std::memset(event->midi.data, 0, sizeof(uint8_t)*EngineMidiEvent::kDataSize);
}
else
{
event->midi.data[0] = MIDI_GET_STATUS_FROM_DATA(data);

uint8_t i=1;
for (; i < size; ++i)
event->midi.data[i] = data[i];
for (; i < EngineMidiEvent::kDataSize; ++i)
event->midi.data[i] = 0;

event->midi.dataExt = nullptr;
}
}
break;
}


+ 1
- 1
source/backend/engine/CarlaEngineData.cpp View File

@@ -169,7 +169,7 @@ void EngineEvent::fillFromMidiData(const uint8_t size, const uint8_t* const data
midi.data[0] = midiStatus;

uint8_t i=1;
for (; i < midi.size; ++i)
for (; i < size; ++i)
midi.data[i] = data[i];
for (; i < EngineMidiEvent::kDataSize; ++i)
midi.data[i] = 0;


+ 3
- 3
source/backend/plugin/BridgePlugin.cpp View File

@@ -936,6 +936,7 @@ public:

fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent);
fShmRtControl.writeUInt(0); // time
fShmRtControl.writeByte(0); // port
fShmRtControl.writeByte(3); // size
fShmRtControl.writeByte(data1);
fShmRtControl.writeByte(data2);
@@ -1104,11 +1105,10 @@ public:

fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent);
fShmRtControl.writeUInt(event.time);
fShmRtControl.writeByte(midiEvent.port);
fShmRtControl.writeByte(midiEvent.size);

fShmRtControl.writeByte(static_cast<uint8_t>(status + channel));

for (uint8_t j=1; j < midiEvent.size; ++j)
for (uint8_t j=0; j < midiEvent.size; ++j)
fShmRtControl.writeByte(midiEvent.data[j]);

fShmRtControl.commitWrite();


+ 1
- 1
source/utils/CarlaBridgeUtils.hpp View File

@@ -60,7 +60,7 @@ enum PluginBridgeRtOpcode {
kPluginBridgeRtControlEventMidiProgram, // uint/frame, byte/chan, ushort
kPluginBridgeRtControlEventAllSoundOff, // uint/frame, byte/chan
kPluginBridgeRtControlEventAllNotesOff, // uint/frame, byte/chan
kPluginBridgeRtMidiEvent, // uint/frame, byte/size, byte[]/data
kPluginBridgeRtMidiEvent, // uint/frame, byte/port, byte/size, byte[]/data
kPluginBridgeRtProcess
};



+ 8
- 8
source/utils/CarlaRingBuffer.hpp View File

@@ -147,8 +147,8 @@ public:

uint8_t readByte() noexcept
{
int8_t ub = -1;
return (tryRead(&ub, sizeof(int8_t)) && ub >= 0 && ub <= INT_LEAST8_MAX) ? static_cast<uint8_t>(ub) : 0;
uint8_t B = 0;
return tryRead(&B, sizeof(uint8_t)) ? B : 0;
}

int16_t readShort() noexcept
@@ -159,8 +159,8 @@ public:

uint16_t readUShort() noexcept
{
int16_t us = -1;
return (tryRead(&us, sizeof(int16_t)) && us >= 0 && us <= INT_LEAST16_MAX) ? static_cast<uint16_t>(us) : 0;
uint16_t us = 0;
return tryRead(&us, sizeof(uint16_t)) ? us : 0;
}

int32_t readInt() noexcept
@@ -171,8 +171,8 @@ public:

uint32_t readUInt() noexcept
{
int32_t ui = -1;
return (tryRead(&ui, sizeof(int32_t)) && ui >= 0 && ui <= INT_LEAST32_MAX) ? static_cast<uint32_t>(ui) : 0;
uint32_t ui = 0;
return tryRead(&ui, sizeof(int32_t)) ? ui : 0;
}

int64_t readLong() noexcept
@@ -183,8 +183,8 @@ public:

uint64_t readULong() noexcept
{
int64_t ul = -1;
return (tryRead(&ul, sizeof(int64_t)) && ul >= 0 && ul <= INT_LEAST64_MAX) ? static_cast<uint64_t>(ul) : 0;
uint64_t ul = 0;
return tryRead(&ul, sizeof(int64_t)) ? ul : 0;
}

float readFloat() noexcept


Loading…
Cancel
Save