Audio mixer
This commit is contained in:
parent
e9f83baa37
commit
1c556a70bc
42
source/engine/mix.c
Normal file
42
source/engine/mix.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include "mix.h"
|
||||
#include "stddef.h"
|
||||
|
||||
#include "sound.h"
|
||||
|
||||
static struct bus bus[256];
|
||||
short mastermix[BUF_FRAMES*CHANNELS];
|
||||
|
||||
struct bus *first_free_bus() {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
if (!bus[i].on) return &bus[i];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void bus_fill_buffers() {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
if (!bus[i].on) continue;
|
||||
|
||||
short *s = (short*)bus[i].sound->data->data;
|
||||
|
||||
for (int k = 0; k < BUF_FRAMES; k++) {
|
||||
for (int j = 0; j < CHANNELS; j++) {
|
||||
bus[i].buf[k*CHANNELS + j] = s[bus[i].sound->frame++];
|
||||
if (bus[i].sound->frame == bus[i].sound->data->frames) {
|
||||
bus[i].sound->frame = 0;
|
||||
if (!bus[i].sound->loop) bus[i].on = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < BUF_FRAMES*CHANNELS; i++) {
|
||||
mastermix[i] = 0;
|
||||
|
||||
for (int j = 0; j < 256; j++) {
|
||||
if (!bus[j].on) continue;
|
||||
mastermix[i] += bus[j].buf[i];
|
||||
}
|
||||
}
|
||||
}
|
23
source/engine/mix.h
Normal file
23
source/engine/mix.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef MIX_H
|
||||
#define MIX_H
|
||||
|
||||
#define BUF_FRAMES 4096
|
||||
#define CHANNELS 2
|
||||
#define MUSIZE 2
|
||||
|
||||
struct sound;
|
||||
|
||||
|
||||
struct bus {
|
||||
int on;
|
||||
struct sound *sound;
|
||||
short buf[BUF_FRAMES*CHANNELS];
|
||||
};
|
||||
|
||||
extern short mastermix[BUF_FRAMES*CHANNELS];
|
||||
|
||||
struct bus *first_free_bus();
|
||||
void bus_fill_buffers();
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue