diff options
Diffstat (limited to 'sdl/main.c')
-rw-r--r-- | sdl/main.c | 245 |
1 files changed, 158 insertions, 87 deletions
@@ -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( |