diff --git a/src/midi.emscripten.c b/src/midi.emscripten.c index 6f4a312..c498dbd 100644 --- a/src/midi.emscripten.c +++ b/src/midi.emscripten.c @@ -35,6 +35,8 @@ static int midi_getflag(int mode, int index); static int midi_setflag(int mode, int index, int val); static int midi_setvol(int vol); static int midi_getvol(); +static int midi_fadestart(int time, int volume, int stop); +static boolean midi_fading(); #define midi midi_emscripten mididevice_t midi = { @@ -48,7 +50,9 @@ mididevice_t midi = { midi_getflag, midi_setflag, midi_setvol, - midi_getvol + midi_getvol, + midi_fadestart, + midi_fading }; static int midino; @@ -118,3 +122,12 @@ static int midi_setvol(int vol) { static int midi_getvol() { return EM_ASM_INT_V( return xsystem35.midiPlayer.getVolume(); ); } + +static int midi_fadestart(int time, int volume, int stop) { + return EM_ASM_ARGS({ xsystem35.midiPlayer.fadeStart($0, $1, $2); }, + time, volume, stop); +} + +static boolean midi_fading() { + return EM_ASM_INT_V( return xsystem35.midiPlayer.isFading(); ); +} diff --git a/src/midi.h b/src/midi.h index 43bc470..809c351 100644 --- a/src/midi.h +++ b/src/midi.h @@ -45,6 +45,8 @@ struct mididevice { int (* setflag)(int mode, int index, int val); int (* setvol)(int); int (* getvol)(int); + int (* fadestart)(int time, int volume, int stop); + boolean (* fading)(); }; extern int midi_init(mididevice_t *); diff --git a/src/midi.rawmidi.c b/src/midi.rawmidi.c index afa2068..7607434 100644 --- a/src/midi.rawmidi.c +++ b/src/midi.rawmidi.c @@ -102,6 +102,8 @@ mididevice_t midi_rawmidi = { midi_getflag, midi_setflag, NULL, + NULL, + NULL, NULL }; diff --git a/src/midi.sdlmixer.c b/src/midi.sdlmixer.c index 931e92a..97558ee 100644 --- a/src/midi.sdlmixer.c +++ b/src/midi.sdlmixer.c @@ -19,6 +19,7 @@ * */ +#include #include #include "portab.h" @@ -36,6 +37,8 @@ static int midi_getflag(int mode, int index); static int midi_setflag(int mode, int index, int val); static int midi_setvol(int vol); static int midi_getvol(); +static int midi_fadestart(int time, int volume, int stop); +static boolean midi_fading(); #define midi midi_sdlmixer mididevice_t midi = { @@ -49,12 +52,15 @@ mididevice_t midi = { midi_getflag, midi_setflag, midi_setvol, - midi_getvol + midi_getvol, + midi_fadestart, + midi_fading }; static Mix_Music *mix_music; static int midino; static int counter; +static uint32_t fade_tick; static int midi_initilize(char *pname, int subdev) { if (Mix_Init(MIX_INIT_MID) != MIX_INIT_MID) @@ -140,3 +146,24 @@ static int midi_setvol(int vol) { static int midi_getvol() { return Mix_VolumeMusic(-1) * 100 / MIX_MAX_VOLUME; } + +static int midi_fadestart(int time, int volume, int stop) { + if (time == 0) { + midi_setvol(volume); + if (stop) + midi_stop(); + return OK; + } + + if (volume == 0) { + Mix_FadeOutMusic(time); // FIXME: this always stops the music + fade_tick = SDL_GetTicks() + time; + return OK; + } + printf("midi_fadestart(%d, %d, %d) unsupported\n", time, volume, stop); + return NG; +} + +static boolean midi_fading() { + return SDL_GetTicks() < fade_tick; +} diff --git a/src/music.c b/src/music.c index 9d0eb2a..23dad8c 100644 --- a/src/music.c +++ b/src/music.c @@ -26,6 +26,13 @@ #include "music.h" #include "music_private.h" +enum MixDevice { + MIX_MASTER, + MIX_CD, + MIX_MIDI, + MIX_PCM +}; + struct _musprvdat musprv; int mus_init() { @@ -261,6 +268,8 @@ boolean mus_pcm_get_state() { * 1: する */ int mus_mixer_fadeout_start(int device, int time, int volume, int stop) { + if (device == MIX_MIDI) + return musmidi_fadestart(time, volume, stop); printf("%s(%d, %d, %d, %d) not implemented\n", __func__, device, time, volume, stop); return NG; } @@ -273,6 +282,8 @@ int mus_mixer_fadeout_start(int device, int time, int volume, int stop) { * FALSE -> フェード中でない */ boolean mus_mixer_fadeout_get_state(int device) { + if (device == MIX_MIDI) + return musmidi_fading(); printf("%s(%d) not implemented\n", __func__, device); return FALSE; } diff --git a/src/music_midi.c b/src/music_midi.c index e372a0d..0b0aaed 100644 --- a/src/music_midi.c +++ b/src/music_midi.c @@ -98,3 +98,15 @@ int musmidi_setflag(int mode, int index, int val) { int musmidi_getflag(int mode, int index) { return prv.midi.dev->getflag(mode, index); } + +int musmidi_fadestart(int time, int volume, int stop) { + if (!prv.midi.dev->fadestart) + return NG; + return prv.midi.dev->fadestart(time, volume, stop); +} + +boolean musmidi_fading() { + if (!prv.midi.dev->fading) + return FALSE; + return prv.midi.dev->fading(); +} diff --git a/src/music_midi.h b/src/music_midi.h index aeeb409..3426e19 100644 --- a/src/music_midi.h +++ b/src/music_midi.h @@ -20,6 +20,7 @@ extern int musmidi_unpause(); extern midiplaystate musmidi_getpos(); extern int musmidi_setflag(int mode, int index, int val); extern int musmidi_getflag(int mode, int index); -extern int musmidi_cb(); +extern int musmidi_fadestart(int time, int volume, int stop); +extern boolean musmidi_fading(); #endif /* __MUSIC_MIDI_H__ */