- Samples *input_ptr, Samples *output_ptr)
-{
- if( load_configuration() )
- update_lv2();
- init_buffer(size);
- load_buffer(size, &input_ptr, 1);
- process_buffer(size);
- return unload_buffer(size, &output_ptr, 1);
+ Samples **input_ptr, Samples **output_ptr, int chs)
+{
+ int64_t pos = get_source_position();
+ int64_t end = pos + size;
+ int64_t samples = 0;
+ while( pos < end ) {
+ KeyFrame *prev_keyframe = get_prev_keyframe(pos);
+ if( !prev_keyframe->is_default ) {
+ read_data(prev_keyframe);
+ update_lv2(LV2_CONFIG);
+ }
+ KeyFrame *next_keyframe = get_next_keyframe(pos);
+ int64_t next_pos = next_keyframe->position;
+ if( pos >= next_pos || next_pos > end )
+ next_pos = end;
+ int64_t len = next_pos - pos;
+ if( len > block_length )
+ len = block_length;
+ if( pos + len > end )
+ len = end - pos;
+ init_buffer(len);
+ for( int i=chs; --i>=0; ) {
+ input_ptr[i]->set_offset(samples);
+ output_ptr[i]->set_offset(samples);
+ }
+ load_buffer(len, input_ptr, chs);
+ process_buffer(len);
+ unload_buffer(len, output_ptr, chs);
+ samples += len;
+ pos += len;
+ }
+ for( int i=chs; --i>=0; )
+ output_ptr[i]->set_offset(0);
+ return samples;