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
|
||||
else
|
||||
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 =
|
||||
endif
|
||||
|
||||
|
|
|
@ -31,8 +31,6 @@
|
|||
|
||||
#include "HandmadeMath.h"
|
||||
|
||||
#include "miniaudio.h"
|
||||
|
||||
static JSValue globalThis;
|
||||
|
||||
#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;
|
||||
|
||||
case 2:
|
||||
sim_stop();
|
||||
sim_pause();
|
||||
break;
|
||||
|
||||
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);
|
||||
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);
|
||||
return fn;
|
||||
|
|
|
@ -16,7 +16,8 @@
|
|||
#include "dsp.h"
|
||||
#include "mix.h"
|
||||
|
||||
#include "miniaudio.h"
|
||||
#define SOKOL_AUDIO_IMPL
|
||||
#include "sokol/sokol_audio.h"
|
||||
|
||||
#define TSF_IMPLEMENTATION
|
||||
#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() {
|
||||
ma_result result;
|
||||
engine = malloc(sizeof(*engine));
|
||||
result = ma_engine_init(NULL, engine);
|
||||
if (result != MA_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.stream_cb = push_sound,
|
||||
.sample_rate = SAMPLERATE,
|
||||
.num_channels = CHANNELS,
|
||||
.buffer_frames = BUF_FRAMES,
|
||||
});
|
||||
mixer_init();
|
||||
}
|
||||
|
||||
|
@ -156,32 +158,31 @@ struct soundstream *soundstream_make() {
|
|||
}
|
||||
|
||||
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) {
|
||||
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) {
|
||||
YughInfo("Could not load music at path: %s", path);
|
||||
}
|
||||
|
||||
YughInfo("Loading %s...", path);
|
||||
ma_sound_start(&music_sound);
|
||||
*/
|
||||
}
|
||||
|
||||
void mini_music_pause() {
|
||||
ma_sound_stop(&music_sound);
|
||||
// ma_sound_stop(&music_sound);
|
||||
}
|
||||
|
||||
void mini_music_stop() {
|
||||
ma_sound_stop(&music_sound);
|
||||
// ma_sound_stop(&music_sound);
|
||||
}
|
||||
|
||||
void mini_master(float v) {
|
||||
ma_engine_set_volume(engine, v);
|
||||
// ma_engine_set_volume(engine, v);
|
||||
}
|
||||
|
||||
void kill_oneshot(struct sound *s) {
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
struct circbuf;
|
||||
|
||||
typedef float soundbyte;
|
||||
|
||||
struct Mix_Chunk {
|
||||
int i;
|
||||
};
|
||||
|
|
|
@ -12,9 +12,7 @@ static struct bus bus[256];
|
|||
static int first = 0; /* First bus available */
|
||||
|
||||
static int first_on = -1; /* First bus to fill buffer with */
|
||||
short mastermix[BUF_FRAMES*CHANNELS];
|
||||
|
||||
static int initted = 0;
|
||||
soundbyte mastermix[BUF_FRAMES*CHANNELS];
|
||||
|
||||
static float master_volume = 1.f;
|
||||
|
||||
|
@ -32,13 +30,9 @@ void mixer_init() {
|
|||
}
|
||||
|
||||
bus[255].next = -1;
|
||||
|
||||
initted = 1;
|
||||
}
|
||||
|
||||
struct bus *first_free_bus(struct dsp_filter in) {
|
||||
// assert(initted);
|
||||
|
||||
for (int i = 0; i < 255; i++)
|
||||
if (!bus[i].on) {
|
||||
bus[i].on = 1;
|
||||
|
@ -79,10 +73,10 @@ void bus_free(struct bus *b)
|
|||
b->on = 0;
|
||||
}
|
||||
|
||||
void bus_fill_buffers(short *master, int n) {
|
||||
void bus_fill_buffers(soundbyte *master, int n) {
|
||||
int curbus = first_on;
|
||||
// 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++) {
|
||||
if (!bus[i].on) continue;
|
||||
|
|
|
@ -2,13 +2,11 @@
|
|||
#define MIX_H
|
||||
|
||||
#include "dsp.h"
|
||||
|
||||
struct sound;
|
||||
|
||||
#include "sound.h"
|
||||
|
||||
struct bus {
|
||||
struct dsp_filter in;
|
||||
short buf[BUF_FRAMES*CHANNELS];
|
||||
soundbyte buf[BUF_FRAMES*CHANNELS];
|
||||
float gain;
|
||||
int on;
|
||||
int next; /* Next available bus */
|
||||
|
@ -16,12 +14,12 @@ struct bus {
|
|||
int id;
|
||||
};
|
||||
|
||||
extern short mastermix[BUF_FRAMES*CHANNELS];
|
||||
extern soundbyte mastermix[BUF_FRAMES*CHANNELS];
|
||||
|
||||
void mixer_init();
|
||||
|
||||
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% */
|
||||
void mix_master_vol(float v);
|
||||
|
|
|
@ -16,49 +16,43 @@ float music_pan = 0.f;
|
|||
|
||||
void dsp_midi_fillbuf(struct dsp_midi_song *song, void *out, int n)
|
||||
{
|
||||
short *o = (short*)out;
|
||||
tml_message *midi = song->midi;
|
||||
soundbyte *o = (soundbyte*)out;
|
||||
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) {
|
||||
switch (midi->type) {
|
||||
case TML_PROGRAM_CHANGE:
|
||||
tsf_channel_set_presetnumber(song->sf, midi->channel, midi->program, (midi->channel == 9));
|
||||
break;
|
||||
|
||||
while (midi && song->time >= midi->time) {
|
||||
case TML_NOTE_ON:
|
||||
tsf_channel_note_on(song->sf, midi->channel, midi->key, midi->velocity / 127.f);
|
||||
break;
|
||||
|
||||
switch (midi->type)
|
||||
{
|
||||
case TML_PROGRAM_CHANGE:
|
||||
tsf_channel_set_presetnumber(song->sf, midi->channel, midi->program, (midi->channel == 9));
|
||||
break;
|
||||
case TML_NOTE_OFF:
|
||||
tsf_channel_note_off(song->sf, midi->channel, midi->key);
|
||||
break;
|
||||
|
||||
case TML_NOTE_ON:
|
||||
tsf_channel_note_on(song->sf, midi->channel, midi->key, midi->velocity / 127.f);
|
||||
break;
|
||||
case TML_PITCH_BEND:
|
||||
tsf_channel_set_pitchwheel(song->sf, midi->channel, midi->pitch_bend);
|
||||
break;
|
||||
|
||||
case TML_NOTE_OFF:
|
||||
tsf_channel_note_off(song->sf, midi->channel, midi->key);
|
||||
break;
|
||||
case TML_CONTROL_CHANGE:
|
||||
tsf_channel_midi_control(song->sf, midi->channel, midi->control, midi->control_value);
|
||||
break;
|
||||
}
|
||||
|
||||
case TML_PITCH_BEND:
|
||||
tsf_channel_set_pitchwheel(song->sf, midi->channel, midi->pitch_bend);
|
||||
break;
|
||||
|
||||
case TML_CONTROL_CHANGE:
|
||||
tsf_channel_midi_control(song->sf, midi->channel, midi->control, midi->control_value);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
midi = midi->next;
|
||||
}
|
||||
|
||||
|
||||
tsf_render_short(song->sf, o, TSF_BLOCK, 0);
|
||||
o += TSF_BLOCK*CHANNELS;
|
||||
song->time += TSF_BLOCK * (1000.f/SAMPLERATE);
|
||||
midi = midi->next;
|
||||
}
|
||||
tsf_render_float(song->sf, o, TSF_BLOCK, 0);
|
||||
o += TSF_BLOCK*CHANNELS;
|
||||
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;
|
||||
|
@ -88,9 +82,9 @@ void play_song(const char *midi, const char *sf)
|
|||
cursong.data = &gsong;
|
||||
cursong.filter = dsp_midi_fillbuf;
|
||||
musicbus = first_free_bus(cursong);
|
||||
YughWarn("DID IT");
|
||||
}
|
||||
|
||||
|
||||
void music_play()
|
||||
{
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ double renderMS = 1 / 165.f;
|
|||
double physMS = 1 / 165.f;
|
||||
double updateMS = 1 / 165.f;
|
||||
|
||||
static int sim_play = 0;
|
||||
|
||||
double lastTick = 0.0;
|
||||
static int phys_step = 0;
|
||||
|
||||
|
@ -59,10 +59,11 @@ static double framems[FPSBUF];
|
|||
int framei = 0;
|
||||
int fps;
|
||||
|
||||
#define SIM_STOP 0
|
||||
#define SIM_PLAY 1
|
||||
#define SIM_PAUSE 2
|
||||
#define SIM_STEP 3
|
||||
#define SIM_PLAY 0
|
||||
#define SIM_PAUSE 1
|
||||
#define SIM_STEP 2
|
||||
|
||||
static int sim_play = SIM_PLAY;
|
||||
|
||||
#ifdef __TINYC__
|
||||
int backtrace(void **buffer, int size) {
|
||||
|
@ -282,7 +283,6 @@ int frame_fps() {
|
|||
|
||||
int sim_playing() { return sim_play == SIM_PLAY; }
|
||||
int sim_paused() { return sim_play == SIM_PAUSE; }
|
||||
int sim_stopped() { return sim_play == SIM_STOP; }
|
||||
|
||||
void sim_start() {
|
||||
sim_play = SIM_PLAY;
|
||||
|
@ -292,11 +292,6 @@ void 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; }
|
||||
|
||||
void sim_step() {
|
||||
|
|
|
@ -477,8 +477,7 @@ Object.defineProperty(Array.prototype, 'lerp', {
|
|||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(Object.prototype, 'lerp', {
|
||||
value: function(to, t) {
|
||||
Object.lerp = function(to, t) {
|
||||
var self = this;
|
||||
var obj = {};
|
||||
|
||||
|
@ -487,8 +486,7 @@ Object.defineProperty(Object.prototype, 'lerp', {
|
|||
});
|
||||
|
||||
return obj;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/* MATH EXTENSIONS */
|
||||
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.random_range = function(min,max) { return Math.random() * (max-min) + min; };
|
||||
|
@ -521,6 +525,7 @@ Math.angledist = function (a1, a2) {
|
|||
|
||||
return wrap;
|
||||
};
|
||||
Math.angledist.doc = "Find the shortest angle between two angles.";
|
||||
|
||||
Math.deg2rad = function(deg) { return deg * 0.0174533; };
|
||||
Math.rad2deg = function(rad) { return rad / 0.0174533; };
|
||||
|
|
|
@ -255,6 +255,18 @@ var Time = {
|
|||
set updateMS(x) { cmd(6, x); },
|
||||
set physMS(x) { cmd(7, 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);
|
||||
|
|
|
@ -702,6 +702,10 @@ var animation = {
|
|||
},
|
||||
};
|
||||
|
||||
var Audio = {
|
||||
|
||||
};
|
||||
|
||||
var Music = {
|
||||
play(path) {
|
||||
Log.info("Playing " + path);
|
||||
|
@ -721,12 +725,13 @@ var Music = {
|
|||
};
|
||||
|
||||
var Sound = {
|
||||
sounds: [],
|
||||
play(file) {
|
||||
var s = Object.create(sound);
|
||||
s.path = file;
|
||||
s.play();
|
||||
// this.id = cmd(14,file);
|
||||
return s;
|
||||
// var s = Object.create(Sound);
|
||||
// s.path = file;
|
||||
// s.play();
|
||||
this.id = cmd(14,file);
|
||||
//return s;
|
||||
},
|
||||
|
||||
music(midi, sf) {
|
||||
|
@ -1033,8 +1038,8 @@ var Register = {
|
|||
entries = entries.filter(function(f) { return fn === f; });
|
||||
}
|
||||
|
||||
n.broadcast = function() {
|
||||
entries.forEach(x => x[0].call(x[1]));
|
||||
n.broadcast = function(...args) {
|
||||
entries.forEach(x => x[0].call(x[1], ...args));
|
||||
}
|
||||
|
||||
n.clear = function() {
|
||||
|
@ -1271,7 +1276,9 @@ var Game = {
|
|||
|
||||
stop()
|
||||
{
|
||||
sys_cmd(2);
|
||||
Game.pause();
|
||||
/* And return to editor .. */
|
||||
Log.warn("Stopping not implemented. Paused, and go to editor.");
|
||||
},
|
||||
|
||||
step()
|
||||
|
@ -1320,20 +1327,19 @@ var Level = {
|
|||
},
|
||||
|
||||
run() {
|
||||
var objs = this.objects.slice();
|
||||
var scene = {};
|
||||
var self = this;
|
||||
|
||||
// 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')) {
|
||||
scene[x.varname] = x;
|
||||
this[x.varname] = x;
|
||||
}
|
||||
},this);
|
||||
|
||||
cmd(123, this.scriptfile, self);
|
||||
|
||||
var fn = compile(this.scriptfile);
|
||||
fn.call(this);
|
||||
|
||||
if (typeof this.update === 'function')
|
||||
Register.update.register(this.update, this);
|
||||
|
||||
|
@ -1801,6 +1807,7 @@ World.load = function(lvl) {
|
|||
World.loaded.kill();
|
||||
|
||||
World.loaded = World.spawn(lvl);
|
||||
return World.loaded;
|
||||
};
|
||||
|
||||
var gameobjects = {};
|
||||
|
|
Loading…
Reference in a new issue