#include "driver_internal.h"

int audrvMixAdd(AudioDriver* d, int sample_rate, int num_channels)
{
    if (num_channels < 1 || num_channels > 24)
        return -1;

    if (d->etc->free_mix_buffer_count < num_channels)
        return -1;

    int id = d->etc->first_free_mix;
    if (id < 0)
        return -1;

    d->etc->free_mix_buffer_count -= num_channels;
    d->etc->first_free_mix = d->etc->mixes[id].next_free;
    d->in_mixes[id].volume = 1.0f;
    d->in_mixes[id].sample_rate = sample_rate;
    d->in_mixes[id].buffer_count = num_channels;
    d->in_mixes[id].is_used = true;
    d->in_mixes[id].mix_id = id;
    d->in_mixes[id].node_id = AUDREN_NODEID(2,id,0);
    d->in_mixes[id].dest_mix_id = AUDREN_UNUSED_MIX_ID;
    d->in_mixes[id].dest_splitter_id = AUDREN_UNUSED_SPLITTER_ID;

    return id;
}

void audrvMixRemove(AudioDriver* d, int id)
{
    if (id <= AUDREN_FINAL_MIX_ID || id >= d->config.num_mix_objs)
        return;
    if (!d->in_mixes[id].is_used)
        return;

    d->etc->free_mix_buffer_count += d->in_mixes[id].buffer_count;
    d->etc->mixes[id].next_free = d->etc->first_free_mix;
    d->etc->first_free_mix = id;
    memset(&d->in_mixes[id], 0, sizeof(AudioRendererMixInfoIn));
}