Changeset 245 for trunk

Show
Ignore:
Timestamp:
03/26/08 22:18:28 (4 years ago)
Author:
ath
Message:

A big update of the timekeeping mechanism designed around FmEffectRubber?.

Location:
trunk/fm_server/src
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/fm_server/src/fm_buffer.c

    r232 r245  
    5959        buffer->requested_samples = 0; 
    6060 
    61         buffer->timestamp = 0; 
     61        buffer->timestamp_ns = 0; 
     62        buffer->timestamp_samples = 0; 
    6263        buffer->duration = 0; 
    6364         
     
    119120        buffer->discont = FALSE; 
    120121        buffer->silence = FALSE; 
    121         buffer->timestamp = 0; 
     122        buffer->timestamp_ns = -1; 
     123        buffer->timestamp_samples = -1; 
    122124        buffer->duration = 0;    
    123125} 
  • trunk/fm_server/src/fm_buffer.h

    r190 r245  
    5050        guint           requested_samples; 
    5151 
    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; 
    5354        guint64         duration;               // real duration of AUDIO (not silence) in the buffer  
    5455}; 
  • trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.c

    r243 r245  
    145145        rubber->change_pitch_scale = -1; 
    146146        rubber->channel_ptr = NULL; 
     147        rubber->latency = 0; 
     148        rubber->temp_timestamp_ns = -1; 
     149        rubber->last_timestamp = 0; 
    147150} 
    148151 
     
    196199                rubber->time_ratio = rubber->change_time_ratio; 
    197200                rubber->change_time_ratio = -1; 
     201                rubber->latency = fm_rubber_wrapper_get_latency (rubber->wrap); 
    198202        } 
    199203 
     
    202206                rubber->pitch_scale = rubber->change_pitch_scale; 
    203207                rubber->change_pitch_scale = -1; 
     208                rubber->latency = fm_rubber_wrapper_get_latency (rubber->wrap); 
    204209        } 
    205210 
     
    208213 
    209214        guint samples_needed = buffer->requested_samples; 
    210  
     215//      gboolean already_out_of_samples = FALSE; 
     216 
     217        guint64 start_timestamp = rubber->temp_timestamp_ns; 
     218         
    211219        while (samples_needed > 0) { 
    212220                guint samples_avail = fm_rubber_wrapper_available (rubber->wrap); 
     
    220228                        guint retrieved = fm_rubber_wrapper_retrieve (rubber->wrap, rubber->channel_ptr, ask_for); 
    221229                        samples_needed -= retrieved; 
    222                          
     230 
    223231                        for (i = 0; i < FM_CHANNELS_STEREO; i++) 
    224232                                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); 
    225237 
    226238                        if (retrieved != ask_for) 
     
    231243                        guint samples_req = fm_rubber_wrapper_get_samples_required (rubber->wrap); 
    232244 
     245                        //g_print ("Requested %u samples\n", samples_req); 
     246 
    233247                        rubber->temp_buffer->requested_samples = samples_req; 
    234248 
    235249                        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; 
    236262 
    237263                        fm_rubber_wrapper_process (rubber->wrap, rubber->temp_buffer->channel_data, samples_req, FALSE); 
     
    239265 
    240266        } 
     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; 
    241274} 
    242275 
  • trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.h

    r238 r245  
    4343 
    4444        FmBuffer *temp_buffer; 
     45        gint64 temp_timestamp_ns; 
     46        gint64 last_timestamp; 
    4547 
    4648        gfloat **channel_ptr; 
     
    5153        gdouble change_time_ratio; 
    5254        gdouble change_pitch_scale; 
     55 
     56        size_t latency; 
    5357}; 
    5458 
  • trunk/fm_server/src/fm_element.c

    r232 r245  
    218218         
    219219        return (gchar *) g_object_get_data (G_OBJECT (element), "name"); 
    220         //return (element->name); 
    221220} 
    222221 
     
    464463        (*klass->become_sync_master) (peer_sync_master, reference->sync_ref); 
    465464} 
     465 
     466 
     467gint64 
     468fm_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  
    178178fm_element_sync_ref_set_peer_master     (FmElement      *reference, 
    179179                                         FmElement      *peer_sync_master); 
     180 
     181gint64 
     182fm_element_samples_to_ns                (FmElement      *element, 
     183                                         gint64         samples); 
  • trunk/fm_server/src/fm_input_cdj.c

    r238 r245  
    192192fm_input_cdj_init                       (FmInputCDJ     *input_cdj) 
    193193{ 
     194        static gint serial = 0; 
    194195        input_cdj->input = fm_input_gst_new (); 
    195196        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++; 
    196200 
    197201        fm_element_connect_src (FM_ELEMENT (input_cdj->rate), FM_ELEMENT (input_cdj->input)); 
     
    316320                if (FM_BUFFER_DISCONT (buffer)) { 
    317321                        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); 
    320324                        FM_BUFFER_DISCONT (buffer) = FALSE; 
    321325                } else { 
  • trunk/fm_server/src/fm_input_gst/fm_input_gst.c

    r242 r245  
    615615        if ((!input_gst->play_when_ready) || (!chk) || (chk->eof)) { 
    616616                fm_buffer_fill_with_silence (buffer); 
     617//              g_print ("FILL\n"); 
     618                buffer->timestamp_ns = -1; 
     619                buffer->timestamp_samples = -1; 
    617620                return; 
    618621        } 
     
    647650        chk->samples_read += useful_read_samples; 
    648651 
    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); 
    650654        buffer->used_samples = buffer->requested_samples; 
    651655        buffer->duration = samples_to_ns (common, useful_read_samples); 
     
    682686                _send_position (input_gst); 
    683687        } 
     688 
     689        //g_print ("GST pos %ld\n", buffer->timestamp_ns); 
    684690} 
    685691