Partial support for MIDI fade

This commit is contained in:
kichikuou
2019-03-04 13:16:25 +09:00
parent 5d99f00b7b
commit e703676c84
7 changed files with 71 additions and 3 deletions
+14 -1
View File
@@ -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(); );
}
+2
View File
@@ -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 *);
+2
View File
@@ -102,6 +102,8 @@ mididevice_t midi_rawmidi = {
midi_getflag,
midi_setflag,
NULL,
NULL,
NULL,
NULL
};
+28 -1
View File
@@ -19,6 +19,7 @@
*
*/
#include <SDL.h>
#include <SDL_mixer.h>
#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;
}
+11
View File
@@ -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;
}
+12
View File
@@ -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();
}
+2 -1
View File
@@ -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__ */