Browse Source

Pass midi port to and from bridges

tags/1.9.8
falkTX 8 years ago
parent
commit
b7616519fb
5 changed files with 46 additions and 41 deletions
  1. +0
    -1
      source/backend/engine/CarlaEngine.cpp
  2. +16
    -10
      source/backend/engine/CarlaEngineBridge.cpp
  3. +9
    -12
      source/backend/plugin/CarlaPluginBridge.cpp
  4. +9
    -12
      source/backend/plugin/CarlaPluginJack.cpp
  5. +12
    -6
      source/libjack/libjack.cpp

+ 0
- 1
source/backend/engine/CarlaEngine.cpp View File

@@ -674,7 +674,6 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype,
#endif #endif


EnginePluginData& pluginData(pData->plugins[id]); EnginePluginData& pluginData(pData->plugins[id]);
carla_stdout("stored plugin ptr %p", plugin);
pluginData.plugin = plugin; pluginData.plugin = plugin;
pluginData.insPeak[0] = 0.0f; pluginData.insPeak[0] = 0.0f;
pluginData.insPeak[1] = 0.0f; pluginData.insPeak[1] = 0.0f;


+ 16
- 10
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -1208,45 +1208,51 @@ protected:
event.ctrl.convertToMidiData(event.channel, size, data); event.ctrl.convertToMidiData(event.channel, size, data);
CARLA_SAFE_ASSERT_CONTINUE(size > 0 && size <= 3); CARLA_SAFE_ASSERT_CONTINUE(size > 0 && size <= 3);


if (curMidiDataPos + 1U /* size*/ + 4U /* time */ + size >= kBridgeRtClientDataMidiOutSize)
if (curMidiDataPos + 6U /* time, port and size */ + size >= kBridgeRtClientDataMidiOutSize)
break; break;


// set size
*midiData++ = size;

// set time // set time
*(uint32_t*)midiData = event.time; *(uint32_t*)midiData = event.time;
midiData = midiData + 4; midiData = midiData + 4;


// set port
*midiData++ = 0;

// set size
*midiData++ = size;

// set data // set data
for (uint8_t j=0; j<size; ++j) for (uint8_t j=0; j<size; ++j)
*midiData++ = data[j]; *midiData++ = data[j];


curMidiDataPos += 1U /* size*/ + 4U /* time */ + size;
curMidiDataPos += 6U /* time, port and size */ + size;
} }
else if (event.type == kEngineEventTypeMidi) else if (event.type == kEngineEventTypeMidi)
{ {
const EngineMidiEvent& _midiEvent(event.midi); const EngineMidiEvent& _midiEvent(event.midi);


if (curMidiDataPos + 1 /* size*/ + 4 /* time */ + _midiEvent.size >= kBridgeRtClientDataMidiOutSize)
if (curMidiDataPos + 6U /* time, port and size */ + _midiEvent.size >= kBridgeRtClientDataMidiOutSize)
break; break;


const uint8_t* const _midiData(_midiEvent.dataExt != nullptr ? _midiEvent.dataExt : _midiEvent.data); const uint8_t* const _midiData(_midiEvent.dataExt != nullptr ? _midiEvent.dataExt : _midiEvent.data);


// set size
*midiData++ = _midiEvent.size;

// set time // set time
*(uint32_t*)midiData = event.time; *(uint32_t*)midiData = event.time;
midiData += 4; midiData += 4;


// set port
*midiData++ = _midiEvent.port;

// set size
*midiData++ = _midiEvent.size;

// set data // set data
*midiData++ = uint8_t(_midiData[0] | (event.channel & MIDI_CHANNEL_BIT)); *midiData++ = uint8_t(_midiData[0] | (event.channel & MIDI_CHANNEL_BIT));


for (uint8_t j=1; j<_midiEvent.size; ++j) for (uint8_t j=1; j<_midiEvent.size; ++j)
*midiData++ = _midiData[j]; *midiData++ = _midiData[j];


curMidiDataPos += 1U /* size*/ + 4U /* time */ + _midiEvent.size;
curMidiDataPos += 6U /* time, port and size */ + _midiEvent.size;
} }
} }




+ 9
- 12
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -1239,26 +1239,23 @@ public:
} }
} }


uint8_t size;
uint32_t time; uint32_t time;
uint8_t port, size;
const uint8_t* midiData(fShmRtClientControl.data->midiOut); const uint8_t* midiData(fShmRtClientControl.data->midiOut);


for (std::size_t read=0; read<kBridgeRtClientDataMidiOutSize;) for (std::size_t read=0; read<kBridgeRtClientDataMidiOutSize;)
{ {
size = *midiData;
// get time
time = *(const uint32_t*)midiData;
midiData += 4;

// get port and size
port = *midiData++;
size = *midiData++;


if (size == 0) if (size == 0)
break; break;


// advance 8 bits (1 byte)
midiData = midiData + 1;

// get time as 32bit
time = *(const uint32_t*)midiData;

// advance 32 bits (4 bytes)
midiData = midiData + 4;

// store midi data advancing as needed // store midi data advancing as needed
uint8_t data[size]; uint8_t data[size];


@@ -1267,7 +1264,7 @@ public:


pData->event.portOut->writeMidiEvent(time, size, data); pData->event.portOut->writeMidiEvent(time, size, data);


read += 1U /* size*/ + 4U /* time */ + size;
read += 6U /* time, port and size */ + size;
} }


} // End of Control and MIDI Output } // End of Control and MIDI Output


+ 9
- 12
source/backend/plugin/CarlaPluginJack.cpp View File

@@ -835,26 +835,23 @@ public:


if (pData->event.portOut != nullptr) if (pData->event.portOut != nullptr)
{ {
uint8_t size;
uint32_t time; uint32_t time;
uint8_t port, size;
const uint8_t* midiData(fShmRtClientControl.data->midiOut); const uint8_t* midiData(fShmRtClientControl.data->midiOut);


for (std::size_t read=0; read<kBridgeRtClientDataMidiOutSize;) for (std::size_t read=0; read<kBridgeRtClientDataMidiOutSize;)
{ {
size = *midiData;
// get time
time = *(const uint32_t*)midiData;
midiData += 4;

// get port and size
port = *midiData++;
size = *midiData++;


if (size == 0) if (size == 0)
break; break;


// advance 8 bits (1 byte)
midiData = midiData + 1;

// get time as 32bit
time = *(const uint32_t*)midiData;

// advance 32 bits (4 bytes)
midiData = midiData + 4;

// store midi data advancing as needed // store midi data advancing as needed
uint8_t data[size]; uint8_t data[size];


@@ -863,7 +860,7 @@ public:


pData->event.portOut->writeMidiEvent(time, size, data); pData->event.portOut->writeMidiEvent(time, size, data);


read += 1U /* size*/ + 4U /* time */ + size;
read += 6U /* time, port and size */ + size;
} }


} // End of Control and MIDI Output } // End of Control and MIDI Output


+ 12
- 6
source/libjack/libjack.cpp View File

@@ -711,21 +711,24 @@ bool CarlaJackAppClient::handleRtData()
{ {
jack_midi_event_t& jmevent(midiPortBuf.events[j]); jack_midi_event_t& jmevent(midiPortBuf.events[j]);


if (curMidiDataPos + 1U /* size*/ + 4U /* time */ + jmevent.size >= kBridgeRtClientDataMidiOutSize)
if (curMidiDataPos + 6U /* time, port and size */ + jmevent.size >= kBridgeRtClientDataMidiOutSize)
break; break;


// set size
*midiData++ = static_cast<uint8_t>(jmevent.size);

// set time // set time
*(uint32_t*)midiData = jmevent.time; *(uint32_t*)midiData = jmevent.time;
midiData += 4; midiData += 4;


// set port
*midiData++ = i;

// set size
*midiData++ = static_cast<uint8_t>(jmevent.size);

// set data // set data
std::memcpy(midiData, jmevent.buffer, jmevent.size); std::memcpy(midiData, jmevent.buffer, jmevent.size);
midiData += jmevent.size; midiData += jmevent.size;


curMidiDataPos += 1U /* size*/ + 4U /* time */ + jmevent.size;
curMidiDataPos += 6U /* time, port and size */ + jmevent.size;
} }
} }
} }
@@ -1087,7 +1090,10 @@ int jack_client_real_time_priority(jack_client_t* client)
{ {
carla_stdout("%s(%p)", __FUNCTION__, client); carla_stdout("%s(%p)", __FUNCTION__, client);


return -1;
// code as used by juce
const int minPriority = sched_get_priority_min(SCHED_RR);
const int maxPriority = sched_get_priority_max(SCHED_RR);
return ((maxPriority - minPriority) * 9) / 10 + minPriority;
} }


typedef void (*JackSessionCallback)(jack_session_event_t*, void*); typedef void (*JackSessionCallback)(jack_session_event_t*, void*);


Loading…
Cancel
Save