summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerdgeist <>2013-03-30 02:47:28 +0000
committererdgeist <>2013-03-30 02:47:28 +0000
commit287d0f897567fa7db30f6a6efa163bff1bc66124 (patch)
tree52094083bf81abefed91bed680f0bcfd057580db
parent626486a3916b5276dc6b5b6c8b63db87e73278d2 (diff)
Add an option to allow seamless connection after last processed frame
-rw-r--r--timestretch.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/timestretch.c b/timestretch.c
index 14ed732..b15bfe7 100644
--- a/timestretch.c
+++ b/timestretch.c
@@ -34,6 +34,7 @@ static size_t calc_convert_values( int sample_rate, float tempo ) {
34 free( g_overlap_buffer ); 34 free( g_overlap_buffer );
35 g_overlap_buffer = malloc( sizeof(short) * g_overlap ); 35 g_overlap_buffer = malloc( sizeof(short) * g_overlap );
36 g_firstframe = 1; 36 g_firstframe = 1;
37 g_offset = 0;
37 38
38 g_output_length = (sample_rate * OUTPUT_LEN ) / 1000; 39 g_output_length = (sample_rate * OUTPUT_LEN ) / 1000;
39 if ( g_output_length < g_overlap) 40 if ( g_output_length < g_overlap)
@@ -87,7 +88,7 @@ static unsigned int find_corr_max(const short *input, const short *mixbuf) {
87} 88}
88 89
89// Returns the amount of samples that can be discarded from begin of the input buffer 90// Returns the amount of samples that can be discarded from begin of the input buffer
90size_t process_frame( short *input, short *output, short *overlap ) { 91size_t process_frame( short *input, short *output, short *overlap, int lastframe ) {
91 int i, i_ = (int)g_overlap; 92 int i, i_ = (int)g_overlap;
92 unsigned int offset = 0; 93 unsigned int offset = 0;
93 94
@@ -107,6 +108,10 @@ size_t process_frame( short *input, short *output, short *overlap ) {
107 sampcpy( output + g_overlap, input + offset + g_overlap, g_output_length - g_overlap ); 108 sampcpy( output + g_overlap, input + offset + g_overlap, g_output_length - g_overlap );
108 } 109 }
109 110
111 // On the last frame help connect the next frame from input seamlessly
112 if( lastframe )
113 return offset + g_output_length;
114
110 // Remember end of this frame for next frame 115 // Remember end of this frame for next frame
111 sampcpy( overlap, input + offset + g_output_length, g_overlap ); 116 sampcpy( overlap, input + offset + g_output_length, g_overlap );
112 117
@@ -122,7 +127,7 @@ int main( int args, char **argv ) {
122 short outbuf[ g_output_length ]; 127 short outbuf[ g_output_length ];
123 short inbuf [ g_input_length ]; 128 short inbuf [ g_input_length ];
124 129
125 printf( "DEBUG: OL: %zd SWL: %zd SL: %zd SK: %zd ICM: %zd\n", g_overlap, g_output_length, g_corr_length, g_skip / 65536, g_input_length ); 130// printf( "DEBUG: OL: %zd SWL: %zd SL: %zd SK: %zd ICM: %zd\n", g_overlap, g_output_length, g_corr_length, g_skip / 65536, g_input_length );
126 131
127 int fd_in = open( "in.raw", O_RDONLY ); 132 int fd_in = open( "in.raw", O_RDONLY );
128 int fd_out = open( "out.raw", O_CREAT | O_WRONLY | O_TRUNC ); 133 int fd_out = open( "out.raw", O_CREAT | O_WRONLY | O_TRUNC );
@@ -143,7 +148,7 @@ int main( int args, char **argv ) {
143 } 148 }
144 149
145 // Do one cycle of processing and outputting 150 // Do one cycle of processing and outputting
146 processed = process_frame( inbuf, outbuf, g_overlap_buffer ); 151 processed = process_frame( inbuf, outbuf, g_overlap_buffer, 0 );
147 write( fd_out, outbuf, g_output_length * sizeof(short) ); 152 write( fd_out, outbuf, g_output_length * sizeof(short) );
148 153
149 memmove( inbuf, inbuf + processed, ( in_fill - processed ) * sizeof(short) ); 154 memmove( inbuf, inbuf + processed, ( in_fill - processed ) * sizeof(short) );