Changeset 273

Show
Ignore:
Timestamp:
01/08/09 22:02:28 (3 years ago)
Author:
ath
Message:

Reimplement FmEffectRubber? in a more decent way.

Location:
trunk/fm_server/src/fm_effect_rubber
Files:
2 modified

Legend:

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

    r267 r273  
    3535#include "../fm_input.h" 
    3636#include "../fm_effect.h" 
     37#include "../fm_output.h" 
     38#include "../fm_sync.h" 
     39#include "../fm_pipeline.h" 
    3740#include "fm_effect_rubber.h" 
    3841 
    3942 
    4043enum { 
    41   PROP_0, 
    42   PROP_TIME_RATIO, 
    43   PROP_PITCH_SCALE 
     44        PROP_0, 
     45        PROP_TIME_RATIO, 
     46        PROP_PITCH_SCALE 
    4447}; 
    4548 
     
    147150        rubber->channel_ptr = NULL; 
    148151        rubber->latency = 0; 
    149         rubber->temp_timestamp_ns = -1; 
    150         rubber->last_timestamp = 0; 
     152        rubber->timestamp_ns = -1; 
    151153} 
    152154 
     
    167169                return FALSE; 
    168170 
    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); 
    170176        rubber->temp_buffer = fm_buffer_new (16384, FM_CHANNELS_STEREO); 
    171177        rubber->channel_ptr = g_new (gfloat *, FM_CHANNELS_STEREO); 
     
    195201        FmEffectRubber *rubber = FM_EFFECT_RUBBER (element); 
    196202        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 
    197211 
    198212        if (rubber->change_time_ratio > -1) { 
     
    201215                rubber->change_time_ratio = -1; 
    202216                rubber->latency = rubberband_get_latency (rubber->state); 
     217                g_print ("Rubber latency: %zd\n", rubber->latency); 
    203218        } 
    204219 
     
    208223                rubber->change_pitch_scale = -1; 
    209224                rubber->latency = rubberband_get_latency (rubber->state); 
     225                g_print ("Rubber latency: %zd\n", rubber->latency); 
    210226        } 
    211227 
     
    214230 
    215231        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; 
    219234         
    220235        while (samples_needed > 0) { 
     
    233248                                rubber->channel_ptr[i] += retrieved; 
    234249 
    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; 
    238254 
    239255                        if (retrieved != ask_for) 
     
    244260                        guint samples_req = rubberband_get_samples_required (rubber->state); 
    245261 
    246                         //g_print ("Requested %u samples\n", samples_req); 
     262//                      g_print ("IN %u samples\n", samples_req); 
    247263 
    248264                        rubber->temp_buffer->requested_samples = samples_req; 
    249  
    250265                        fm_element_get_buffer_from_src (element, rubber->temp_buffer, sync); 
     266 
    251267                        if (rubber->temp_buffer->discont == TRUE) { 
    252268                                g_print ("***************** DISCONT!!!!\n"); 
    253269                                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; 
    255272 
    256273                                for (i = 0; i < FM_CHANNELS_STEREO; i++) 
     
    260277                        } 
    261278 
    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);*/ 
    263282 
    264283                        rubberband_process (rubber->state, (const float *const *) rubber->temp_buffer->channel_data, samples_req, FALSE); 
    265284                } 
    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;  
    275291} 
    276292 
  • trunk/fm_server/src/fm_effect_rubber/fm_effect_rubber.h

    r267 r273  
    4848 
    4949        FmBuffer *temp_buffer; 
    50         gint64 temp_timestamp_ns; 
    51         gint64 last_timestamp; 
     50        gint64 timestamp_ns; 
    5251 
    5352        gfloat **channel_ptr;