1 #include "bcdisplayinfo.h"
7 #include "mainprogress.h"
8 #include "pluginaclient.h"
9 #include "transportque.h"
24 class InterpolateAudioEffect : public PluginAClient
27 InterpolateAudioEffect(PluginServer *server);
28 ~InterpolateAudioEffect();
33 int process_buffer(int64_t size,
35 int64_t start_position,
39 #define FRAGMENT_SIZE 4096
40 double *start_fragment;
51 REGISTER_PLUGIN(InterpolateAudioEffect)
59 InterpolateAudioEffect::InterpolateAudioEffect(PluginServer *server)
60 : PluginAClient(server)
66 InterpolateAudioEffect::~InterpolateAudioEffect()
68 if(start_fragment) delete [] start_fragment;
69 if(end_fragment) delete [] end_fragment;
75 char* InterpolateAudioEffect::plugin_title()
77 return N_("Interpolate");
81 int InterpolateAudioEffect::is_realtime()
87 #include "picon_png.h"
88 NEW_PICON_MACRO(InterpolateAudioEffect)
92 int InterpolateAudioEffect::process_buffer(int64_t size,
94 int64_t start_position,
100 if(!start_fragment) start_fragment = new double[FRAGMENT_SIZE];
101 if(!end_fragment) end_fragment = new double[FRAGMENT_SIZE];
103 if(get_direction() == PLAY_FORWARD)
105 // On first sample of range. Get boundary samples of effect.
106 if(get_source_position() == get_source_start())
108 // Need to read before desired sample to diffuse transients after audio
110 range_start = get_source_start();
111 range_end = get_source_start() + get_total_len();
112 //printf("InterpolateAudioEffect::process_buffer 1 %p\n", start_fragment);
113 read_samples(start_fragment,
116 range_start - FRAGMENT_SIZE,
118 start_sample = start_fragment[FRAGMENT_SIZE - 1];
119 read_samples(end_fragment,
122 range_end - FRAGMENT_SIZE,
124 end_sample = end_fragment[FRAGMENT_SIZE - 1];
128 for(int i = 0; i < size; i++)
130 double end_fraction = (double)(i + start_position - range_start) /
131 (range_end - range_start);
132 double start_fraction = 1.0 - end_fraction;
133 double out_sample = start_sample * start_fraction +
134 end_sample * end_fraction;
135 buffer[i] = out_sample;
140 // On first sample of range. Get boundary samples of effect.
141 if(get_source_position() == get_source_start() + get_total_len())
143 // Need to read before desired sample to diffuse transients after audio
145 range_start = get_source_start() + get_total_len();
146 range_end = get_source_start();
147 read_samples(start_fragment,
152 start_sample = start_fragment[0];
153 read_samples(end_fragment,
158 end_sample = end_fragment[0];
162 for(int i = 0; i < size; i++)
164 double start_fraction = (double)(start_position - i - range_end) /
165 (range_start - range_end);
166 double end_fraction = 1.0 - start_fraction;
167 double out_sample = start_sample * start_fraction +
168 end_sample * end_fraction;
169 buffer[i] = out_sample;