+int AModule::read_samples(Samples *buffer, int64_t start, int64_t len, int direction)
+{
+ if( len < 0 ) return 1;
+ double *buffer_data = buffer->get_data();
+// if start < 0, zero fill prefix. if error, zero fill buffer
+ int64_t zeros = len;
+ int result = 0;
+ if( asset ) {
+// Files only read going forward.
+ if( direction == PLAY_REVERSE ) start -= len;
+ int64_t sz = start >= 0 ? len : len + start;
+ if( start < 0 ) start = 0;
+ if( sz > 0 ) {
+ file->set_audio_position(start);
+ file->set_channel(channel);
+ result = file->read_samples(buffer, sz);
+ if( !result && (zeros-=sz) > 0 ) {
+ double *top_data = buffer_data + zeros;
+ memmove(top_data, buffer_data, sz*sizeof(*buffer_data));
+ }
+ }
+ if( !result && direction == PLAY_REVERSE )
+ Resample::reverse_buffer(buffer_data, len);
+ }
+ else if( nested_edl ) {
+ if( nested_allocation < len ) {
+ nested_allocation = len;
+ for( int i=0; i<nested_edl->session->audio_channels; ++i ) {
+ delete nested_output[i];
+ nested_output[i] = new Samples(nested_allocation);
+ }
+ }
+ result = nested_renderengine->arender->
+ process_buffer(nested_output, len, start);
+ if( !result ) {
+ double *sample_data = nested_output[channel]->get_data();
+ int buffer_size = len * sizeof(*buffer_data);
+ memcpy(buffer_data, sample_data, buffer_size);
+ zeros = 0;
+ }
+ }
+ if( zeros > 0 )
+ memset(buffer_data, 0, zeros*sizeof(*buffer_data));
+ return result;
+}
+