diff plugin/plugins/SamplePlayer.cpp @ 1450:a12fd0456f0c streaming-csv-writer

Merge from default branch
author Chris Cannam
date Tue, 17 Apr 2018 10:35:42 +0100
parents 48e9f538e6e9
children cee1be4fb8c1
line wrap: on
line diff
--- a/plugin/plugins/SamplePlayer.cpp	Tue Apr 17 10:03:51 2018 +0100
+++ b/plugin/plugins/SamplePlayer.cpp	Tue Apr 17 10:35:42 2018 +0100
@@ -157,17 +157,17 @@
 SamplePlayer::instantiate(const LADSPA_Descriptor *, unsigned long rate)
 {
     if (!hostDescriptor || !hostDescriptor->request_non_rt_thread) {
-	SVDEBUG << "SamplePlayer::instantiate: Host does not provide request_non_rt_thread, not instantiating" << endl;
-	return 0;
+        SVDEBUG << "SamplePlayer::instantiate: Host does not provide request_non_rt_thread, not instantiating" << endl;
+        return 0;
     }
 
     SamplePlayer *player = new SamplePlayer(int(rate));
-	// std::cerr << "Instantiated sample player " << std::endl;
+        // std::cerr << "Instantiated sample player " << std::endl;
 
     if (hostDescriptor->request_non_rt_thread(player, workThreadCallback)) {
-	SVDEBUG << "SamplePlayer::instantiate: Host rejected request_non_rt_thread call, not instantiating" << endl;
-	delete player;
-	return 0;
+        SVDEBUG << "SamplePlayer::instantiate: Host rejected request_non_rt_thread call, not instantiating" << endl;
+        delete player;
+        return 0;
     }
 
     return player;
@@ -175,17 +175,17 @@
 
 void
 SamplePlayer::connectPort(LADSPA_Handle handle,
-			  unsigned long port, LADSPA_Data *location)
+                          unsigned long port, LADSPA_Data *location)
 {
     SamplePlayer *player = (SamplePlayer *)handle;
 
     float **ports[PortCount] = {
-	&player->m_output,
-	&player->m_retune,
-	&player->m_basePitch,
+        &player->m_output,
+        &player->m_retune,
+        &player->m_basePitch,
         &player->m_concertA,
-	&player->m_sustain,
-	&player->m_release
+        &player->m_sustain,
+        &player->m_release
     };
 
     *ports[port] = (float *)location;
@@ -200,9 +200,9 @@
     player->m_sampleNo = 0;
 
     for (size_t i = 0; i < Polyphony; ++i) {
-	player->m_ons[i] = -1;
-	player->m_offs[i] = -1;
-	player->m_velocities[i] = 0;
+        player->m_ons[i] = -1;
+        player->m_offs[i] = -1;
+        player->m_velocities[i] = 0;
     }
 }
 
@@ -231,7 +231,7 @@
 
         SamplePlayer *player = (SamplePlayer *)handle;
 
-	QMutexLocker locker(&player->m_mutex);
+        QMutexLocker locker(&player->m_mutex);
 
         if (QFileInfo(value).exists() &&
             QFileInfo(value).isDir()) {
@@ -261,10 +261,10 @@
     SamplePlayer *player = (SamplePlayer *)handle;
 
     if (!player->m_sampleSearchComplete) {
-	QMutexLocker locker(&player->m_mutex);
-	if (!player->m_sampleSearchComplete) {
-	    player->searchSamples();
-	}
+        QMutexLocker locker(&player->m_mutex);
+        if (!player->m_sampleSearchComplete) {
+            player->searchSamples();
+        }
     }
     if (program >= player->m_samples.size()) return 0;
 
@@ -283,8 +283,8 @@
 
 void
 SamplePlayer::selectProgram(LADSPA_Handle handle,
-			    unsigned long,
-			    unsigned long program)
+                            unsigned long,
+                            unsigned long program)
 {
     SamplePlayer *player = (SamplePlayer *)handle;
     player->m_pendingProgramChange = (int)program;
@@ -294,11 +294,11 @@
 SamplePlayer::getMidiController(LADSPA_Handle, unsigned long port)
 {
     int controllers[PortCount] = {
-	DSSI_NONE,
-	DSSI_CC(12),
-	DSSI_CC(13),
-	DSSI_CC(64),
-	DSSI_CC(72)
+        DSSI_NONE,
+        DSSI_CC(12),
+        DSSI_CC(13),
+        DSSI_CC(64),
+        DSSI_CC(72)
     };
 
     return controllers[port];
@@ -306,7 +306,7 @@
 
 void
 SamplePlayer::runSynth(LADSPA_Handle handle, unsigned long samples,
-		       snd_seq_event_t *events, unsigned long eventCount)
+                       snd_seq_event_t *events, unsigned long eventCount)
 {
     SamplePlayer *player = (SamplePlayer *)handle;
 
@@ -327,38 +327,38 @@
     if (player->m_pendingProgramChange >= 0) {
 
 #ifdef DEBUG_SAMPLE_PLAYER
-	SVDEBUG << "SamplePlayer::workThreadCallback: pending program change " << player->m_pendingProgramChange << endl;
+        SVDEBUG << "SamplePlayer::workThreadCallback: pending program change " << player->m_pendingProgramChange << endl;
 #endif
 
-	player->m_mutex.lock();
+        player->m_mutex.lock();
 
-	int program = player->m_pendingProgramChange;
-	player->m_pendingProgramChange = -1;
+        int program = player->m_pendingProgramChange;
+        player->m_pendingProgramChange = -1;
 
-	if (!player->m_sampleSearchComplete) {
-	    player->searchSamples();
-	}
-	
-	if (program < int(player->m_samples.size())) {
-	    QString path = player->m_samples[program].second;
-	    QString programName = player->m_samples[program].first;
-	    if (programName != player->m_program) {
-		player->m_program = programName;
-		player->m_mutex.unlock();
-		player->loadSampleData(path);
-	    } else {
-		player->m_mutex.unlock();
-	    }
-	}
+        if (!player->m_sampleSearchComplete) {
+            player->searchSamples();
+        }
+        
+        if (program < int(player->m_samples.size())) {
+            QString path = player->m_samples[program].second;
+            QString programName = player->m_samples[program].first;
+            if (programName != player->m_program) {
+                player->m_program = programName;
+                player->m_mutex.unlock();
+                player->loadSampleData(path);
+            } else {
+                player->m_mutex.unlock();
+            }
+        }
     }
 
     if (!player->m_sampleSearchComplete) {
 
-	QMutexLocker locker(&player->m_mutex);
+        QMutexLocker locker(&player->m_mutex);
 
-	if (!player->m_sampleSearchComplete) {
-	    player->searchSamples();
-	}
+        if (!player->m_sampleSearchComplete) {
+            player->searchSamples();
+        }
     }
 }
 
@@ -371,7 +371,7 @@
 
 #ifdef DEBUG_SAMPLE_PLAYER
     SVDEBUG << "SamplePlayer::searchSamples: Directory is \""
-	      << m_sampleDir << "\"" << endl;
+              << m_sampleDir << "\"" << endl;
 #endif
 
     QDir dir(m_sampleDir, "*.wav");
@@ -406,10 +406,10 @@
     file = sf_open(path.toLocal8Bit().data(), SFM_READ, &info);
 #endif
     if (!file) {
-	cerr << "SamplePlayer::loadSampleData: Failed to open file "
-		  << path << ": "
-		  << sf_strerror(file) << endl;
-	return;
+        cerr << "SamplePlayer::loadSampleData: Failed to open file "
+                  << path << ": "
+                  << sf_strerror(file) << endl;
+        return;
     }
     
     samples = info.frames;
@@ -422,47 +422,47 @@
     tmpResamples = 0;
 
     if (info.samplerate != m_sampleRate) {
-	
-	double ratio = (double)m_sampleRate / (double)info.samplerate;
-	size_t target = (size_t)(double(info.frames) * ratio);
-	SRC_DATA data;
+        
+        double ratio = (double)m_sampleRate / (double)info.samplerate;
+        size_t target = (size_t)(double(info.frames) * ratio);
+        SRC_DATA data;
 
-	tmpResamples = (float *)malloc(target * info.channels * sizeof(float));
-	if (!tmpResamples) {
-	    free(tmpFrames);
-	    return;
-	}
+        tmpResamples = (float *)malloc(target * info.channels * sizeof(float));
+        if (!tmpResamples) {
+            free(tmpFrames);
+            return;
+        }
 
-	memset(tmpResamples, 0, target * info.channels * sizeof(float));
+        memset(tmpResamples, 0, target * info.channels * sizeof(float));
 
-	data.data_in = tmpFrames;
-	data.data_out = tmpResamples;
-	data.input_frames = info.frames;
-	data.output_frames = target;
-	data.src_ratio = ratio;
+        data.data_in = tmpFrames;
+        data.data_out = tmpResamples;
+        data.input_frames = info.frames;
+        data.output_frames = target;
+        data.src_ratio = ratio;
 
-	if (!src_simple(&data, SRC_SINC_BEST_QUALITY, info.channels)) {
-	    free(tmpFrames);
-	    tmpFrames = tmpResamples;
-	    samples = target;
-	} else {
-	    free(tmpResamples);
-	}
+        if (!src_simple(&data, SRC_SINC_BEST_QUALITY, info.channels)) {
+            free(tmpFrames);
+            tmpFrames = tmpResamples;
+            samples = target;
+        } else {
+            free(tmpResamples);
+        }
     }
 
     /* add an extra sample for linear interpolation */
     tmpSamples = (float *)malloc((samples + 1) * sizeof(float));
     if (!tmpSamples) {
-	free(tmpFrames);
-	return;
+        free(tmpFrames);
+        return;
     }
 
     for (i = 0; i < samples; ++i) {
-	int j;
-	tmpSamples[i] = 0.0f;
-	for (j = 0; j < info.channels; ++j) {
-	    tmpSamples[i] += tmpFrames[i * info.channels + j];
-	}
+        int j;
+        tmpSamples[i] = 0.0f;
+        for (j = 0; j < info.channels; ++j) {
+            tmpSamples[i] += tmpFrames[i * info.channels + j];
+        }
     }
 
     free(tmpFrames);
@@ -477,9 +477,9 @@
     m_sampleCount = samples;
 
     for (i = 0; i < Polyphony; ++i) {
-	m_ons[i] = -1;
-	m_offs[i] = -1;
-	m_velocities[i] = 0;
+        m_ons[i] = -1;
+        m_offs[i] = -1;
+        m_velocities[i] = 0;
     }
 
     if (tmpOld) free(tmpOld);
@@ -489,8 +489,8 @@
 
 void
 SamplePlayer::runImpl(unsigned long sampleCount,
-		      snd_seq_event_t *events,
-		      unsigned long eventCount)
+                      snd_seq_event_t *events,
+                      unsigned long eventCount)
 {
     unsigned long pos;
     unsigned long count;
@@ -502,67 +502,67 @@
     if (!m_mutex.tryLock()) return;
 
     if (!m_sampleData || !m_sampleCount) {
-	m_sampleNo += sampleCount;
-	m_mutex.unlock();
-	return;
+        m_sampleNo += sampleCount;
+        m_mutex.unlock();
+        return;
     }
 
     for (pos = 0, event_pos = 0; pos < sampleCount; ) {
 
-	while (event_pos < eventCount
-	       && pos >= events[event_pos].time.tick) {
+        while (event_pos < eventCount
+               && pos >= events[event_pos].time.tick) {
 
-	    if (events[event_pos].type == SND_SEQ_EVENT_NOTEON) {
+            if (events[event_pos].type == SND_SEQ_EVENT_NOTEON) {
 #ifdef DEBUG_SAMPLE_PLAYER
                 cerr << "SamplePlayer: found NOTEON at time " 
                           << events[event_pos].time.tick << endl;
 #endif
-		snd_seq_ev_note_t n = events[event_pos].data.note;
-		if (n.velocity > 0) {
-		    m_ons[n.note] =
-			m_sampleNo + events[event_pos].time.tick;
-		    m_offs[n.note] = -1;
-		    m_velocities[n.note] = n.velocity;
-		} else {
-		    if (!m_sustain || (*m_sustain < 0.001)) {
-			m_offs[n.note] = 
-			    m_sampleNo + events[event_pos].time.tick;
-		    }
-		}
-	    } else if (events[event_pos].type == SND_SEQ_EVENT_NOTEOFF &&
-		       (!m_sustain || (*m_sustain < 0.001))) {
+                snd_seq_ev_note_t n = events[event_pos].data.note;
+                if (n.velocity > 0) {
+                    m_ons[n.note] =
+                        m_sampleNo + events[event_pos].time.tick;
+                    m_offs[n.note] = -1;
+                    m_velocities[n.note] = n.velocity;
+                } else {
+                    if (!m_sustain || (*m_sustain < 0.001)) {
+                        m_offs[n.note] = 
+                            m_sampleNo + events[event_pos].time.tick;
+                    }
+                }
+            } else if (events[event_pos].type == SND_SEQ_EVENT_NOTEOFF &&
+                       (!m_sustain || (*m_sustain < 0.001))) {
 #ifdef DEBUG_SAMPLE_PLAYER
                 cerr << "SamplePlayer: found NOTEOFF at time " 
                           << events[event_pos].time.tick << endl;
 #endif
-		snd_seq_ev_note_t n = events[event_pos].data.note;
-		m_offs[n.note] = 
-		    m_sampleNo + events[event_pos].time.tick;
-	    }
+                snd_seq_ev_note_t n = events[event_pos].data.note;
+                m_offs[n.note] = 
+                    m_sampleNo + events[event_pos].time.tick;
+            }
 
-	    ++event_pos;
-	}
+            ++event_pos;
+        }
 
-	count = sampleCount - pos;
-	if (event_pos < eventCount &&
-	    events[event_pos].time.tick < sampleCount) {
-	    count = events[event_pos].time.tick - pos;
-	}
+        count = sampleCount - pos;
+        if (event_pos < eventCount &&
+            events[event_pos].time.tick < sampleCount) {
+            count = events[event_pos].time.tick - pos;
+        }
 
         int notecount = 0;
 
-	for (i = 0; i < Polyphony; ++i) {
-	    if (m_ons[i] >= 0) {
+        for (i = 0; i < Polyphony; ++i) {
+            if (m_ons[i] >= 0) {
                 ++notecount;
-		addSample(i, pos, count);
-	    }
-	}
+                addSample(i, pos, count);
+            }
+        }
 
 #ifdef DEBUG_SAMPLE_PLAYER
         cerr << "SamplePlayer: have " << notecount << " note(s) sounding currently" << endl;
 #endif
 
-	pos += count;
+        pos += count;
     }
 
     m_sampleNo += sampleCount;
@@ -580,9 +580,9 @@
         if (m_concertA) {
             ratio *= *m_concertA / 440.f;
         }
-	if (m_basePitch && float(n) != *m_basePitch) {
-	    ratio *= powf(1.059463094f, float(n) - *m_basePitch);
-	}
+        if (m_basePitch && float(n) != *m_basePitch) {
+            ratio *= powf(1.059463094f, float(n) - *m_basePitch);
+        }
     }
 
     if (long(pos + m_sampleNo) < m_ons[n]) return;
@@ -590,49 +590,49 @@
     gain = (float)m_velocities[n] / 127.0f;
 
     for (i = 0, s = pos + m_sampleNo - m_ons[n];
-	 i < count;
-	 ++i, ++s) {
+         i < count;
+         ++i, ++s) {
 
-	float         lgain = gain;
-	float         rs = float(s) * ratio;
-	unsigned long rsi = lrintf(floorf(rs));
+        float         lgain = gain;
+        float         rs = float(s) * ratio;
+        unsigned long rsi = lrintf(floorf(rs));
 
-	if (rsi >= m_sampleCount) {
+        if (rsi >= m_sampleCount) {
 #ifdef DEBUG_SAMPLE_PLAYER
             cerr << "Note " << n << " has run out of samples (were " << m_sampleCount << " available at ratio " << ratio << "), ending" << endl;
 #endif
-	    m_ons[n] = -1;
-	    break;
-	}
+            m_ons[n] = -1;
+            break;
+        }
 
-	if (m_offs[n] >= 0 &&
-	    long(pos + i + m_sampleNo) > m_offs[n]) {
+        if (m_offs[n] >= 0 &&
+            long(pos + i + m_sampleNo) > m_offs[n]) {
 
-	    unsigned long dist =
-		pos + i + m_sampleNo - m_offs[n];
+            unsigned long dist =
+                pos + i + m_sampleNo - m_offs[n];
 
-	    unsigned long releaseFrames = 200;
-	    if (m_release) {
-		releaseFrames = long(*m_release * float(m_sampleRate) + 0.0001f);
-	    }
+            unsigned long releaseFrames = 200;
+            if (m_release) {
+                releaseFrames = long(*m_release * float(m_sampleRate) + 0.0001f);
+            }
 
-	    if (dist > releaseFrames) {
+            if (dist > releaseFrames) {
 #ifdef DEBUG_SAMPLE_PLAYER
                 cerr << "Note " << n << " has expired its release time (" << releaseFrames << " frames), ending" << endl;
 #endif
-		m_ons[n] = -1;
-		break;
-	    } else {
-		lgain = lgain * (float)(releaseFrames - dist) /
-		    (float)releaseFrames;
-	    }
-	}
-	
-	float sample = m_sampleData[rsi] +
-	    ((m_sampleData[rsi + 1] -
-	      m_sampleData[rsi]) *
-	     (rs - (float)rsi));
+                m_ons[n] = -1;
+                break;
+            } else {
+                lgain = lgain * (float)(releaseFrames - dist) /
+                    (float)releaseFrames;
+            }
+        }
+        
+        float sample = m_sampleData[rsi] +
+            ((m_sampleData[rsi + 1] -
+              m_sampleData[rsi]) *
+             (rs - (float)rsi));
 
-	m_output[pos + i] += lgain * sample;
+        m_output[pos + i] += lgain * sample;
     }
 }