Mercurial > hg > svcore
diff plugin/DSSIPluginInstance.cpp @ 1040:a1cd5abcb38b cxx11
Introduce and use a samplerate type
author | Chris Cannam |
---|---|
date | Wed, 04 Mar 2015 12:01:04 +0000 |
parents | b14064bd1f97 |
children | 48e9f538e6e9 |
line wrap: on
line diff
--- a/plugin/DSSIPluginInstance.cpp Tue Mar 03 17:09:19 2015 +0000 +++ b/plugin/DSSIPluginInstance.cpp Wed Mar 04 12:01:04 2015 +0000 @@ -57,8 +57,8 @@ int clientId, QString identifier, int position, - int sampleRate, - size_t blockSize, + sv_samplerate_t sampleRate, + int blockSize, int idealChannelCount, const DSSI_Descriptor* descriptor) : RealTimePluginInstance(factory, identifier), @@ -90,7 +90,7 @@ for (size_t i = 0; i < m_audioPortsIn.size(); ++i) { m_inputBuffers[i] = new sample_t[blockSize]; } - for (size_t i = 0; i < m_outputBufferCount; ++i) { + for (int i = 0; i < m_outputBufferCount; ++i) { m_outputBuffers[i] = new sample_t[blockSize]; } @@ -265,13 +265,14 @@ #endif } - m_outputBufferCount = std::max(m_idealChannelCount, m_audioPortsOut.size()); + m_outputBufferCount = std::max(m_idealChannelCount, + (int)m_audioPortsOut.size()); } -size_t +sv_frame_t DSSIPluginInstance::getLatency() { - size_t latency = 0; + sv_frame_t latency = 0; #ifdef DEBUG_DSSI_PROCESS SVDEBUG << "DSSIPluginInstance::getLatency(): m_latencyPort " << m_latencyPort << ", m_run " << m_run << endl; @@ -279,14 +280,14 @@ if (m_latencyPort) { if (!m_run) { - for (size_t i = 0; i < getAudioInputCount(); ++i) { - for (size_t j = 0; j < m_blockSize; ++j) { + for (int i = 0; i < getAudioInputCount(); ++i) { + for (int j = 0; j < m_blockSize; ++j) { m_inputBuffers[i][j] = 0.f; } } run(Vamp::RealTime::zeroTime); } - latency = (size_t)(*m_latencyPort + 0.1); + latency = (sv_frame_t)(*m_latencyPort + 0.1); } #ifdef DEBUG_DSSI_PROCESS @@ -312,7 +313,7 @@ } void -DSSIPluginInstance::setIdealChannelCount(size_t channels) +DSSIPluginInstance::setIdealChannelCount(int channels) { #ifdef DEBUG_DSSI SVDEBUG << "DSSIPluginInstance::setIdealChannelCount: channel count " @@ -332,7 +333,7 @@ if (channels > m_outputBufferCount) { - for (size_t i = 0; i < m_outputBufferCount; ++i) { + for (int i = 0; i < m_outputBufferCount; ++i) { delete[] m_outputBuffers[i]; } @@ -342,7 +343,7 @@ m_outputBuffers = new sample_t*[m_outputBufferCount]; - for (size_t i = 0; i < m_outputBufferCount; ++i) { + for (int i = 0; i < m_outputBufferCount; ++i) { m_outputBuffers[i] = new sample_t[m_blockSize]; } @@ -438,10 +439,10 @@ m_controlPortsOut.clear(); if (m_ownBuffers) { - for (size_t i = 0; i < m_audioPortsIn.size(); ++i) { + for (int i = 0; i < getAudioInputCount(); ++i) { delete[] m_inputBuffers[i]; } - for (size_t i = 0; i < m_outputBufferCount; ++i) { + for (int i = 0; i < m_outputBufferCount; ++i) { delete[] m_outputBuffers[i]; } @@ -455,7 +456,7 @@ void -DSSIPluginInstance::instantiate(int sampleRate) +DSSIPluginInstance::instantiate(sv_samplerate_t sampleRate) { if (!m_descriptor) return; @@ -472,7 +473,13 @@ return; } - m_instanceHandle = descriptor->instantiate(descriptor, sampleRate); + unsigned long pluginRate = (unsigned long)(sampleRate); + if (sampleRate != sv_samplerate_t(pluginRate)) { + cerr << "DSSIPluginInstance: WARNING: Non-integer sample rate " + << sampleRate << " presented, rounding to " << pluginRate + << endl; + } + m_instanceHandle = descriptor->instantiate(descriptor, pluginRate); if (m_instanceHandle) { @@ -689,7 +696,7 @@ { if (!m_descriptor || !m_descriptor->LADSPA_Plugin->connect_port) return; #ifdef DEBUG_DSSI - SVDEBUG << "DSSIPluginInstance::connectPorts: " << m_audioPortsIn.size() + SVDEBUG << "DSSIPluginInstance::connectPorts: " << getAudioInputCount() << " audio ports in, " << m_audioPortsOut.size() << " out, " << m_outputBufferCount << " output buffers" << endl; #endif @@ -700,7 +707,7 @@ LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory); int inbuf = 0, outbuf = 0; - for (size_t i = 0; i < m_audioPortsIn.size(); ++i) { + for (int i = 0; i < getAudioInputCount(); ++i) { m_descriptor->LADSPA_Plugin->connect_port (m_instanceHandle, m_audioPortsIn[i], @@ -811,7 +818,7 @@ } float -DSSIPluginInstance::getControlOutputValue(size_t output) const +DSSIPluginInstance::getControlOutputValue(int output) const { if (!in_range_for(m_controlPortsOut, output)) return 0.0; return (*m_controlPortsOut[output].second); @@ -906,7 +913,7 @@ } void -DSSIPluginInstance::sendEvent(const Vamp::RealTime &eventTime, +DSSIPluginInstance::sendEvent(const RealTime &eventTime, const void *e) { #ifdef DEBUG_DSSI_PROCESS @@ -982,7 +989,7 @@ } void -DSSIPluginInstance::run(const Vamp::RealTime &blockTime, size_t count) +DSSIPluginInstance::run(const RealTime &blockTime, int count) { static snd_seq_event_t localEventBuffer[EVENT_BUFFER_SIZE]; int evCount = 0; @@ -1038,13 +1045,11 @@ *ev = m_eventBuffer.peekOne(); bool accept = true; - Vamp::RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); + RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); - long frameOffset = 0; + sv_frame_t frameOffset = 0; if (evTime > blockTime) { - frameOffset = Vamp::RealTime::realTime2Frame - (evTime - blockTime, - (unsigned int)m_sampleRate); + frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate); } #ifdef DEBUG_DSSI_PROCESS @@ -1112,28 +1117,30 @@ done: if (needLock) m_processLock.unlock(); - if (m_audioPortsOut.size() == 0) { + int numAudioOuts = int(m_audioPortsOut.size()); + + if (numAudioOuts == 0) { // copy inputs to outputs - for (size_t ch = 0; ch < m_idealChannelCount; ++ch) { - size_t sch = ch % m_audioPortsIn.size(); - for (size_t i = 0; i < m_blockSize; ++i) { + for (int ch = 0; ch < m_idealChannelCount; ++ch) { + int sch = ch % getAudioInputCount(); + for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[ch][i] = m_inputBuffers[sch][i]; } } - } else if (m_idealChannelCount < m_audioPortsOut.size()) { + } else if (m_idealChannelCount < numAudioOuts) { if (m_idealChannelCount == 1) { // mix down to mono - for (size_t ch = 1; ch < m_audioPortsOut.size(); ++ch) { - for (size_t i = 0; i < m_blockSize; ++i) { + for (int ch = 1; ch < numAudioOuts; ++ch) { + for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[0][i] += m_outputBuffers[ch][i]; } } } - } else if (m_idealChannelCount > m_audioPortsOut.size()) { + } else if (m_idealChannelCount > numAudioOuts) { // duplicate - for (size_t ch = m_audioPortsOut.size(); ch < m_idealChannelCount; ++ch) { - size_t sch = (ch - m_audioPortsOut.size()) % m_audioPortsOut.size(); - for (size_t i = 0; i < m_blockSize; ++i) { + for (int ch = numAudioOuts; ch < m_idealChannelCount; ++ch) { + int sch = (ch - numAudioOuts) % numAudioOuts; + for (int i = 0; i < m_blockSize; ++i) { m_outputBuffers[ch][i] = m_outputBuffers[sch][i]; } } @@ -1144,7 +1151,7 @@ } void -DSSIPluginInstance::runGrouped(const Vamp::RealTime &blockTime) +DSSIPluginInstance::runGrouped(const RealTime &blockTime) { // If something else in our group has just been called for this // block time (but we haven't) then we should just write out the @@ -1216,13 +1223,11 @@ *ev = instance->m_eventBuffer.peekOne(); bool accept = true; - Vamp::RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); + RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec); - int frameOffset = 0; + sv_frame_t frameOffset = 0; if (evTime > blockTime) { - frameOffset = (int) - Vamp::RealTime::realTime2Frame(evTime - blockTime, - (unsigned)m_sampleRate); + frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate); } #ifdef DEBUG_DSSI_PROCESS @@ -1233,7 +1238,7 @@ if (frameOffset >= int(m_blockSize)) break; if (frameOffset < 0) frameOffset = 0; - ev->time.tick = frameOffset; + ev->time.tick = snd_seq_tick_time_t(frameOffset); instance->m_eventBuffer.skip(1); if (ev->type == SND_SEQ_EVENT_CONTROLLER) {