/*
* CINELERRA
* Copyright (C) 2009-2013 Adam Williams <broadcast at earthling dot net>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ *
*/
#include "aattachmentpoint.h"
{
int result = 0;
-
+
if(module->asset)
{
// Files only read going forward.
else
if(module->nested_edl)
{
-
+
// Nested EDL generates reversed buffer.
for(int i = 0; i < module->nested_edl->session->audio_channels; i++)
result = module->nested_renderengine->arender->process_buffer(
- nested_output,
+ nested_output,
len,
start);
// printf("AModuleResample::read_samples buffer=%p module=%p len=%d\n",
-AModule::AModule(RenderEngine *renderengine,
- CommonRender *commonrender,
+AModule::AModule(RenderEngine *renderengine,
+ CommonRender *commonrender,
PluginArray *plugin_array,
Track *track)
: Module(renderengine, commonrender, plugin_array, track)
delete [] level_history;
delete [] level_samples;
}
-
+
for(int i = 0; i < MAX_CHANNELS; i++)
{
if(nested_output[i])
delete nested_output[i];
}
}
-
+
delete resample;
}
}
-int AModule::import_samples(AEdit *edit,
+int AModule::import_samples(AEdit *edit,
int64_t start_project,
int64_t edit_startproject,
int64_t edit_startsource,
{
int result = 0;
// start in EDL samplerate
- int64_t start_source = start_project -
- edit_startproject +
+ int64_t start_source = start_project -
+ edit_startproject +
edit_startsource;
// fragment size adjusted for speed curve
int64_t speed_fragment_len = fragment_len;
Samples *speed_buffer = buffer;
const int debug = 0;
-if(debug) printf("AModule::import_samples %d edit=%p nested_edl=%p\n",
+if(debug) printf("AModule::import_samples %d edit=%p nested_edl=%p\n",
__LINE__,
edit,
nested_edl);
if(debug) printf("AModule::import_samples %d\n", __LINE__);
this->channel = edit->channel;
-if(debug) printf("AModule::import_samples %d speed_fragment_len=%ld\n",
+if(debug) printf("AModule::import_samples %d speed_fragment_len=%jd\n",
__LINE__,
speed_fragment_len);
FloatAutos *speed_autos = (FloatAutos*)track->automation->autos[AUTOMATION_SPEED];
for(int64_t i = edit_startproject; i < start_project; i++)
{
- double speed = speed_autos->get_value(i,
+ double speed = speed_autos->get_value(i,
PLAY_FORWARD,
previous,
next);
min_position = speed_position;
for(int64_t i = start_project; i < start_project + fragment_len; i++)
{
- double speed = speed_autos->get_value(i,
+ double speed = speed_autos->get_value(i,
PLAY_FORWARD,
previous,
next);
speed_fragment_len = (int64_t)(max_position - min_position);
}
-printf("AModule::import_samples %d %f %f %f %f\n",
-__LINE__,
-min_position,
-max_position,
-speed_position1,
-speed_position2);
+//printf("AModule::import_samples %d %f %f %f %f\n",
+// __LINE__, min_position, max_position, speed_position1, speed_position2);
// new start of source to read from file
start_source = (int64_t)min_position;
delete speed_temp;
speed_temp = 0;
}
-
+
if(!speed_temp)
{
speed_temp = new Samples(speed_fragment_len);
}
-
+
speed_buffer = speed_temp;
}
{
int command;
asset = 0;
-
+
if(direction == PLAY_REVERSE)
command = NORMAL_REWIND;
else
nested_command->get_edl()->copy_all(nested_edl);
nested_command->change_type = CHANGE_ALL;
nested_command->realtime = renderengine->command->realtime;
- nested_renderengine = new RenderEngine(0,
- get_preferences(),
- 0,
- renderengine ? renderengine->channeldb : 0,
- 1);
+ nested_renderengine = new RenderEngine(0, get_preferences(), 0, 1);
nested_renderengine->set_acache(get_cache());
// Must use a private cache for the audio
-// if(!cache)
+// if(!cache)
// {
// cache = new CICache(get_preferences());
// private_cache = 1;
resample = new AModuleResample(this);
}
-if(debug) printf("AModule::import_samples %d %d %d\n",
+if(debug) printf("AModule::import_samples %d %d %d\n",
__LINE__,
(int)sample_rate,
(int)nested_edl->session->sample_rate);
// Render without resampling
if(debug) printf("AModule::import_samples %d\n", __LINE__);
result = nested_renderengine->arender->process_buffer(
- nested_output,
+ nested_output,
speed_fragment_len,
start_source);
if(debug) printf("AModule::import_samples %d\n", __LINE__);
resample = new AModuleResample(this);
}
-if(debug) printf("AModule::import_samples %d %d %d\n",
+if(debug) printf("AModule::import_samples %d %d %d\n",
__LINE__,
sample_rate,
asset->sample_rate);
{
if(debug)
-printf("AModule::import_samples %d channel=%d start_source=%ld len=%d\n", __LINE__, edit->channel, start_source, (int)speed_fragment_len);
+printf("AModule::import_samples %d channel=%d start_source=%jd len=%d\n", __LINE__, edit->channel, start_source, (int)speed_fragment_len);
file->set_audio_position(start_source);
file->set_channel(edit->channel);
result = file->read_samples(speed_buffer, speed_fragment_len);
// Reverse fragment so ::render can apply transitions going forward.
-if(debug) printf("AModule::import_samples %d speed_buffer=%p data=%p speed_fragment_len=%d\n",
-__LINE__,
+if(debug) printf("AModule::import_samples %d speed_buffer=%p data=%p speed_fragment_len=%d\n",
+__LINE__,
(void*)speed_buffer,
-(void*)speed_buffer->get_data(),
+(void*)speed_buffer->get_data(),
(int)speed_fragment_len);
if(direction == PLAY_REVERSE)
{
int in_offset = (int64_t)(speed_fragment_len - 1 - speed_position);
CLAMP(in_offset, 0, speed_fragment_len - 1);
buffer_samples[out_offset++] = speed_samples[in_offset];
- double speed = speed_autos->get_value(i,
+ double speed = speed_autos->get_value(i,
PLAY_REVERSE,
previous,
next);
//printf("AModule::import_samples %d %f\n", __LINE__, speed_position);
for(int64_t i = start_project; i < start_project + fragment_len; i++)
{
- double speed = speed_autos->get_value(i,
+ double speed = speed_autos->get_value(i,
PLAY_FORWARD,
previous,
next);
// if(in_offset < 0 || in_offset >= speed_fragment_len)
-// printf("AModule::import_samples %d %d %d\n",
-// __LINE__,
-// in_offset,
+// printf("AModule::import_samples %d %d %d\n",
+// __LINE__,
+// in_offset,
// speed_fragment_len);
int in_offset1 = in_offset;
CLAMP(in_offset1, -SPEED_OVERLAP, speed_fragment_len - 1 + SPEED_OVERLAP);
CLAMP(in_offset2, -SPEED_OVERLAP, speed_fragment_len - 1 + SPEED_OVERLAP);
-
+
double value1 = 0;
if(in_offset1 >= speed_fragment_len)
{
}
else
if(in_offset1 >= 0)
- {
+ {
value1 = speed_samples[in_offset1];
}
else
}
double fraction = speed_position - floor(speed_position);
- buffer_samples[out_offset++] =
+ buffer_samples[out_offset++] =
value1 * (1.0 - fraction) +
value2 * fraction;
#endif
speed_position = next_speed_position;
}
}
-
+
for(int i = 0; i < SPEED_OVERLAP; i++)
{
- int offset = speed_fragment_len -
+ int offset = speed_fragment_len -
SPEED_OVERLAP +
i;
CLAMP(offset, 0, speed_fragment_len - 1);
}
}
}
-
-
-
-
+
+
+
+
return result;
}
-int AModule::render(Samples *buffer,
+int AModule::render(Samples *buffer,
int64_t input_len,
int64_t start_position,
int direction,
if(debug) printf("AModule::render %d\n", __LINE__);
- if(use_nudge)
- start_position += track->nudge *
+ if(use_nudge)
+ start_position += track->nudge *
sample_rate /
edl_rate;
AEdit *playable_edit;
// Clear buffer
bzero(buffer->get_data(), input_len * sizeof(double));
-// The EDL is normalized to the requested sample rate because
-// the requested rate may be the project sample rate and a sample rate
+// The EDL is normalized to the requested sample rate because
+// the requested rate may be the project sample rate and a sample rate
// might as well be directly from the source rate to the requested rate.
// Get first edit containing the range
if(direction == PLAY_FORWARD)
if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len);
// Normalize position here since update_transition is a boolean operation.
- update_transition(start_position *
- edl_rate /
- sample_rate,
+ update_transition(start_position *
+ edl_rate /
+ sample_rate,
PLAY_FORWARD);
if(playable_edit)
// Clamp to end of transition
int64_t transition_len = 0;
-
+
if(transition &&
previous_edit)
{
- transition_len = transition->length *
- sample_rate /
+ transition_len = transition->length *
+ sample_rate /
edl_rate;
if(direction == PLAY_FORWARD &&
start_position < edit_startproject + transition_len &&
start_position + fragment_len > edit_startproject + transition_len)
fragment_len = edit_startproject + transition_len - start_position;
else
- if(direction == PLAY_REVERSE &&
+ if(direction == PLAY_REVERSE &&
start_position > edit_startproject + transition_len &&
start_position - fragment_len < edit_startproject + transition_len)
fragment_len = start_position - edit_startproject - transition_len;
}
-if(debug) printf("AModule::render %d buffer_offset=%d fragment_len=%jd\n",
-__LINE__,
+if(debug) printf("AModule::render %d buffer_offset=%d fragment_len=%jd\n",
+__LINE__,
buffer_offset,
fragment_len);
Samples output(buffer);
output.set_offset(output.get_offset() + buffer_offset);
- if(import_samples(playable_edit,
+ if(import_samples(playable_edit,
start_position,
edit_startproject,
edit_startsource,
// Read into temp buffers
// Temp + master or temp + temp ? temp + master
- if(transition_temp &&
+ if(transition_temp &&
transition_temp->get_allocated() < fragment_len)
{
delete transition_temp;
if(transition_fragment_len > 0)
{
// Previous_edit is always the outgoing segment, regardless of direction
- import_samples(previous_edit,
+ import_samples(previous_edit,
start_position,
previous_startproject,
previous_startsource,
{
Resample::reverse_buffer(output.get_data(), transition_fragment_len);
Resample::reverse_buffer(transition_temp->get_data(), transition_fragment_len);
- current_position = start_position -
+ current_position = start_position -
transition_fragment_len -
edit_startproject;
}
// Reverse output buffer here so transitions always render forward.
if(direction == PLAY_REVERSE)
- Resample::reverse_buffer(output.get_data(),
+ Resample::reverse_buffer(output.get_data(),
transition_fragment_len);
}
}
-if(debug) printf("AModule::render %d start_position=%jd end_position=%jd fragment_len=%jd\n",
-__LINE__,
+if(debug) printf("AModule::render %d start_position=%jd end_position=%jd fragment_len=%jd\n",
+__LINE__,
start_position,
end_position,
fragment_len);