00001 #include "amodule.h"
00002 #include "arender.h"
00003 #include "atrack.h"
00004 #include "atrack.h"
00005 #include "audiodevice.h"
00006 #include "auto.h"
00007 #include "autos.h"
00008 #include "cache.h"
00009 #include "condition.h"
00010 #include "edit.h"
00011 #include "edl.h"
00012 #include "edlsession.h"
00013 #include "levelwindow.h"
00014 #include "mainsession.h"
00015 #include "playabletracks.h"
00016 #include "playbackengine.h"
00017 #include "preferences.h"
00018 #include "renderengine.h"
00019 #include "tracks.h"
00020 #include "transportque.h"
00021 #include "virtualaconsole.h"
00022 #include "virtualconsole.h"
00023 #include "virtualnode.h"
00024
00025 ARender::ARender(RenderEngine *renderengine)
00026 : CommonRender(renderengine)
00027 {
00028
00029 for(int i = 0; i < MAXCHANNELS; i++)
00030 {
00031 audio_out[i] = 0;
00032 level_history[i] = 0;
00033 }
00034 level_samples = 0;
00035 total_peaks = 0;
00036
00037 data_type = TRACK_AUDIO;
00038 }
00039
00040 ARender::~ARender()
00041 {
00042 for(int i = 0; i < MAXCHANNELS; i++)
00043 {
00044 if(audio_out[i]) delete [] audio_out[i];
00045 if(level_history[i]) delete [] level_history[i];
00046 }
00047 if(level_samples) delete [] level_samples;
00048 }
00049
00050 void ARender::arm_command()
00051 {
00052
00053 calculate_history_size();
00054 CommonRender::arm_command();
00055 asynchronous = 1;
00056 init_meters();
00057 }
00058
00059
00060 int ARender::get_total_tracks()
00061 {
00062 return renderengine->edl->tracks->total_audio_tracks();
00063 }
00064
00065 Module* ARender::new_module(Track *track)
00066 {
00067 return new AModule(renderengine, this, 0, track);
00068 }
00069
00070 int ARender::calculate_history_size()
00071 {
00072 if(total_peaks > 0)
00073 return total_peaks;
00074 else
00075 {
00076 meter_render_fragment = renderengine->fragment_len;
00077
00078 while(meter_render_fragment >
00079 renderengine->edl->session->sample_rate / TRACKING_RATE)
00080 meter_render_fragment /= 2;
00081 total_peaks = 16 *
00082 renderengine->fragment_len /
00083 meter_render_fragment;
00084 return total_peaks;
00085 }
00086 }
00087
00088 int ARender::init_meters()
00089 {
00090
00091 if(level_samples) delete [] level_samples;
00092 calculate_history_size();
00093 level_samples = new int64_t[total_peaks];
00094
00095 for(int i = 0; i < MAXCHANNELS;i++)
00096 {
00097 current_level[i] = 0;
00098 if(audio_out[i] && !level_history[i])
00099 level_history[i] = new double[total_peaks];
00100 }
00101
00102 for(int i = 0; i < total_peaks; i++)
00103 {
00104 level_samples[i] = -1;
00105 }
00106
00107 for(int j = 0; j < MAXCHANNELS; j++)
00108 {
00109 if(audio_out[j])
00110 for(int i = 0; i < total_peaks; i++)
00111 level_history[j][i] = 0;
00112 }
00113 return 0;
00114 }
00115
00116 void ARender::init_output_buffers()
00117 {
00118 if(renderengine->command->realtime)
00119 {
00120 for(int i = 0; i < MAXCHANNELS; i++)
00121 {
00122
00123 delete [] audio_out[i];
00124 audio_out[i] = 0;
00125
00126 if(i < renderengine->edl->session->audio_channels)
00127 {
00128 audio_out[i] = new double[renderengine->adjusted_fragment_len];
00129 }
00130 }
00131 }
00132 }
00133
00134
00135 VirtualConsole* ARender::new_vconsole_object()
00136 {
00137 return new VirtualAConsole(renderengine, this);
00138 }
00139
00140 int64_t ARender::tounits(double position, int round)
00141 {
00142 if(round)
00143 return Units::round(position * renderengine->edl->session->sample_rate);
00144 else
00145 return (int64_t)(position * renderengine->edl->session->sample_rate);
00146 }
00147
00148 double ARender::fromunits(int64_t position)
00149 {
00150 return (double)position / renderengine->edl->session->sample_rate;
00151 }
00152
00153
00154 int ARender::process_buffer(double **buffer_out,
00155 int64_t input_len,
00156 int64_t input_position,
00157 int last_buffer)
00158 {
00159 int result = 0;
00160
00161 this->last_playback = last_buffer;
00162 int64_t fragment_position = 0;
00163 int64_t fragment_len = input_len;
00164 int reconfigure = 0;
00165 current_position = input_position;
00166
00167 while(fragment_position < input_len)
00168 {
00169 for(int i = 0; i < MAXCHANNELS; i++)
00170 {
00171 if(buffer_out[i])
00172 this->audio_out[i] = buffer_out[i] + fragment_position;
00173 else
00174 this->audio_out[i] = 0;
00175 }
00176
00177 fragment_len = input_len;
00178 if(fragment_position + fragment_len > input_len)
00179 fragment_len = input_len - fragment_position;
00180
00181 reconfigure = vconsole->test_reconfigure(input_position,
00182 fragment_len,
00183 last_playback);
00184
00185
00186
00187 if(reconfigure) restart_playback();
00188
00189 result = process_buffer(fragment_len, input_position);
00190
00191 fragment_position += fragment_len;
00192 input_position += fragment_len;
00193 current_position = input_position;
00194 }
00195
00196
00197 bzero(this->audio_out, sizeof(double*) * MAXCHANNELS);
00198
00199
00200
00201 return result;
00202 return 0;
00203 }
00204
00205
00206 int ARender::process_buffer(int64_t input_len, int64_t input_position)
00207 {
00208 int result = ((VirtualAConsole*)vconsole)->process_buffer(input_len,
00209 input_position,
00210 last_playback,
00211 session_position);
00212
00213
00214
00215
00216 session_position += input_len;
00217 return result;
00218 }
00219
00220 int ARender::get_history_number(int64_t *table, int64_t position)
00221 {
00222
00223 int result = 0;
00224 int64_t min_difference = 0x7fffffff;
00225 for(int i = 0; i < total_peaks; i++)
00226 {
00227
00228
00229 if(labs(table[i] - position) < min_difference)
00230 {
00231 min_difference = labs(table[i] - position);
00232 result = i;
00233 }
00234 }
00235
00236
00237 return result;
00238 }
00239
00240 void ARender::send_last_buffer()
00241 {
00242 renderengine->audio->set_last_buffer();
00243 }
00244
00245 int ARender::wait_device_completion()
00246 {
00247
00248 renderengine->audio->wait_for_completion();
00249 return 0;
00250 }
00251
00252 void ARender::run()
00253 {
00254 int64_t current_input_length;
00255 int reconfigure = 0;
00256
00257 first_buffer = 1;
00258
00259 start_lock->unlock();
00260
00261
00262 while(!done && !interrupt && !last_playback)
00263 {
00264 current_input_length = renderengine->fragment_len;
00265
00266 get_boundaries(current_input_length);
00267
00268
00269 if(current_input_length)
00270 {
00271 reconfigure = vconsole->test_reconfigure(current_position,
00272 current_input_length,
00273 last_playback);
00274 if(reconfigure) restart_playback();
00275 }
00276
00277
00278
00279
00280 if(renderengine->command->realtime &&
00281 renderengine->playback_engine &&
00282 !renderengine->do_video)
00283 {
00284 double position = (double)renderengine->audio->current_position() /
00285 renderengine->edl->session->sample_rate *
00286 renderengine->command->get_speed();
00287
00288 if(renderengine->command->get_direction() == PLAY_FORWARD)
00289 position += renderengine->command->playbackstart;
00290 else
00291 position = renderengine->command->playbackstart - position;
00292
00293
00294
00295 renderengine->playback_engine->update_tracking(position);
00296 }
00297
00298
00299
00300
00301
00302
00303
00304 process_buffer(current_input_length, current_position);
00305
00306
00307
00308 advance_position(get_render_length(current_input_length));
00309
00310
00311
00312 if(vconsole->interrupt) interrupt = 1;
00313 }
00314
00315 if(!interrupt) send_last_buffer();
00316 if(renderengine->command->realtime) wait_device_completion();
00317 vconsole->stop_rendering(0);
00318 stop_plugins();
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 int ARender::get_datatype()
00339 {
00340 return TRACK_AUDIO;
00341 }
00342
00343 int ARender::arm_playback(int64_t current_position,
00344 int64_t input_length,
00345 int64_t amodule_render_fragment,
00346 int64_t playback_buffer,
00347 int64_t output_length)
00348 {
00349 this->current_position = current_position;
00350 this->input_length = input_length;
00351 session_position = 0;
00352
00353 source_length = renderengine->end_position - renderengine->start_position;
00354
00355
00356 if(renderengine->command->realtime)
00357 {
00358 Thread::set_realtime(renderengine->edl->session->real_time_playback);
00359 init_meters();
00360 }
00361
00362
00363
00364
00365 if(renderengine->command->realtime)
00366 {
00367 set_synchronous(1);
00368 start();
00369 }
00370 return 0;
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390 int ARender::reverse_buffer(double *buffer, int64_t len)
00391 {
00392 register int64_t start, end;
00393 double temp;
00394
00395 for(start = 0, end = len - 1; end > start; start++, end--)
00396 {
00397 temp = buffer[start];
00398 buffer[start] = buffer[end];
00399 buffer[end] = temp;
00400 }
00401 }
00402
00403 int ARender::get_next_peak(int current_peak)
00404 {
00405 current_peak++;
00406 if(current_peak >= total_peaks) current_peak = 0;
00407 return current_peak;
00408 }
00409
00410 int64_t ARender::get_render_length(int64_t current_render_length)
00411 {
00412 return current_render_length;
00413 }
00414