Changeset 274 for trunk

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

Random bugfixes to FmBuffer handling.

Location:
trunk/fm_server/src
Files:
4 modified

Legend:

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

    r246 r274  
    268268                                         gdouble        value) 
    269269{ 
    270         FmEffectGain *gain; 
     270        FmEffectGain *gain = NULL; 
    271271 
    272272        if (port_n > -1) { 
  • trunk/fm_server/src/fm_input_gst/fm_input_gst.c

    r269 r274  
    514514                chk = track->read_chunk; 
    515515 
    516         fm_buffer_reset_flags (buffer); 
     516/*      fm_buffer_reset_flags (buffer);*/ 
    517517 
    518518        /* Check if we have a new track ready */ 
  • trunk/fm_server/src/fm_mixer.c

    r246 r274  
    213213        peer_port->peers_n++; 
    214214 
     215        mixer->buffers[mixer->buffers_n] = fm_buffer_new(MAX_BUFFER_SIZE, FM_CHANNELS_STEREO); 
     216//      g_print ("APPENDING PORT at %p, buffer base at %p, %d\n", our_port, mixer->buffers[mixer->buffers_n], mixer->buffers_n); 
     217        mixer->buffers_n++; 
     218 
     219        /* add this only at the end */ 
    215220        element->sink_ports = g_list_append(element->sink_ports, our_port); 
    216  
    217         mixer->buffers[mixer->buffers_n] = fm_buffer_new(MAX_BUFFER_SIZE, FM_CHANNELS_STEREO); 
    218         mixer->buffers_n++; 
    219221} 
    220222 
     
    229231        /* Careful - we might not have created a sink port yet */ 
    230232        if (!element->sink_ports || (mixer->buffers_n == 0)) { 
    231                 fm_buffer_fill_with_silence(buffer); 
    232                 FM_BUFFER_USED_SAMPLES (buffer) = FM_BUFFER_REQUESTED (buffer); 
     233                fm_buffer_fill_with_silence (buffer); 
     234                buffer->used_samples = buffer->requested_samples; 
    233235                return; 
    234236        } 
     
    237239        GList *port = element->sink_ports; 
    238240        gint i = 0; 
    239  
    240 //g_print("%p\n", element->sync_ref); 
    241  
    242         if (element->peer_sync_master) { 
    243                 FM_BUFFER_REQUESTED (mixer->buffers[i]) = FM_BUFFER_REQUESTED (buffer); 
    244                  
    245                 g_print ("Getting data from master port\n"); 
    246                 fm_element_get_buffer (element->peer_sync_master, mixer->buffers[i++], sync); 
    247         } 
     241        guint l, m; 
     242 
     243        gboolean first_to_mix = TRUE; 
    248244 
    249245        while (port) { 
     246//              g_print ("PORT %p, buffer base %p %d\n", port->data, mixer->buffers[i], i); 
     247                FmBuffer *sink_buffer = mixer->buffers[i]; 
     248 
    250249                FmElementSinkPort *our_port = (FmElementSinkPort *) port->data; 
    251250                FmElementSrcPort *peer_port = our_port->peer; 
    252251 
    253                 if (element->peer_sync_master == peer_port->owner) 
    254                         continue; 
    255  
    256                 FM_BUFFER_REQUESTED (mixer->buffers[i]) = FM_BUFFER_REQUESTED (buffer); 
    257 //              g_print("i %d\n", i); 
    258                 fm_element_get_buffer (FM_ELEMENT (peer_port->owner), mixer->buffers[i++], sync); 
     252                gint samples_needed = buffer->requested_samples; 
     253                gint mixed_offset = 0; 
     254 
     255                while (samples_needed > 0) { 
     256                        sink_buffer->requested_samples = samples_needed; 
     257                        fm_element_get_buffer (FM_ELEMENT (peer_port->owner), sink_buffer, sync); 
     258 
     259/*                      if (sink_buffer->timestamp_ns >= 0) 
     260                                g_print ("%s: got buffer with timestamp %" G_GINT64_FORMAT "\n",  
     261                                         fm_element_get_name (element), sink_buffer->timestamp_ns);*/ 
     262 
     263                        if (sink_buffer->used_samples != sink_buffer->requested_samples) 
     264                                g_warning ("difference! %d %d", sink_buffer->used_samples, sink_buffer->requested_samples); 
     265 
     266                        for (l = 0; l < buffer->n_channels; l++) { 
     267                                gfloat *sink_buffer_data = sink_buffer->channel_data[l]; 
     268                                gfloat *mixed_buffer_data = buffer->channel_data[l]/* + mixed_offset*/; 
     269 
     270                                if (first_to_mix) 
     271                                        memcpy (mixed_buffer_data, sink_buffer_data, sink_buffer->used_samples * sizeof (gfloat)); 
     272                                else 
     273                                        for (m = 0; m < sink_buffer->used_samples; m++) 
     274                                                mixed_buffer_data[m] += sink_buffer_data[m]; 
     275                        }        
     276 
     277                        samples_needed -= sink_buffer->used_samples; 
     278                        mixed_offset += sink_buffer->used_samples; 
     279                        g_assert (samples_needed >= 0); 
     280                } 
     281 
     282                if (first_to_mix) 
     283                        first_to_mix = FALSE; 
    259284 
    260285                port = g_list_next (port); 
    261         }        
    262          
    263         /* Copy the first buffer's content */ 
    264         for (i = 0; i < buffer->n_channels; i++) 
    265                 memcpy(buffer->channel_data[i], mixer->buffers[0]->channel_data[i], FM_BUFFER_REQUESTED(buffer) * sizeof (gfloat)); 
    266  
    267         if (mixer->buffers_n == 1) 
    268                 return; 
    269  
    270         /* Then add the rest */ 
    271         gint l, m; 
    272         for (l = 1; l < mixer->buffers_n; l++) { 
    273                 for (i = 0; i < mixer->buffers[0]->n_channels; i++) { 
    274                         gfloat *this_buffer_data = mixer->buffers[l]->channel_data[i]; 
    275                         gfloat *our_buffer_data = buffer->channel_data[i]; 
    276                         for (m = 0; m < FM_BUFFER_REQUESTED(buffer); m++) 
    277                                 our_buffer_data[m] += this_buffer_data[m]; 
    278                 } 
    279         } 
    280          
    281         FM_BUFFER_USED_SAMPLES (buffer) = FM_BUFFER_REQUESTED (buffer); 
    282 } 
     286                i++; 
     287        } 
     288 
     289        buffer->used_samples = buffer->requested_samples; 
     290} 
  • trunk/fm_server/src/fm_output_alsa.c

    r269 r274  
    481481         
    482482        while (!output_alsa->stop_processing) { 
     483 
     484                fm_buffer_reset (output_alsa->main_buffer); 
    483485         
    484486                //g_print("asking for %d samples\n", output_alsa->buffer_size_samples); 
    485                 FM_BUFFER_REQUESTED(output_alsa->main_buffer) = output_alsa->buffer_size_samples; 
    486                 fm_element_get_buffer_from_src(element, output_alsa->main_buffer, NULL); 
     487                FM_BUFFER_REQUESTED (output_alsa->main_buffer) = output_alsa->buffer_size_samples; 
     488                fm_element_get_buffer_from_src (element, output_alsa->main_buffer, NULL); 
    487489 
    488490/*              FmSync *sync = fm_element_pipeline_get_sync_info (element);