prosperon/source/engine/sound/mix.c

77 lines
1.7 KiB
C
Raw Normal View History

2022-07-05 20:49:51 -05:00
#include "mix.h"
#include "stddef.h"
2022-07-06 17:17:06 -05:00
#include "time.h"
2022-07-05 20:49:51 -05:00
#include "sound.h"
#include "dsp.h"
#include <string.h>
#include "log.h"
2022-07-05 20:49:51 -05:00
static struct bus bus[256];
2023-01-15 11:16:25 -06:00
static int first = 0; /* First bus available */
//static struct bus *first_on = NULL;
static int first_on = -1; /* First bus to fill buffer with */
2022-07-05 20:49:51 -05:00
short mastermix[BUF_FRAMES*CHANNELS];
static int initted = 0;
2023-01-15 11:16:25 -06:00
void mixer_init() {
2022-07-05 20:49:51 -05:00
for (int i = 0; i < 256; i++) {
2023-01-15 11:16:25 -06:00
bus[i].next = i+1;
bus[i].on = 0;
bus[i].id = i;
2022-07-05 20:49:51 -05:00
}
2023-01-15 11:16:25 -06:00
bus[255].next = -1;
initted = 1;
2023-01-15 11:16:25 -06:00
}
struct bus *first_free_bus(struct dsp_filter in) {
if (!initted) {
YughError("Tried to use a mixing bus without calling mixer_init().");
return NULL;
}
2023-01-15 11:16:25 -06:00
if (first == -1) return NULL;
int ret = first;
first = bus[ret].next;
2023-01-15 11:16:25 -06:00
bus[ret].on = 1;
bus[ret].in = in;
2023-01-15 11:16:25 -06:00
if (first_on != -1) bus[first_on].prev = ret;
bus[ret].next = first_on;
bus[ret].prev = -1;
first_on = ret;
return &bus[ret];
2022-07-05 20:49:51 -05:00
}
void bus_free(struct bus *b)
2022-07-19 15:13:15 -05:00
{
if (first_on == b->id) first_on = b->next;
if (b->next != -1) bus[b->next].prev = b->prev;
if (b->prev != -1) bus[b->prev].next = b->next;
b->next = first;
first = b->id;
b->on = 0;
2022-07-19 15:13:15 -05:00
}
2022-07-06 17:17:06 -05:00
void bus_fill_buffers(short *master, int n) {
int curbus = first_on;
if (curbus == -1) return;
2023-01-15 11:16:25 -06:00
memset(master, 0, BUF_FRAMES*CHANNELS*sizeof(short));
while (curbus != -1) {
int nextbus = bus[curbus].next; /* Save this in case busses get changed during fill */
2023-01-15 11:16:25 -06:00
dsp_run(bus[curbus].in, bus[curbus].buf, BUF_FRAMES);
for (int i = 0; i < BUF_FRAMES*CHANNELS; i++)
master[i] += bus[curbus].buf[i];
curbus = nextbus;
2022-07-05 20:49:51 -05:00
}
}