void Lv2Plugin::activate (BufferProvider& bp) { if (!m_activated) { // Connect all ports first for (int i=0; i<m_ports.count(); ++i) { m_ports[i]->acquireBuffer(bp); m_ports[i]->connectToBuffer(); } slv2_instance_activate( m_instance ); m_activated = true; } }
bool LV2Effect::ProcessStereo(int count, WaveTrack *left, WaveTrack *right, sampleCount lstart, sampleCount rstart, sampleCount len) { /* Allocate buffers */ if (mBlockSize == 0) { mBlockSize = left->GetMaxBlockSize() * 2; fInBuffer = new float *[mAudioInputs.size()]; unsigned long i; for (i = 0; i < mAudioInputs.size(); i++) fInBuffer[i] = new float[mBlockSize]; fOutBuffer = new float *[mAudioOutputs.size()]; for (i = 0; i < mAudioOutputs.size(); i++) fOutBuffer[i] = new float[mBlockSize]; } /* Instantiate the plugin */ SLV2Instance handle = slv2_plugin_instantiate(mData, left->GetRate(), gLV2Features); /* Write the Note On to the MIDI event buffer and connect it */ LV2_Event_Buffer* midiBuffer; int noteOffTime; if (mMidiInput) { midiBuffer = lv2_event_buffer_new(40, 2); LV2_Event_Iterator iter; lv2_event_begin(&iter, midiBuffer); uint8_t noteOn[] = { 0x90, mNoteKey, mNoteVelocity }; lv2_event_write(&iter, 0, 0, 1, 3, noteOn); noteOffTime = mNoteLength * left->GetRate(); if (noteOffTime < len && noteOffTime < mBlockSize) { uint8_t noteOff[] = { 0x80, mNoteKey, 64 }; lv2_event_write(&iter, noteOffTime, 0, 1, 3, noteOff); } slv2_instance_connect_port(handle, mMidiInput->mIndex, midiBuffer); } unsigned long p; for(p = 0; p < mAudioInputs.size(); p++) { slv2_instance_connect_port(handle, mAudioInputs[p].mIndex, fInBuffer[p]); } for(p = 0; p < mAudioOutputs.size(); p++) { slv2_instance_connect_port(handle, mAudioOutputs[p].mIndex, fOutBuffer[p]); } for (p = 0; p < mControlInputs.size(); p++) { slv2_instance_connect_port(handle, mControlInputs[p].mIndex, &mControlInputs[p].mControlBuffer); } for (p = 0; p < mControlOutputs.size(); p++) { slv2_instance_connect_port(handle, mControlOutputs[p].mIndex, &mControlOutputs[p].mControlBuffer); } slv2_instance_activate(handle); // Actually perform the effect here sampleCount originalLen = len; sampleCount ls = lstart; sampleCount rs = rstart; bool noteOver = false; while (len) { int block = mBlockSize; if (block > len) block = len; if (left && mAudioInputs.size() > 0) { left->Get((samplePtr)fInBuffer[0], floatSample, ls, block); } if (right && mAudioInputs.size() > 1) { right->Get((samplePtr)fInBuffer[1], floatSample, rs, block); } slv2_instance_run(handle, block); if (left && mAudioOutputs.size() > 0) { left->Set((samplePtr)fOutBuffer[0], floatSample, ls, block); } if (right && mAudioOutputs.size() > 1) { right->Set((samplePtr)fOutBuffer[1], floatSample, rs, block); } len -= block; noteOffTime -= block; ls += block; rs += block; // Clear the event buffer and add the note off event if needed if (mMidiInput) { lv2_event_buffer_reset(midiBuffer, 1, (uint8_t*)midiBuffer + sizeof(LV2_Event_Buffer)); if (!noteOver && noteOffTime < len && noteOffTime < block) { LV2_Event_Iterator iter; lv2_event_begin(&iter, midiBuffer); uint8_t noteOff[] = { 0x80, mNoteKey, 64 }; lv2_event_write(&iter, noteOffTime, 0, 1, 3, noteOff); noteOver = true; } } if (mAudioInputs.size() > 1) { if (TrackGroupProgress(count, (ls-lstart)/(double)originalLen)) return false; } else { if (TrackProgress(count, (ls-lstart)/(double)originalLen)) return false; } } slv2_instance_deactivate(handle); slv2_instance_free(handle); return true; }