Changeset 273
- Timestamp:
- 01/08/09 22:02:28 (3 years ago)
- Location:
- trunk/fm_server/src/fm_effect_rubber
- Files:
-
- 2 modified
-
fm_effect_rubber.c (modified) (10 diffs)
-
fm_effect_rubber.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.c
r267 r273 35 35 #include "../fm_input.h" 36 36 #include "../fm_effect.h" 37 #include "../fm_output.h" 38 #include "../fm_sync.h" 39 #include "../fm_pipeline.h" 37 40 #include "fm_effect_rubber.h" 38 41 39 42 40 43 enum { 41 PROP_0,42 PROP_TIME_RATIO,43 PROP_PITCH_SCALE44 PROP_0, 45 PROP_TIME_RATIO, 46 PROP_PITCH_SCALE 44 47 }; 45 48 … … 147 150 rubber->channel_ptr = NULL; 148 151 rubber->latency = 0; 149 rubber->temp_timestamp_ns = -1; 150 rubber->last_timestamp = 0; 152 rubber->timestamp_ns = -1; 151 153 } 152 154 … … 167 169 return FALSE; 168 170 169 rubber->state = rubberband_new (44100, 2, RubberBandOptionProcessRealTime, 1.0, 1.0); /* FIXME: 44100 */ 171 guint samplerate = fm_pipeline_get_sample_rate (FM_PIPELINE (element->pipeline)); 172 g_assert (samplerate > 0); 173 // g_print ("FmEffectRubber: pipeline sample rate is %d\n", samplerate); 174 175 rubber->state = rubberband_new (samplerate, 2, RubberBandOptionProcessRealTime, 1.0, 1.0); 170 176 rubber->temp_buffer = fm_buffer_new (16384, FM_CHANNELS_STEREO); 171 177 rubber->channel_ptr = g_new (gfloat *, FM_CHANNELS_STEREO); … … 195 201 FmEffectRubber *rubber = FM_EFFECT_RUBBER (element); 196 202 int i; 203 204 #if 0 205 /* ****** */ 206 fm_element_get_buffer_from_src (element, buffer, sync); 207 buffer->used_samples = buffer->requested_samples; 208 return; 209 /* ****** */ 210 #endif 197 211 198 212 if (rubber->change_time_ratio > -1) { … … 201 215 rubber->change_time_ratio = -1; 202 216 rubber->latency = rubberband_get_latency (rubber->state); 217 g_print ("Rubber latency: %zd\n", rubber->latency); 203 218 } 204 219 … … 208 223 rubber->change_pitch_scale = -1; 209 224 rubber->latency = rubberband_get_latency (rubber->state); 225 g_print ("Rubber latency: %zd\n", rubber->latency); 210 226 } 211 227 … … 214 230 215 231 guint samples_needed = buffer->requested_samples; 216 // gboolean already_out_of_samples = FALSE; 217 218 guint64 start_timestamp = rubber->temp_timestamp_ns; 232 233 guint64 start_timestamp_ns = rubber->timestamp_ns; 219 234 220 235 while (samples_needed > 0) { … … 233 248 rubber->channel_ptr[i] += retrieved; 234 249 235 if (rubber->temp_timestamp_ns >= 0) 236 rubber->temp_timestamp_ns += fm_element_samples_to_ns (element, 237 retrieved / rubber->time_ratio); 250 if (rubber->timestamp_ns >= 0) 251 rubber->timestamp_ns += fm_element_samples_to_ns (element, retrieved / rubber->time_ratio); 252 else 253 rubber->timestamp_ns = -1; 238 254 239 255 if (retrieved != ask_for) … … 244 260 guint samples_req = rubberband_get_samples_required (rubber->state); 245 261 246 //g_print ("Requested%u samples\n", samples_req);262 // g_print ("IN %u samples\n", samples_req); 247 263 248 264 rubber->temp_buffer->requested_samples = samples_req; 249 250 265 fm_element_get_buffer_from_src (element, rubber->temp_buffer, sync); 266 251 267 if (rubber->temp_buffer->discont == TRUE) { 252 268 g_print ("***************** DISCONT!!!!\n"); 253 269 rubberband_reset (rubber->state); 254 start_timestamp = rubber->temp_buffer->timestamp_ns; 270 start_timestamp_ns = rubber->temp_buffer->timestamp_ns; 271 rubber->timestamp_ns = rubber->temp_buffer->timestamp_ns; 255 272 256 273 for (i = 0; i < FM_CHANNELS_STEREO; i++) … … 260 277 } 261 278 262 rubber->temp_timestamp_ns = rubber->temp_buffer->timestamp_ns; 279 /* if (rubber->temp_buffer->timestamp_ns >= 0) 280 g_print ("%s: got buffer with timestamp %" G_GINT64_FORMAT "\n", 281 fm_element_get_name (element), rubber->temp_buffer->timestamp_ns);*/ 263 282 264 283 rubberband_process (rubber->state, (const float *const *) rubber->temp_buffer->channel_data, samples_req, FALSE); 265 284 } 266 267 } 268 269 buffer->timestamp_ns = start_timestamp; 270 271 if ((rubber->last_timestamp == start_timestamp) && (start_timestamp == -1)) 272 return; 273 // g_print ("%s pos %ld\n", fm_element_get_name (element), buffer->timestamp_ns); 274 rubber->last_timestamp = buffer->timestamp_ns; 285 } 286 287 // g_print ("OUT %u samples\n", buffer->requested_samples); 288 289 buffer->timestamp_ns = start_timestamp_ns; 290 buffer->used_samples = buffer->requested_samples - samples_needed; 275 291 } 276 292 -
trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.h
r267 r273 48 48 49 49 FmBuffer *temp_buffer; 50 gint64 temp_timestamp_ns; 51 gint64 last_timestamp; 50 gint64 timestamp_ns; 52 51 53 52 gfloat **channel_ptr;
