- Timestamp:
- 03/26/08 22:18:28 (4 years ago)
- Location:
- trunk/fm_server/src
- Files:
-
- 8 modified
-
fm_buffer.c (modified) (2 diffs)
-
fm_buffer.h (modified) (1 diff)
-
fm_effect_rubber/fm_effect_rubber.c (modified) (7 diffs)
-
fm_effect_rubber/fm_effect_rubber.h (modified) (2 diffs)
-
fm_element.c (modified) (2 diffs)
-
fm_element.h (modified) (1 diff)
-
fm_input_cdj.c (modified) (2 diffs)
-
fm_input_gst/fm_input_gst.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fm_server/src/fm_buffer.c
r232 r245 59 59 buffer->requested_samples = 0; 60 60 61 buffer->timestamp = 0; 61 buffer->timestamp_ns = 0; 62 buffer->timestamp_samples = 0; 62 63 buffer->duration = 0; 63 64 … … 119 120 buffer->discont = FALSE; 120 121 buffer->silence = FALSE; 121 buffer->timestamp = 0; 122 buffer->timestamp_ns = -1; 123 buffer->timestamp_samples = -1; 122 124 buffer->duration = 0; 123 125 } -
trunk/fm_server/src/fm_buffer.h
r190 r245 50 50 guint requested_samples; 51 51 52 guint64 timestamp; // real timestamp from start of the song 52 gint64 timestamp_ns; // real timestamp from start of the song 53 gint64 timestamp_samples; 53 54 guint64 duration; // real duration of AUDIO (not silence) in the buffer 54 55 }; -
trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.c
r243 r245 145 145 rubber->change_pitch_scale = -1; 146 146 rubber->channel_ptr = NULL; 147 rubber->latency = 0; 148 rubber->temp_timestamp_ns = -1; 149 rubber->last_timestamp = 0; 147 150 } 148 151 … … 196 199 rubber->time_ratio = rubber->change_time_ratio; 197 200 rubber->change_time_ratio = -1; 201 rubber->latency = fm_rubber_wrapper_get_latency (rubber->wrap); 198 202 } 199 203 … … 202 206 rubber->pitch_scale = rubber->change_pitch_scale; 203 207 rubber->change_pitch_scale = -1; 208 rubber->latency = fm_rubber_wrapper_get_latency (rubber->wrap); 204 209 } 205 210 … … 208 213 209 214 guint samples_needed = buffer->requested_samples; 210 215 // gboolean already_out_of_samples = FALSE; 216 217 guint64 start_timestamp = rubber->temp_timestamp_ns; 218 211 219 while (samples_needed > 0) { 212 220 guint samples_avail = fm_rubber_wrapper_available (rubber->wrap); … … 220 228 guint retrieved = fm_rubber_wrapper_retrieve (rubber->wrap, rubber->channel_ptr, ask_for); 221 229 samples_needed -= retrieved; 222 230 223 231 for (i = 0; i < FM_CHANNELS_STEREO; i++) 224 232 rubber->channel_ptr[i] += retrieved; 233 234 if (rubber->temp_timestamp_ns >= 0) 235 rubber->temp_timestamp_ns += fm_element_samples_to_ns (element, 236 retrieved / rubber->time_ratio); 225 237 226 238 if (retrieved != ask_for) … … 231 243 guint samples_req = fm_rubber_wrapper_get_samples_required (rubber->wrap); 232 244 245 //g_print ("Requested %u samples\n", samples_req); 246 233 247 rubber->temp_buffer->requested_samples = samples_req; 234 248 235 249 fm_element_get_buffer_from_src (element, rubber->temp_buffer, sync); 250 if (rubber->temp_buffer->discont == TRUE) { 251 g_print ("***************** DISCONT!!!!\n"); 252 fm_rubber_wrapper_reset (rubber->wrap); 253 start_timestamp = rubber->temp_buffer->timestamp_ns; 254 255 for (i = 0; i < FM_CHANNELS_STEREO; i++) 256 rubber->channel_ptr[i] = buffer->channel_data[i]; 257 258 samples_needed = buffer->requested_samples; 259 } 260 261 rubber->temp_timestamp_ns = rubber->temp_buffer->timestamp_ns; 236 262 237 263 fm_rubber_wrapper_process (rubber->wrap, rubber->temp_buffer->channel_data, samples_req, FALSE); … … 239 265 240 266 } 267 268 buffer->timestamp_ns = start_timestamp; 269 270 if ((rubber->last_timestamp == start_timestamp) && (start_timestamp == -1)) 271 return; 272 g_print ("%s pos %ld\n", fm_element_get_name (element), buffer->timestamp_ns); 273 rubber->last_timestamp = buffer->timestamp_ns; 241 274 } 242 275 -
trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.h
r238 r245 43 43 44 44 FmBuffer *temp_buffer; 45 gint64 temp_timestamp_ns; 46 gint64 last_timestamp; 45 47 46 48 gfloat **channel_ptr; … … 51 53 gdouble change_time_ratio; 52 54 gdouble change_pitch_scale; 55 56 size_t latency; 53 57 }; 54 58 -
trunk/fm_server/src/fm_element.c
r232 r245 218 218 219 219 return (gchar *) g_object_get_data (G_OBJECT (element), "name"); 220 //return (element->name);221 220 } 222 221 … … 464 463 (*klass->become_sync_master) (peer_sync_master, reference->sync_ref); 465 464 } 465 466 467 gint64 468 fm_element_samples_to_ns (FmElement *element, 469 gint64 samples) 470 { 471 g_return_val_if_fail (samples >= 0, -1); 472 g_return_val_if_fail (element->pipeline, -1); 473 474 FmPipeline *pipeline = FM_PIPELINE (element->pipeline); 475 g_return_val_if_fail (pipeline->sample_rate > 0, -1); 476 477 return (guint64) ((gdouble) G_USEC_PER_SEC * G_GINT64_CONSTANT (1000) / pipeline->sample_rate) * samples; 478 } -
trunk/fm_server/src/fm_element.h
r232 r245 178 178 fm_element_sync_ref_set_peer_master (FmElement *reference, 179 179 FmElement *peer_sync_master); 180 181 gint64 182 fm_element_samples_to_ns (FmElement *element, 183 gint64 samples); -
trunk/fm_server/src/fm_input_cdj.c
r238 r245 192 192 fm_input_cdj_init (FmInputCDJ *input_cdj) 193 193 { 194 static gint serial = 0; 194 195 input_cdj->input = fm_input_gst_new (); 195 196 input_cdj->rate = fm_effect_rubber_new (); 197 g_object_set_data (G_OBJECT (input_cdj->input), "name", g_strdup_printf ("input%d", serial)); 198 g_object_set_data (G_OBJECT (input_cdj->rate), "name", g_strdup_printf ("rubber%d", serial)); 199 serial++; 196 200 197 201 fm_element_connect_src (FM_ELEMENT (input_cdj->rate), FM_ELEMENT (input_cdj->input)); … … 316 320 if (FM_BUFFER_DISCONT (buffer)) { 317 321 g_print ("**************************************************************************************************\n"); 318 g_print ("DISCONT buffer! new pos %llu\n", (long long unsigned int) FM_BUFFER_TIMESTAMP (buffer));319 fm_sync_set (sync, 0, FM_BUFFER_TIMESTAMP (buffer));322 g_print ("DISCONT buffer! new pos %llu\n", (long long unsigned int) buffer->timestamp_ns); 323 fm_sync_set (sync, 0, buffer->timestamp_ns); 320 324 FM_BUFFER_DISCONT (buffer) = FALSE; 321 325 } else { -
trunk/fm_server/src/fm_input_gst/fm_input_gst.c
r242 r245 615 615 if ((!input_gst->play_when_ready) || (!chk) || (chk->eof)) { 616 616 fm_buffer_fill_with_silence (buffer); 617 // g_print ("FILL\n"); 618 buffer->timestamp_ns = -1; 619 buffer->timestamp_samples = -1; 617 620 return; 618 621 } … … 647 650 chk->samples_read += useful_read_samples; 648 651 649 buffer->timestamp = samples_to_ns (common, current_pos_samples_old); 652 buffer->timestamp_samples = current_pos_samples_old; 653 buffer->timestamp_ns = samples_to_ns (common, buffer->timestamp_samples); 650 654 buffer->used_samples = buffer->requested_samples; 651 655 buffer->duration = samples_to_ns (common, useful_read_samples); … … 682 686 _send_position (input_gst); 683 687 } 688 689 //g_print ("GST pos %ld\n", buffer->timestamp_ns); 684 690 } 685 691
