- double *buffer_samples = buffer->get_data();
- double *speed_samples = speed_buffer->get_data();
-
-//printf("AModule::import_samples %d %lld\n", __LINE__, speed_fragment_len);
-
- if(speed_fragment_len == 0)
- {
- bzero(buffer_samples, fragment_len * sizeof(double));
- bzero(prev_tail, SPEED_OVERLAP * sizeof(double));
- bzero(prev_head, SPEED_OVERLAP * sizeof(double));
- }
- else
- {
-// buffer is now reversed
- if(direction == PLAY_REVERSE)
- {
- int out_offset = 0;
- speed_position = speed_position2;
- //printf("AModule::import_samples %d %lld %lld\n", __LINE__, start_project, speed_fragment_len);
- for(int64_t i = start_project + fragment_len;
- i != start_project;
- i--)
- {
- // funky sample reordering, because the source is a reversed buffer
- 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,
- PLAY_REVERSE,
- previous,
- next);
- speed_position -= speed;
- }
- //printf("AModule::import_samples %d %f\n", __LINE__, speed_position);
- }
- else
- {
- int out_offset = 0;
-// position in buffer to read
- speed_position = speed_position1 - start_source;
-
-//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,
- PLAY_FORWARD,
- previous,
- next);
- double next_speed_position = speed_position + speed;
-
- int in_offset = (int)(speed_position);
- if(fabs(speed) >= 1.0)
- {
- int total = abs(speed);
- double accum = 0;
- for(int j = 0; j < total; j++)
- {
- int in_offset2 = in_offset + (speed > 0 ? j : -j);
-
- CLAMP(in_offset2, 0, speed_fragment_len - 1);
- accum += speed_samples[in_offset2];
- }
-
-
- buffer_samples[out_offset++] = accum / total;
- }
- else
- {
-
-
-// if(in_offset < 0 || in_offset >= speed_fragment_len)
-// printf("AModule::import_samples %d %d %d\n",
-// __LINE__,
-// in_offset,
-// speed_fragment_len);
-
- int in_offset1 = in_offset;
- int in_offset2 = in_offset;
-
- if(speed < 0)
- {
- in_offset1 += SPEED_OVERLAP;
- in_offset2 = in_offset1 - 1;
- }
- else
- {
- in_offset1 -= SPEED_OVERLAP;
- in_offset2 = in_offset1 + 1;
- }
-
- 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)
- {
- value1 = prev_head[in_offset1 - speed_fragment_len];
- }
- else
- if(in_offset1 >= 0)
- {
- value1 = speed_samples[in_offset1];
- }
- else
- {
-//printf("AModule::import_samples %d %d\n", __LINE__, in_offset1);
- value1 = prev_tail[SPEED_OVERLAP + in_offset1];
- }
-#if 0
- double value2 = 0;
- if(in_offset2 >= speed_fragment_len)
- {
- value2 = prev_head[in_offset2 - speed_fragment_len];
- }
- else
- if(in_offset2 >= 0)
- {
- value2 = speed_samples()[in_offset2];
- }
- else
- {
- value2 = prev_tail[SPEED_OVERLAP + in_offset2];
- }
-
- double fraction = speed_position - floor(speed_position);
- buffer_samples[out_offset++] =
- value1 * (1.0 - fraction) +
- value2 * fraction;
-#endif
- buffer_samples[out_offset++] = value1;
-
-
- }
-
- speed_position = next_speed_position;
+ int len1 = speed_fragment_len-1;
+ double speed_position = start_position;
+ double pos = start_project;
+// speed gnuplot> plot "/tmp/x.dat" using($1) with lines
+// speed_position gnuplot> plot "/tmp/x.dat" using($2) with lines
+//FILE *fp = 0;
+//if( !channel ) { fp = fopen("/tmp/x.dat", "a"); fprintf(fp," %f %f\n",0.,0.); }
+ for( int64_t i=0; i<fragment_len; ++i,pos+=dir ) {
+ int64_t speed_pos = speed_position;
+ double speed = speed_autos->get_value(pos,
+ direction, previous, next);
+//if(fp) fprintf(fp," %f %f\n", speed, speed_position);
+ double next_position = speed_position + dir*speed;
+ int64_t next_pos = next_position;
+ int total = abs(next_pos - speed_pos);
+ int k = speed_pos - min_source;
+ if( dir < 0 ) k = len1 - k; // if buffer reversed
+ double sample = speed_data[bclip(k, 0,len1)];
+ if( total > 1 ) {
+ int d = next_pos >= speed_pos ? 1 : -1;
+ for( int j=total; --j>0; ) {
+ k += d;
+ sample += speed_data[bclip(k, 0,len1)];