Browse Source

Carla: Use the new process-rack code for RtAudio

tags/v0.9.0
falkTX 11 years ago
parent
commit
ff29fc8e16
2 changed files with 15 additions and 86 deletions
  1. +2
    -0
      c++/carla-backend/carla_engine_jack.cpp
  2. +13
    -86
      c++/carla-backend/carla_engine_rtaudio.cpp

+ 2
- 0
c++/carla-backend/carla_engine_jack.cpp View File

@@ -271,8 +271,10 @@ void CarlaEngineJack::handleFreewheelCallback(bool isFreewheel)

void CarlaEngineJack::handleProcessCallback(uint32_t nframes)
{
#ifndef BUILD_BRIDGE
if (maxPluginNumber() == 0)
return;
#endif

state = jackbridge_transport_query(client, &pos);



+ 13
- 86
c++/carla-backend/carla_engine_rtaudio.cpp View File

@@ -184,23 +184,24 @@ void CarlaEngineRtAudio::handleProcessCallback(void* outputBuffer, void* inputBu
CARLA_ASSERT(outsPtr);

// create temporary audio buffers
float ains_tmp_buf1[nframes];
float ains_tmp_buf2[nframes];
float aouts_tmp_buf1[nframes];
float aouts_tmp_buf2[nframes];

float* ains_tmp[2] = { ains_tmp_buf1, ains_tmp_buf2 };
float* aouts_tmp[2] = { aouts_tmp_buf1, aouts_tmp_buf2 };
float inBuf1[nframes];
float inBuf2[nframes];
float outBuf1[nframes];
float outBuf2[nframes];

// initialize audio input
for (unsigned int i=0; i < nframes*2; i++)
{
if (i % 2)
ains_tmp_buf2[i/2] = insPtr[i];
inBuf2[i/2] = insPtr[i];
else
ains_tmp_buf1[i/2] = insPtr[i];
inBuf1[i/2] = insPtr[i];
}

// create (real) audio buffers
float* inBuf[2] = { inBuf1, inBuf2 };
float* outBuf[2] = { outBuf1, outBuf2 };

// initialize control input
memset(rackControlEventsIn, 0, sizeof(CarlaEngineControlEvent)*MAX_ENGINE_CONTROL_EVENTS);
{
@@ -213,89 +214,15 @@ void CarlaEngineRtAudio::handleProcessCallback(void* outputBuffer, void* inputBu
// TODO
}

// initialize outputs (zero)
zeroF(aouts_tmp_buf1, nframes);
zeroF(aouts_tmp_buf2, nframes);
memset(rackControlEventsOut, 0, sizeof(CarlaEngineControlEvent)*MAX_ENGINE_CONTROL_EVENTS);
memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);

bool processed = false;

// process plugins
for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
{
CarlaPlugin* const plugin = getPluginUnchecked(i);

if (plugin && plugin->enabled())
{
if (processed)
{
// initialize inputs (from previous outputs)
memcpy(ains_tmp_buf1, aouts_tmp_buf1, sizeof(float)*nframes);
memcpy(ains_tmp_buf2, aouts_tmp_buf2, sizeof(float)*nframes);
memcpy(rackMidiEventsIn, rackMidiEventsOut, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);

// initialize outputs (zero)
zeroF(aouts_tmp_buf1, nframes);
zeroF(aouts_tmp_buf2, nframes);
memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
}

// process
plugin->engineProcessLock();

plugin->initBuffers();

if (carlaOptions.processHighPrecision)
{
float* ains_buffer2[2];
float* aouts_buffer2[2];

for (uint32_t j=0; j < nframes; j += 8)
{
ains_buffer2[0] = ains_tmp_buf1 + j;
ains_buffer2[1] = ains_tmp_buf2 + j;

aouts_buffer2[0] = aouts_tmp_buf1 + j;
aouts_buffer2[1] = aouts_tmp_buf2 + j;

plugin->process(ains_buffer2, aouts_buffer2, 8, j);
}
}
else
plugin->process(ains_tmp, aouts_tmp, nframes);

plugin->engineProcessUnlock();

// if plugin has no audio inputs, add previous buffers
if (plugin->audioInCount() == 0)
{
for (uint32_t j=0; j < nframes; j++)
{
aouts_tmp_buf1[j] += ains_tmp_buf1[j];
aouts_tmp_buf2[j] += ains_tmp_buf2[j];
}
}

processed = true;
}
}

// if no plugins in the rack, copy inputs over outputs
if (! processed)
{
memcpy(aouts_tmp_buf1, ains_tmp_buf1, sizeof(float)*nframes);
memcpy(aouts_tmp_buf2, ains_tmp_buf2, sizeof(float)*nframes);
memcpy(rackMidiEventsOut, rackMidiEventsIn, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
}
processRack(inBuf, outBuf, nframes);

// output audio
for (unsigned int i=0; i < nframes*2; i++)
{
if (i % 2)
outsPtr[i] = aouts_tmp_buf2[i/2];
outsPtr[i] = outBuf2[i/2];
else
outsPtr[i] = aouts_tmp_buf1[i/2];
outsPtr[i] = outBuf1[i/2];
}

// output control


Loading…
Cancel
Save