Skip to content

Commit

Permalink
Clear buffers of failed mix segments.
Browse files Browse the repository at this point in the history
Fixes #5 (suboptimally)
  • Loading branch information
Shinmera committed Dec 17, 2018
1 parent 4b63468 commit 3f371ea
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
16 changes: 12 additions & 4 deletions src/segments/basic_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,19 +88,27 @@ int basic_mixer_mix(size_t samples, struct mixed_segment *segment){
// Mix first buffer directly.
struct mixer_source *source = data->sources[c];
struct mixed_segment *segment = source->segment;
if(segment) segment->mix(samples, segment);

float *in = source->buffer->data;
if(segment){
// FIXME: This is not optimal. Ideally we'd avoid mixing entirely.
if(!segment->mix(samples, segment))
memset(in, 0, samples*sizeof(float));
}

for(size_t i=0; i<samples; ++i){
out[i] = in[i]*div;
}
// Mix other buffers additively.
for(size_t b=1; b<buffers; ++b){
source = data->sources[b*channels+c];
segment = source->segment;
if(segment) segment->mix(samples, segment);

in = source->buffer->data;

if(segment){
if(!segment->mix(samples, segment))
memset(in, 0, samples*sizeof(float));
}

for(size_t i=0; i<samples; ++i){
out[i] += in[i]*div;
}
Expand Down
19 changes: 15 additions & 4 deletions src/segments/space_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,15 @@ int space_mixer_mix(size_t samples, struct mixed_segment *segment){
struct space_source *source = data->sources[0];
// Invoke segment's mixing function if necessary.
struct mixed_segment *segment = source->segment;
if(segment) segment->mix(samples, segment);
// Perform mix.
float *in = source->buffer->data;

if(segment){
// FIXME: This is not optimal. Ideally we'd avoid mixing entirely.
if(!segment->mix(samples, segment))
memset(in, 0, samples*sizeof(float));
}

// Perform mix.
calculate_volumes(&lvolume, &rvolume, source, data);
for(size_t i=0; i<samples; ++i){
left[i] = in[i] * lvolume;
Expand All @@ -198,9 +204,14 @@ int space_mixer_mix(size_t samples, struct mixed_segment *segment){
source = data->sources[s];
// Invoke segment's mixing function if necessary.
segment = source->segment;
if(segment) segment->mix(samples, segment);
// Perform mix.
in = source->buffer->data;

if(segment){
if(!segment->mix(samples, segment))
memset(in, 0, samples*sizeof(float));
}

// Perform mix.
calculate_volumes(&lvolume, &rvolume, source, data);
for(size_t i=0; i<samples; ++i){
left[i] += in[i] * lvolume;
Expand Down

0 comments on commit 3f371ea

Please sign in to comment.