| 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; |
| 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 | } |