aboutsummaryrefslogtreecommitdiff
path: root/sdl/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdl/main.c')
-rw-r--r--sdl/main.c245
1 files changed, 158 insertions, 87 deletions
diff --git a/sdl/main.c b/sdl/main.c
index 004c8fb..e5bfb3e 100644
--- a/sdl/main.c
+++ b/sdl/main.c
@@ -26,7 +26,7 @@ static struct {
struct fmplayer_file *fmfile;
struct fmplayer_fft_data fftdata;
struct fmplayer_fft_input_data fftin;
- const char *currpath;
+ const char *lastopenpath;
SDL_Window *win;
SDL_AudioDeviceID adev;
struct ppz8 ppz8;
@@ -35,6 +35,7 @@ static struct {
atomic_flag fftdata_flag;
int scale;
struct fmdsp_font font16;
+ bool paused;
} g = {
.fftdata_flag = ATOMIC_FLAG_INIT,
.scale = 1,
@@ -62,16 +63,168 @@ static void openfile(const char *path) {
"cannot open file",
fmplayer_file_strerror(error),
g.win);
- return;
+ goto err;
}
- SDL_LockAudioDevice(g.adev);
+ if (g.adev) SDL_LockAudioDevice(g.adev);
fmplayer_file_free(g.fmfile);
g.fmfile = file;
fmplayer_init_work_opna(&g.work, &g.ppz8, &g.opna, &g.timer, &g.adpcmram);
fmplayer_file_load(&g.work, g.fmfile, 1);
+ if (g.fmfile->filename_sjis) {
+ fmdsp_pacc_set_filename_sjis(g.fp, g.fmfile->filename_sjis);
+ }
+ fmdsp_pacc_update_file(g.fp);
fmdsp_pacc_comment_reset(g.fp);
- SDL_UnlockAudioDevice(g.adev);
+ if (!g.adev) {
+ SDL_AudioSpec aspec = {
+ .freq = SRATE,
+ .format = AUDIO_S16SYS,
+ .channels = 2,
+ .samples = BUFLEN,
+ .callback = audiocb,
+ };
+ g.adev = SDL_OpenAudioDevice(0, 0, &aspec, 0, 0);
+ if (!g.adev) {
+ SDL_ShowSimpleMessageBox(
+ SDL_MESSAGEBOX_ERROR,
+ "cannot open audio device",
+ fmplayer_file_strerror(error),
+ g.win);
+ goto err;
+ }
+ } else {
+ SDL_UnlockAudioDevice(g.adev);
+ }
SDL_PauseAudioDevice(g.adev, 0);
+ g.paused = false;
+ // path might be the same as g.lastopenpath
+ const char *tmp = g.lastopenpath;
+ g.lastopenpath = SDL_strdup(path);
+ SDL_free((void *)tmp);
+ return;
+err:
+ fmplayer_file_free(file);
+}
+
+static void mask_set(int p, bool shift, bool control) {
+ if (!control) {
+ if (p >= 11) return;
+ static const unsigned masktbl[11] = {
+ LIBOPNA_CHAN_FM_1,
+ LIBOPNA_CHAN_FM_2,
+ LIBOPNA_CHAN_FM_3,
+ LIBOPNA_CHAN_FM_4,
+ LIBOPNA_CHAN_FM_5,
+ LIBOPNA_CHAN_FM_6,
+ LIBOPNA_CHAN_SSG_1,
+ LIBOPNA_CHAN_SSG_2,
+ LIBOPNA_CHAN_SSG_3,
+ LIBOPNA_CHAN_DRUM_ALL,
+ LIBOPNA_CHAN_ADPCM,
+ };
+ unsigned mask = masktbl[p];
+ if (shift) {
+ opna_set_mask(&g.opna, ~mask);
+ ppz8_set_mask(&g.ppz8, -1);
+ } else {
+ opna_set_mask(&g.opna, opna_get_mask(&g.opna) ^ mask);
+ }
+ } else {
+ if (p >= 8) return;
+ unsigned mask = 1u<<p;
+ if (shift) {
+ ppz8_set_mask(&g.ppz8, ~mask);
+ opna_set_mask(&g.opna, -1);
+ } else {
+ ppz8_set_mask(&g.ppz8, ppz8_get_mask(&g.ppz8) ^ mask);
+ }
+ }
+}
+
+static void handle_keydown(
+ const SDL_KeyboardEvent *key,
+ const struct pacc_vtable *pacc,
+ struct pacc_ctx *pc) {
+ // F1 to F12 scancodes are continuous
+ if (SDL_SCANCODE_F1 <= key->keysym.scancode
+ && key->keysym.scancode <= SDL_SCANCODE_F12) {
+ if (key->keysym.mod & KMOD_CTRL) {
+ fmdsp_pacc_palette(g.fp, key->keysym.scancode - SDL_SCANCODE_F1);
+ } else {
+ switch (key->keysym.scancode) {
+ case SDL_SCANCODE_F6:
+ if (g.lastopenpath) {
+ openfile(g.lastopenpath);
+ }
+ break;
+ case SDL_SCANCODE_F7:
+ if (g.adev) {
+ g.paused ^= 1;
+ g.work.paused = g.paused;
+ SDL_PauseAudioDevice(g.adev, g.paused);
+ }
+ break;
+ case SDL_SCANCODE_F11:
+ if (key->keysym.mod & KMOD_SHIFT) {
+ fmdsp_pacc_set_right_mode(
+ g.fp,
+ (fmdsp_pacc_right_mode(g.fp) + 1) % FMDSP_RIGHT_MODE_CNT);
+ } else {
+ fmdsp_pacc_set_left_mode(
+ g.fp,
+ (fmdsp_pacc_left_mode(g.fp) + 1) % FMDSP_LEFT_MODE_CNT);
+ }
+ break;
+ case SDL_SCANCODE_F12:
+ g.scale++;
+ if (g.scale > 3) g.scale = 1;
+ SDL_SetWindowSize(g.win, PC98_W*g.scale, PC98_H*g.scale);
+ pacc->viewport_scale(pc, g.scale);
+ break;
+ default:
+ break;
+ }
+ }
+ } else {
+ const bool shift = key->keysym.mod & KMOD_SHIFT;
+ const bool ctrl = key->keysym.mod & KMOD_CTRL;
+ if (SDL_SCANCODE_1 <= key->keysym.scancode
+ && key->keysym.scancode <= SDL_SCANCODE_0) {
+ mask_set(key->keysym.scancode - SDL_SCANCODE_1, shift, ctrl);
+ } else {
+ switch (key->keysym.scancode) {
+ case SDL_SCANCODE_MINUS:
+ mask_set(10, shift, ctrl);
+ break;
+ case SDL_SCANCODE_EQUALS:
+ opna_set_mask(&g.opna, ~opna_get_mask(&g.opna));
+ ppz8_set_mask(&g.ppz8, ~ppz8_get_mask(&g.ppz8));
+ break;
+ case SDL_SCANCODE_BACKSLASH:
+ opna_set_mask(&g.opna, 0);
+ ppz8_set_mask(&g.ppz8, 0);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ switch (key->keysym.scancode) {
+ default:
+ break;
+ }
+ if (key->keysym.mod & KMOD_SHIFT) {
+ switch (key->keysym.scancode) {
+ case SDL_SCANCODE_UP:
+ fmdsp_pacc_comment_scroll(g.fp, false);
+ break;
+ case SDL_SCANCODE_DOWN:
+ fmdsp_pacc_comment_scroll(g.fp, true);
+ break;
+ default:
+ break;
+ }
+ }
}
int main(int argc, char **argv) {
@@ -84,20 +237,6 @@ int main(int argc, char **argv) {
return 1;
}
- SDL_AudioSpec aspec = {
- .freq = SRATE,
- .format = AUDIO_S16SYS,
- .channels = 2,
- .samples = BUFLEN,
- .callback = audiocb,
- };
- g.adev = SDL_OpenAudioDevice(0, 0, &aspec, 0, 0);
- if (!g.adev) {
- SDL_Log("Cannot open audio device\n");
- SDL_Quit();
- return 0;
- }
-
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
@@ -191,75 +330,7 @@ int main(int argc, char **argv) {
SDL_free(e.drop.file);
break;
case SDL_KEYDOWN:
- switch (e.key.keysym.scancode) {
- case SDL_SCANCODE_F11:
- if (e.key.keysym.mod & KMOD_SHIFT) {
- fmdsp_pacc_set_right_mode(
- g.fp,
- (fmdsp_pacc_right_mode(g.fp) + 1) % FMDSP_RIGHT_MODE_CNT);
- } else {
- fmdsp_pacc_set_left_mode(
- g.fp,
- (fmdsp_pacc_left_mode(g.fp) + 1) % FMDSP_LEFT_MODE_CNT);
- }
- break;
- case SDL_SCANCODE_F12:
- g.scale++;
- if (g.scale > 3) g.scale = 1;
- SDL_SetWindowSize(g.win, PC98_W*g.scale, PC98_H*g.scale);
- pacc.viewport_scale(pc, g.scale);
- break;
- default:
- break;
- }
- if (e.key.keysym.mod & KMOD_SHIFT) {
- switch (e.key.keysym.scancode) {
- case SDL_SCANCODE_UP:
- fmdsp_pacc_comment_scroll(g.fp, false);
- break;
- case SDL_SCANCODE_DOWN:
- fmdsp_pacc_comment_scroll(g.fp, true);
- break;
- default:
- break;
- }
- }
- if (e.key.keysym.mod & KMOD_CTRL) {
- switch (e.key.keysym.scancode) {
- case SDL_SCANCODE_F1:
- fmdsp_pacc_palette(g.fp, 0);
- break;
- case SDL_SCANCODE_F2:
- fmdsp_pacc_palette(g.fp, 1);
- break;
- case SDL_SCANCODE_F3:
- fmdsp_pacc_palette(g.fp, 2);
- break;
- case SDL_SCANCODE_F4:
- fmdsp_pacc_palette(g.fp, 3);
- break;
- case SDL_SCANCODE_F5:
- fmdsp_pacc_palette(g.fp, 4);
- break;
- case SDL_SCANCODE_F6:
- fmdsp_pacc_palette(g.fp, 5);
- break;
- case SDL_SCANCODE_F7:
- fmdsp_pacc_palette(g.fp, 6);
- break;
- case SDL_SCANCODE_F8:
- fmdsp_pacc_palette(g.fp, 7);
- break;
- case SDL_SCANCODE_F9:
- fmdsp_pacc_palette(g.fp, 8);
- break;
- case SDL_SCANCODE_F10:
- fmdsp_pacc_palette(g.fp, 9);
- break;
- default:
- break;
- }
- }
+ handle_keydown(&e.key, &pacc, pc);
}
}
if (!atomic_flag_test_and_set_explicit(