corrected level fn registering; initial move to sokol_audio w/ 32bit float sound [57d84de51f509035]
This commit is contained in:
parent
a3c6292eb2
commit
6dbfb2afd3
2
Makefile
2
Makefile
|
@ -84,7 +84,7 @@ ifeq ($(OS), WIN32)
|
||||||
EXT = .exe
|
EXT = .exe
|
||||||
else
|
else
|
||||||
LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib -pthread -rdynamic
|
LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib -pthread -rdynamic
|
||||||
ELIBS = engine pthread quickjs glfw3 GL c m dl
|
ELIBS = engine pthread quickjs glfw3 asound GL c m dl
|
||||||
CLIBS =
|
CLIBS =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,6 @@
|
||||||
|
|
||||||
#include "HandmadeMath.h"
|
#include "HandmadeMath.h"
|
||||||
|
|
||||||
#include "miniaudio.h"
|
|
||||||
|
|
||||||
static JSValue globalThis;
|
static JSValue globalThis;
|
||||||
|
|
||||||
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
|
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
|
||||||
|
@ -1179,7 +1177,7 @@ JSValue duk_sys_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *ar
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
sim_stop();
|
sim_pause();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
|
|
File diff suppressed because it is too large
Load diff
96035
source/engine/s7.c
96035
source/engine/s7.c
File diff suppressed because it is too large
Load diff
1239
source/engine/s7.h
1239
source/engine/s7.h
File diff suppressed because it is too large
Load diff
|
@ -157,9 +157,9 @@ JSValue script_compile(const char *file)
|
||||||
{
|
{
|
||||||
const char *script = slurp_text(file);
|
const char *script = slurp_text(file);
|
||||||
char strbuf[strlen(script)+50];
|
char strbuf[strlen(script)+50];
|
||||||
sprintf(strbuf, "(function(){%s})", script);
|
sprintf(strbuf, "(function(){\n%s\n})", script);
|
||||||
|
|
||||||
JSValue fn = JS_Eval(js, strbuf, strlen(script), file, JS_EVAL_FLAGS);
|
JSValue fn = JS_Eval(js, strbuf, strlen(strbuf), file, JS_EVAL_FLAGS);
|
||||||
|
|
||||||
free(script);
|
free(script);
|
||||||
return fn;
|
return fn;
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
#include "dsp.h"
|
#include "dsp.h"
|
||||||
#include "mix.h"
|
#include "mix.h"
|
||||||
|
|
||||||
#include "miniaudio.h"
|
#define SOKOL_AUDIO_IMPL
|
||||||
|
#include "sokol/sokol_audio.h"
|
||||||
|
|
||||||
#define TSF_IMPLEMENTATION
|
#define TSF_IMPLEMENTATION
|
||||||
#include "tsf.h"
|
#include "tsf.h"
|
||||||
|
@ -97,17 +98,18 @@ void wav_norm_gain(struct wav *w, double lv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_engine *engine;
|
void push_sound(float *buffer, int frames, int chan)
|
||||||
|
{
|
||||||
|
bus_fill_buffers(buffer, frames*chan);
|
||||||
|
}
|
||||||
|
|
||||||
void sound_init() {
|
void sound_init() {
|
||||||
ma_result result;
|
saudio_setup(&(saudio_desc){
|
||||||
engine = malloc(sizeof(*engine));
|
.stream_cb = push_sound,
|
||||||
result = ma_engine_init(NULL, engine);
|
.sample_rate = SAMPLERATE,
|
||||||
if (result != MA_SUCCESS) {
|
.num_channels = CHANNELS,
|
||||||
return;
|
.buffer_frames = BUF_FRAMES,
|
||||||
}
|
});
|
||||||
return;
|
|
||||||
|
|
||||||
mixer_init();
|
mixer_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,32 +158,31 @@ struct soundstream *soundstream_make() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mini_sound(char *path) {
|
void mini_sound(char *path) {
|
||||||
ma_engine_play_sound(engine, path, NULL);
|
|
||||||
|
//ma_engine_play_sound(engine, path, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_sound music_sound;
|
|
||||||
|
|
||||||
void mini_music_play(char *path) {
|
void mini_music_play(char *path) {
|
||||||
ma_sound_uninit(&music_sound);
|
/* int result = ma_sound_init_from_file(engine, path, MA_SOUND_FLAG_NO_SPATIALIZATION, NULL, NULL, &music_sound);
|
||||||
int result = ma_sound_init_from_file(engine, path, MA_SOUND_FLAG_NO_SPATIALIZATION, NULL, NULL, &music_sound);
|
|
||||||
if (result != MA_SUCCESS) {
|
if (result != MA_SUCCESS) {
|
||||||
YughInfo("Could not load music at path: %s", path);
|
YughInfo("Could not load music at path: %s", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
YughInfo("Loading %s...", path);
|
YughInfo("Loading %s...", path);
|
||||||
ma_sound_start(&music_sound);
|
ma_sound_start(&music_sound);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void mini_music_pause() {
|
void mini_music_pause() {
|
||||||
ma_sound_stop(&music_sound);
|
// ma_sound_stop(&music_sound);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mini_music_stop() {
|
void mini_music_stop() {
|
||||||
ma_sound_stop(&music_sound);
|
// ma_sound_stop(&music_sound);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mini_master(float v) {
|
void mini_master(float v) {
|
||||||
ma_engine_set_volume(engine, v);
|
// ma_engine_set_volume(engine, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kill_oneshot(struct sound *s) {
|
void kill_oneshot(struct sound *s) {
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
struct circbuf;
|
struct circbuf;
|
||||||
|
|
||||||
|
typedef float soundbyte;
|
||||||
|
|
||||||
struct Mix_Chunk {
|
struct Mix_Chunk {
|
||||||
int i;
|
int i;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,9 +12,7 @@ static struct bus bus[256];
|
||||||
static int first = 0; /* First bus available */
|
static int first = 0; /* First bus available */
|
||||||
|
|
||||||
static int first_on = -1; /* First bus to fill buffer with */
|
static int first_on = -1; /* First bus to fill buffer with */
|
||||||
short mastermix[BUF_FRAMES*CHANNELS];
|
soundbyte mastermix[BUF_FRAMES*CHANNELS];
|
||||||
|
|
||||||
static int initted = 0;
|
|
||||||
|
|
||||||
static float master_volume = 1.f;
|
static float master_volume = 1.f;
|
||||||
|
|
||||||
|
@ -32,13 +30,9 @@ void mixer_init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bus[255].next = -1;
|
bus[255].next = -1;
|
||||||
|
|
||||||
initted = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bus *first_free_bus(struct dsp_filter in) {
|
struct bus *first_free_bus(struct dsp_filter in) {
|
||||||
// assert(initted);
|
|
||||||
|
|
||||||
for (int i = 0; i < 255; i++)
|
for (int i = 0; i < 255; i++)
|
||||||
if (!bus[i].on) {
|
if (!bus[i].on) {
|
||||||
bus[i].on = 1;
|
bus[i].on = 1;
|
||||||
|
@ -79,10 +73,10 @@ void bus_free(struct bus *b)
|
||||||
b->on = 0;
|
b->on = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bus_fill_buffers(short *master, int n) {
|
void bus_fill_buffers(soundbyte *master, int n) {
|
||||||
int curbus = first_on;
|
int curbus = first_on;
|
||||||
// if (curbus == -1) return;
|
// if (curbus == -1) return;
|
||||||
memset(master, 0, BUF_FRAMES*CHANNELS*sizeof(short));
|
memset(master, 0, BUF_FRAMES*CHANNELS*sizeof(soundbyte));
|
||||||
|
|
||||||
for (int i = 0; i < 255; i++) {
|
for (int i = 0; i < 255; i++) {
|
||||||
if (!bus[i].on) continue;
|
if (!bus[i].on) continue;
|
||||||
|
|
|
@ -2,13 +2,11 @@
|
||||||
#define MIX_H
|
#define MIX_H
|
||||||
|
|
||||||
#include "dsp.h"
|
#include "dsp.h"
|
||||||
|
#include "sound.h"
|
||||||
struct sound;
|
|
||||||
|
|
||||||
|
|
||||||
struct bus {
|
struct bus {
|
||||||
struct dsp_filter in;
|
struct dsp_filter in;
|
||||||
short buf[BUF_FRAMES*CHANNELS];
|
soundbyte buf[BUF_FRAMES*CHANNELS];
|
||||||
float gain;
|
float gain;
|
||||||
int on;
|
int on;
|
||||||
int next; /* Next available bus */
|
int next; /* Next available bus */
|
||||||
|
@ -16,12 +14,12 @@ struct bus {
|
||||||
int id;
|
int id;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern short mastermix[BUF_FRAMES*CHANNELS];
|
extern soundbyte mastermix[BUF_FRAMES*CHANNELS];
|
||||||
|
|
||||||
void mixer_init();
|
void mixer_init();
|
||||||
|
|
||||||
struct bus *first_free_bus(struct dsp_filter in);
|
struct bus *first_free_bus(struct dsp_filter in);
|
||||||
void bus_fill_buffers(short *master, int n);
|
void bus_fill_buffers(soundbyte *master, int n);
|
||||||
|
|
||||||
/* Set volume between 0 and 100% */
|
/* Set volume between 0 and 100% */
|
||||||
void mix_master_vol(float v);
|
void mix_master_vol(float v);
|
||||||
|
|
|
@ -16,15 +16,12 @@ float music_pan = 0.f;
|
||||||
|
|
||||||
void dsp_midi_fillbuf(struct dsp_midi_song *song, void *out, int n)
|
void dsp_midi_fillbuf(struct dsp_midi_song *song, void *out, int n)
|
||||||
{
|
{
|
||||||
short *o = (short*)out;
|
soundbyte *o = (soundbyte*)out;
|
||||||
tml_message *midi = song->midi;
|
tml_message *midi = song->midi;
|
||||||
|
|
||||||
for (int i = 0; i < n; i += TSF_BLOCK) {
|
for (int i = 0; i < n; i += TSF_BLOCK) {
|
||||||
|
|
||||||
while (midi && song->time >= midi->time) {
|
while (midi && song->time >= midi->time) {
|
||||||
|
switch (midi->type) {
|
||||||
switch (midi->type)
|
|
||||||
{
|
|
||||||
case TML_PROGRAM_CHANGE:
|
case TML_PROGRAM_CHANGE:
|
||||||
tsf_channel_set_presetnumber(song->sf, midi->channel, midi->program, (midi->channel == 9));
|
tsf_channel_set_presetnumber(song->sf, midi->channel, midi->program, (midi->channel == 9));
|
||||||
break;
|
break;
|
||||||
|
@ -46,19 +43,16 @@ void dsp_midi_fillbuf(struct dsp_midi_song *song, void *out, int n)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
midi = midi->next;
|
midi = midi->next;
|
||||||
}
|
}
|
||||||
|
tsf_render_float(song->sf, o, TSF_BLOCK, 0);
|
||||||
|
|
||||||
tsf_render_short(song->sf, o, TSF_BLOCK, 0);
|
|
||||||
o += TSF_BLOCK*CHANNELS;
|
o += TSF_BLOCK*CHANNELS;
|
||||||
song->time += TSF_BLOCK * (1000.f/SAMPLERATE);
|
song->time += TSF_BLOCK * (1000.f/SAMPLERATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
song->midi = midi;
|
song->midi = midi;
|
||||||
|
|
||||||
dsp_pan(&music_pan, out, n);
|
// dsp_pan(&music_pan, out, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bus *musicbus;
|
struct bus *musicbus;
|
||||||
|
@ -88,9 +82,9 @@ void play_song(const char *midi, const char *sf)
|
||||||
cursong.data = &gsong;
|
cursong.data = &gsong;
|
||||||
cursong.filter = dsp_midi_fillbuf;
|
cursong.filter = dsp_midi_fillbuf;
|
||||||
musicbus = first_free_bus(cursong);
|
musicbus = first_free_bus(cursong);
|
||||||
|
YughWarn("DID IT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void music_play()
|
void music_play()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ double renderMS = 1 / 165.f;
|
||||||
double physMS = 1 / 165.f;
|
double physMS = 1 / 165.f;
|
||||||
double updateMS = 1 / 165.f;
|
double updateMS = 1 / 165.f;
|
||||||
|
|
||||||
static int sim_play = 0;
|
|
||||||
double lastTick = 0.0;
|
double lastTick = 0.0;
|
||||||
static int phys_step = 0;
|
static int phys_step = 0;
|
||||||
|
|
||||||
|
@ -59,10 +59,11 @@ static double framems[FPSBUF];
|
||||||
int framei = 0;
|
int framei = 0;
|
||||||
int fps;
|
int fps;
|
||||||
|
|
||||||
#define SIM_STOP 0
|
#define SIM_PLAY 0
|
||||||
#define SIM_PLAY 1
|
#define SIM_PAUSE 1
|
||||||
#define SIM_PAUSE 2
|
#define SIM_STEP 2
|
||||||
#define SIM_STEP 3
|
|
||||||
|
static int sim_play = SIM_PLAY;
|
||||||
|
|
||||||
#ifdef __TINYC__
|
#ifdef __TINYC__
|
||||||
int backtrace(void **buffer, int size) {
|
int backtrace(void **buffer, int size) {
|
||||||
|
@ -282,7 +283,6 @@ int frame_fps() {
|
||||||
|
|
||||||
int sim_playing() { return sim_play == SIM_PLAY; }
|
int sim_playing() { return sim_play == SIM_PLAY; }
|
||||||
int sim_paused() { return sim_play == SIM_PAUSE; }
|
int sim_paused() { return sim_play == SIM_PAUSE; }
|
||||||
int sim_stopped() { return sim_play == SIM_STOP; }
|
|
||||||
|
|
||||||
void sim_start() {
|
void sim_start() {
|
||||||
sim_play = SIM_PLAY;
|
sim_play = SIM_PLAY;
|
||||||
|
@ -292,11 +292,6 @@ void sim_pause() {
|
||||||
sim_play = SIM_PAUSE;
|
sim_play = SIM_PAUSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_stop() {
|
|
||||||
/* Revert starting state of everything from sim_start */
|
|
||||||
sim_play = SIM_STOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
int phys_stepping() { return sim_play == SIM_STEP; }
|
int phys_stepping() { return sim_play == SIM_STEP; }
|
||||||
|
|
||||||
void sim_step() {
|
void sim_step() {
|
||||||
|
|
|
@ -477,8 +477,7 @@ Object.defineProperty(Array.prototype, 'lerp', {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.defineProperty(Object.prototype, 'lerp', {
|
Object.lerp = function(to, t) {
|
||||||
value: function(to, t) {
|
|
||||||
var self = this;
|
var self = this;
|
||||||
var obj = {};
|
var obj = {};
|
||||||
|
|
||||||
|
@ -487,8 +486,7 @@ Object.defineProperty(Object.prototype, 'lerp', {
|
||||||
});
|
});
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
};
|
||||||
});
|
|
||||||
|
|
||||||
/* MATH EXTENSIONS */
|
/* MATH EXTENSIONS */
|
||||||
Object.defineProperty(Number.prototype, 'lerp', {
|
Object.defineProperty(Number.prototype, 'lerp', {
|
||||||
|
@ -498,6 +496,12 @@ Object.defineProperty(Number.prototype, 'lerp', {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Math.lerp = function(from, to, t) {
|
||||||
|
var v = (to - from) * t + from;
|
||||||
|
v = Math.clamp(v, from, to);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
Math.clamp = function (x, l, h) { return x > h ? h : x < l ? l : x; }
|
Math.clamp = function (x, l, h) { return x > h ? h : x < l ? l : x; }
|
||||||
|
|
||||||
Math.random_range = function(min,max) { return Math.random() * (max-min) + min; };
|
Math.random_range = function(min,max) { return Math.random() * (max-min) + min; };
|
||||||
|
@ -521,6 +525,7 @@ Math.angledist = function (a1, a2) {
|
||||||
|
|
||||||
return wrap;
|
return wrap;
|
||||||
};
|
};
|
||||||
|
Math.angledist.doc = "Find the shortest angle between two angles.";
|
||||||
|
|
||||||
Math.deg2rad = function(deg) { return deg * 0.0174533; };
|
Math.deg2rad = function(deg) { return deg * 0.0174533; };
|
||||||
Math.rad2deg = function(rad) { return rad / 0.0174533; };
|
Math.rad2deg = function(rad) { return rad / 0.0174533; };
|
||||||
|
|
|
@ -255,6 +255,18 @@ var Time = {
|
||||||
set updateMS(x) { cmd(6, x); },
|
set updateMS(x) { cmd(6, x); },
|
||||||
set physMS(x) { cmd(7, x); },
|
set physMS(x) { cmd(7, x); },
|
||||||
set renderMS(x) { cmd(5, x); },
|
set renderMS(x) { cmd(5, x); },
|
||||||
|
|
||||||
|
pause() {
|
||||||
|
Time.timescale = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
play() {
|
||||||
|
if (!Time.stash) {
|
||||||
|
Log.warn("Tried to resume time without calling Time.pause first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Time.timescale = Time.stash;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Player.players[0].control(DebugControls);
|
Player.players[0].control(DebugControls);
|
||||||
|
|
|
@ -702,6 +702,10 @@ var animation = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var Audio = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
var Music = {
|
var Music = {
|
||||||
play(path) {
|
play(path) {
|
||||||
Log.info("Playing " + path);
|
Log.info("Playing " + path);
|
||||||
|
@ -721,12 +725,13 @@ var Music = {
|
||||||
};
|
};
|
||||||
|
|
||||||
var Sound = {
|
var Sound = {
|
||||||
|
sounds: [],
|
||||||
play(file) {
|
play(file) {
|
||||||
var s = Object.create(sound);
|
// var s = Object.create(Sound);
|
||||||
s.path = file;
|
// s.path = file;
|
||||||
s.play();
|
// s.play();
|
||||||
// this.id = cmd(14,file);
|
this.id = cmd(14,file);
|
||||||
return s;
|
//return s;
|
||||||
},
|
},
|
||||||
|
|
||||||
music(midi, sf) {
|
music(midi, sf) {
|
||||||
|
@ -1033,8 +1038,8 @@ var Register = {
|
||||||
entries = entries.filter(function(f) { return fn === f; });
|
entries = entries.filter(function(f) { return fn === f; });
|
||||||
}
|
}
|
||||||
|
|
||||||
n.broadcast = function() {
|
n.broadcast = function(...args) {
|
||||||
entries.forEach(x => x[0].call(x[1]));
|
entries.forEach(x => x[0].call(x[1], ...args));
|
||||||
}
|
}
|
||||||
|
|
||||||
n.clear = function() {
|
n.clear = function() {
|
||||||
|
@ -1271,7 +1276,9 @@ var Game = {
|
||||||
|
|
||||||
stop()
|
stop()
|
||||||
{
|
{
|
||||||
sys_cmd(2);
|
Game.pause();
|
||||||
|
/* And return to editor .. */
|
||||||
|
Log.warn("Stopping not implemented. Paused, and go to editor.");
|
||||||
},
|
},
|
||||||
|
|
||||||
step()
|
step()
|
||||||
|
@ -1320,19 +1327,18 @@ var Level = {
|
||||||
},
|
},
|
||||||
|
|
||||||
run() {
|
run() {
|
||||||
var objs = this.objects.slice();
|
|
||||||
var scene = {};
|
var scene = {};
|
||||||
var self = this;
|
|
||||||
|
|
||||||
// TODO: If an object does not have a varname, give it one based on its parent
|
// TODO: If an object does not have a varname, give it one based on its parent
|
||||||
objs.forEach(function(x) {
|
this.objects.forEach(function(x) {
|
||||||
if (x.hasOwn('varname')) {
|
if (x.hasOwn('varname')) {
|
||||||
scene[x.varname] = x;
|
scene[x.varname] = x;
|
||||||
this[x.varname] = x;
|
this[x.varname] = x;
|
||||||
}
|
}
|
||||||
},this);
|
},this);
|
||||||
|
|
||||||
cmd(123, this.scriptfile, self);
|
var fn = compile(this.scriptfile);
|
||||||
|
fn.call(this);
|
||||||
|
|
||||||
if (typeof this.update === 'function')
|
if (typeof this.update === 'function')
|
||||||
Register.update.register(this.update, this);
|
Register.update.register(this.update, this);
|
||||||
|
@ -1801,6 +1807,7 @@ World.load = function(lvl) {
|
||||||
World.loaded.kill();
|
World.loaded.kill();
|
||||||
|
|
||||||
World.loaded = World.spawn(lvl);
|
World.loaded = World.spawn(lvl);
|
||||||
|
return World.loaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
var gameobjects = {};
|
var gameobjects = {};
|
||||||
|
|
Loading…
Reference in a new issue