1 #include "aattachmentpoint.h"
12 #include "edlsession.h"
15 #include "floatautos.h"
20 #include "pluginarray.h"
21 #include "preferences.h"
22 #include "renderengine.h"
23 #include "mainsession.h"
24 #include "sharedlocation.h"
26 #include "transition.h"
27 #include "transportque.h"
32 AModule::AModule(RenderEngine *renderengine,
33 CommonRender *commonrender,
34 PluginArray *plugin_array,
36 : Module(renderengine, commonrender, plugin_array, track)
38 data_type = TRACK_AUDIO;
40 transition_temp_alloc = 0;
50 if(transition_temp) delete [] transition_temp;
53 delete [] level_history;
54 delete [] level_samples;
58 AttachmentPoint* AModule::new_attachment(Plugin *plugin)
60 return new AAttachmentPoint(renderengine, plugin);
64 void AModule::create_objects()
66 Module::create_objects();
67 // Not needed in pluginarray
70 level_history = new double[((ARender*)commonrender)->total_peaks];
71 level_samples = new int64_t[((ARender*)commonrender)->total_peaks];
74 for(int i = 0; i < ((ARender*)commonrender)->total_peaks; i++)
77 level_samples[i] = -1;
82 int AModule::get_buffer_size()
85 return renderengine->fragment_len;
87 return plugin_array->get_bufsize();
90 void AModule::reverse_buffer(double *buffer, int64_t len)
95 for(start = 0, end = len - 1; end > start; start++, end--)
98 buffer[start] = buffer[end];
104 CICache* AModule::get_cache()
107 return renderengine->get_acache();
112 int AModule::render(double *buffer,
113 int64_t input_position,
119 int64_t edl_rate = get_edl()->session->sample_rate;
121 input_position += track->nudge *
125 AEdit *playable_edit;
126 int64_t start_project = input_position;
127 int64_t end_project = input_position + input_len;
128 int64_t buffer_offset = 0;
132 // Flip range around so start_project < end_project
133 if(direction == PLAY_REVERSE)
135 start_project -= input_len;
136 end_project -= input_len;
142 bzero(buffer, input_len * sizeof(double));
145 // The EDL is normalized to the requested sample rate because the requested rate may
146 // be the project sample rate and a sample rate
147 // might as well be directly from the source rate to the requested rate.
148 // Get first edit containing the range
149 for(playable_edit = (AEdit*)track->edits->first;
151 playable_edit = (AEdit*)playable_edit->next)
153 int64_t edit_start = playable_edit->startproject;
154 int64_t edit_end = playable_edit->startproject + playable_edit->length;
155 // Normalize to requested rate
156 edit_start = edit_start * sample_rate / edl_rate;
157 edit_end = edit_end * sample_rate / edl_rate;
159 if(start_project < edit_end && start_project + input_len > edit_start)
172 // Fill output one fragment at a time
173 while(start_project < end_project)
176 int64_t fragment_len = input_len;
179 if(fragment_len + start_project > end_project)
180 fragment_len = end_project - start_project;
183 // Normalize position here since update_transition is a boolean operation.
184 update_transition(start_project *
192 // Normalize EDL positions to requested rate
193 int64_t edit_startproject = playable_edit->startproject;
194 int64_t edit_endproject = playable_edit->startproject + playable_edit->length;
195 int64_t edit_startsource = playable_edit->startsource;
196 //printf("AModule::render 52 %lld\n", fragment_len);
198 edit_startproject = edit_startproject * sample_rate / edl_rate;
199 edit_endproject = edit_endproject * sample_rate / edl_rate;
200 edit_startsource = edit_startsource * sample_rate / edl_rate;
201 //printf("AModule::render 53 %lld\n", fragment_len);
206 if(fragment_len + start_project > edit_endproject)
207 fragment_len = edit_endproject - start_project;
208 //printf("AModule::render 56 %lld\n", fragment_len);
210 if(playable_edit->asset)
217 if(!(source = get_cache()->check_out(playable_edit->asset)))
219 // couldn't open source file / skip the edit
221 printf(_("VirtualAConsole::load_track Couldn't open %s.\n"), playable_edit->asset->path);
227 source->set_channel(playable_edit->channel);
229 result = source->set_audio_position(start_project -
234 // if(result) printf("AModule::render start_project=%d playable_edit->startproject=%d playable_edit->startsource=%d\n"
235 // "source=%p playable_edit=%p edl=%p edlsession=%p sample_rate=%d\n",
236 // start_project, playable_edit->startproject, playable_edit->startsource,
237 // source, playable_edit, get_edl(), get_edl()->session, get_edl()->session->sample_rate);
238 source->read_samples(buffer + buffer_offset,
242 get_cache()->check_in(playable_edit->asset);
251 // Read transition into temp and render
252 AEdit *previous_edit = (AEdit*)playable_edit->previous;
253 if(transition && previous_edit)
255 int64_t transition_len = transition->length *
258 int64_t previous_startproject = previous_edit->startproject *
261 int64_t previous_startsource = previous_edit->startsource *
265 // Read into temp buffers
266 // Temp + master or temp + temp ? temp + master
267 if(transition_temp && transition_temp_alloc < fragment_len)
269 delete [] transition_temp;
275 transition_temp = new double[fragment_len];
276 transition_temp_alloc = fragment_len;
281 // Trim transition_len
282 int transition_fragment_len = fragment_len;
283 if(fragment_len + start_project >
284 edit_startproject + transition_len)
285 fragment_len = edit_startproject + transition_len - start_project;
286 //printf("AModule::render 54 %lld\n", fragment_len);
288 if(transition_fragment_len > 0)
290 if(previous_edit->asset)
294 if(!(source = get_cache()->check_out(previous_edit->asset)))
296 // couldn't open source file / skip the edit
297 printf(_("VirtualAConsole::load_track Couldn't open %s.\n"), playable_edit->asset->path);
304 source->set_channel(previous_edit->channel);
306 result = source->set_audio_position(start_project -
307 previous_startproject +
308 previous_startsource,
309 get_edl()->session->sample_rate);
311 // if(result) printf("AModule::render start_project=%d playable_edit->startproject=%d playable_edit->startsource=%d\n"
312 // "source=%p playable_edit=%p edl=%p edlsession=%p sample_rate=%d\n",
314 // previous_edit->startproject,
315 // previous_edit->startsource,
319 // get_edl()->session,
320 // get_edl()->session->sample_rate);
321 source->read_samples(transition_temp,
322 transition_fragment_len,
325 get_cache()->check_in(previous_edit->asset);
330 bzero(transition_temp, transition_fragment_len * sizeof(double));
333 double *output = buffer + buffer_offset;
334 transition_server->process_transition(
337 start_project - edit_startproject,
338 transition_fragment_len,
344 if(playable_edit && start_project + fragment_len >= edit_endproject)
345 playable_edit = (AEdit*)playable_edit->next;
349 buffer_offset += fragment_len;
350 start_project += fragment_len;
354 // Reverse buffer here so plugins always render forward.
355 if(direction == PLAY_REVERSE)
356 reverse_buffer(buffer, input_len);