From 386c3c0fcd11d4237755fb8dfd61b9a92d36bb43 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 2 Feb 2025 12:30:55 +0900 Subject: [PATCH] Refactor cdromdevice_t interface --- src/cdrom.bgm.c | 42 ++++++++++++------------ src/cdrom.emscripten.c | 43 ++++++++++++------------- src/cdrom.h | 36 ++++++--------------- src/cdrom.mp3.c | 72 +++++++++++++++++------------------------- src/music_cdrom.c | 8 ++--- 5 files changed, 82 insertions(+), 119 deletions(-) diff --git a/src/cdrom.bgm.c b/src/cdrom.bgm.c index 5afc324..feeca4a 100644 --- a/src/cdrom.bgm.c +++ b/src/cdrom.bgm.c @@ -28,48 +28,46 @@ static int current_track; -static int cdrom_bgm_init(char *playlist) { +static bool cdrom_bgm_init(char *playlist) { prv.cd_maxtrk = ald_get_maxno(DRIFILE_BGM) + 1; - return OK; + return true; } -static int cdrom_bgm_exit(void) { - return OK; +static void cdrom_bgm_exit(void) { + // Do nothing } -static int cdrom_bgm_reset(void) { - return OK; +static void cdrom_bgm_reset(void) { + // Do nothing } -static int cdrom_bgm_start(int trk, int loop) { +static bool cdrom_bgm_start(int trk, int loop) { if (musbgm_play(trk, 0, 100, loop) != OK) - return NG; + return false; current_track = trk; - return OK; + return true; } -static int cdrom_bgm_stop(void) { - return musbgm_stop(current_track, 0); +static void cdrom_bgm_stop(void) { + musbgm_stop(current_track, 0); } -static int cdrom_bgm_getPlayingInfo(cd_time *info) { +static bool cdrom_bgm_getPlayingInfo(cd_time *info) { int t = musbgm_getpos(current_track); // in 10ms if (!t) - return NG; + return false; info->t = current_track; info->m = t / (60*100); t %= (60*100); info->s = t / 100; t %= 100; info->f = t * CD_FPS / 100; - return OK; + return true; } cdromdevice_t cdrom_bgm = { - cdrom_bgm_init, - cdrom_bgm_exit, - cdrom_bgm_reset, - cdrom_bgm_start, - cdrom_bgm_stop, - cdrom_bgm_getPlayingInfo, - NULL, - NULL + .init = cdrom_bgm_init, + .exit = cdrom_bgm_exit, + .reset = cdrom_bgm_reset, + .start = cdrom_bgm_start, + .stop = cdrom_bgm_stop, + .getpos = cdrom_bgm_getPlayingInfo, }; diff --git a/src/cdrom.emscripten.c b/src/cdrom.emscripten.c index 0eed423..435e7fb 100644 --- a/src/cdrom.emscripten.c +++ b/src/cdrom.emscripten.c @@ -25,48 +25,47 @@ #include "cdrom.h" #include "scheduler.h" -int cdrom_init(char *playlist) { - return OK; +static bool cdrom_init(char *playlist) { + return true; } -EM_JS(int, cdrom_start, (int trk, int loop), { +EM_JS(bool, cdrom_start, (int trk, int loop), { xsystem35.cdPlayer.play(trk, loop == 0 ? 1 : 0); - return xsystem35.Status.OK; + return 1; }); -EM_JS(int, cdrom_stop, (), { +EM_JS(void, cdrom_stop, (void), { xsystem35.cdPlayer.stop(); - return xsystem35.Status.OK; }); -int cdrom_exit(void) { +static void cdrom_exit(void) { cdrom_stop(); - return OK; } -int cdrom_reset(void) { +static void cdrom_reset(void) { cdrom_stop(); - return OK; } -int cdrom_getPlayingInfo(cd_time *info) { +static bool cdrom_getPlayingInfo(cd_time *info) { scheduler_on_event(SCHEDULER_EVENT_AUDIO_CHECK); int t = EM_ASM_INT_V( return xsystem35.cdPlayer.getPosition(); ); if (!t) - return NG; + return false; info->t = t & 0xff; - FRAMES_TO_MSF(t >> 8, &info->m, &info->s, &info->f); - return OK; + t >>= 8; + info->f = t % CD_FPS; + t /= CD_FPS; + info->s = t % 60; + info->m = t / 60; + return true; } cdromdevice_t cdrom_emscripten = { - cdrom_init, - cdrom_exit, - cdrom_reset, - cdrom_start, - cdrom_stop, - cdrom_getPlayingInfo, - NULL, - NULL + .init = cdrom_init, + .exit = cdrom_exit, + .reset = cdrom_reset, + .start = cdrom_start, + .stop = cdrom_stop, + .getpos = cdrom_getPlayingInfo, }; diff --git a/src/cdrom.h b/src/cdrom.h index ce53d1b..07e401d 100644 --- a/src/cdrom.h +++ b/src/cdrom.h @@ -24,42 +24,24 @@ #ifndef __CDROM_H__ #define __CDROM_H__ -/* - * CD-ROM へのアクセスが不安定な場合は次の定数を増やしてみて下さい - */ -/* ioctrole retry times */ -#define CDROM_IOCTL_RETRY_TIME 3 -/* ioctrole retry interval (100ms unit) */ -#define CDROM_IOCTL_RETRY_INTERVAL 1 +#include typedef struct { int t,m,s,f; } cd_time; -struct _cdromdevice { - int (* init)(char *); - int (* exit)(void); - int (* reset)(void); +typedef struct { + bool (*init)(char *playlist); + void (*exit)(void); + void (*reset)(void); // Play through the track loop times. If loop == 0, loops forever. - int (* start)(int trk, int loop); - int (* stop)(void); - int (* getpos)(cd_time *); - int (* setvol)(int); - int (* getvol)(void); -}; -typedef struct _cdromdevice cdromdevice_t; + bool (*start)(int trk, int loop); + void (*stop)(void); + bool (*getpos)(cd_time *); +} cdromdevice_t; extern cdromdevice_t cdrom_bgm; #define CD_FPS 75 -#define FRAMES_TO_MSF(f, M,S,F) { \ - int value = f; \ - *(F) = value%CD_FPS; \ - value /= CD_FPS; \ - *(S) = value%60; \ - value /= 60; \ - *(M) = value; \ -} -#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) #endif /* __CDROM_H__ */ diff --git a/src/cdrom.mp3.c b/src/cdrom.mp3.c index 75dca29..61e517f 100644 --- a/src/cdrom.mp3.c +++ b/src/cdrom.mp3.c @@ -34,24 +34,7 @@ #include "cdrom.h" #include "music_private.h" -static int cdrom_init(char *); -static int cdrom_exit(void); -static int cdrom_reset(void); -static int cdrom_start(int, int); -static int cdrom_stop(); -static int cdrom_getPlayingInfo(cd_time *); - -#define cdrom cdrom_mp3 -cdromdevice_t cdrom = { - cdrom_init, - cdrom_exit, - cdrom_reset, - cdrom_start, - cdrom_stop, - cdrom_getPlayingInfo, - NULL, - NULL -}; +static void cdrom_stop(void); #define PLAYLIST_MAX 256 @@ -61,11 +44,11 @@ static Mix_Music *mix_music; static int trackno; // 現在演奏中のトラック static int start_time; -static int cdrom_init(char *playlist_path) { +static bool cdrom_init(char *playlist_path) { char buf[256]; if (!playlist_path || !playlist_path[0]) - return NG; + return false; FILE *fp = fopen(playlist_path, "r"); if (fp) { @@ -78,7 +61,7 @@ static int cdrom_init(char *playlist_path) { // If the game has MIDI music, lack of the playlist is not a problem. if (ald_get_maxno(DRIFILE_MIDI) == 0) NOTICE("cdrom: Cannot open playlist %s", playlist_path); - return NG; + return false; } for (int track = 2; track < PLAYLIST_MAX; track++) { @@ -102,29 +85,27 @@ static int cdrom_init(char *playlist_path) { trackno = 0; enabled = true; - return OK; + return true; } -static int cdrom_exit(void) { +static void cdrom_exit(void) { if (enabled) { cdrom_stop(); } - return OK; } -static int cdrom_reset(void) { +static void cdrom_reset(void) { if (enabled) { cdrom_stop(); } - return OK; } /* トラック番号 trk の演奏 trk = 1~ */ -static int cdrom_start(int trk, int loop) { +static bool cdrom_start(int trk, int loop) { if (!enabled) return 0; if (trk >= PLAYLIST_MAX || !playlist[trk]) - return NG; + return false; if (mix_music) Mix_FreeMusic(mix_music); @@ -133,7 +114,7 @@ static int cdrom_start(int trk, int loop) { // Mix_LoadMUS uses SDL_RWFromFile which requires absolute path on Android char path[PATH_MAX]; if (!realpath(playlist[trk], path)) - return NG; + return false; mix_music = Mix_LoadMUS(path); #else mix_music = Mix_LoadMUS(playlist[trk]); @@ -141,41 +122,37 @@ static int cdrom_start(int trk, int loop) { if (!mix_music) { WARNING("Cannot load %s: %s", playlist[trk], Mix_GetError()); - return NG; + return false; } if (Mix_PlayMusic(mix_music, loop == 0 ? -1 : loop) != 0) { Mix_FreeMusic(mix_music); mix_music = NULL; - return NG; + return false; } trackno = trk; start_time = SDL_GetTicks(); - return OK; + return true; } -/* 演奏停止 */ -static int cdrom_stop() { - if (!enabled || !mix_music) { - return OK; - } +static void cdrom_stop(void) { + if (!enabled || !mix_music) + return; Mix_FreeMusic(mix_music); mix_music = NULL; trackno = 0; - - return OK; } /* 現在演奏中のトラック情報の取得 */ -static int cdrom_getPlayingInfo (cd_time *inf) { +static bool cdrom_getPlayingInfo (cd_time *inf) { if (!enabled || !mix_music) - return NG; + return false; if (!Mix_PlayingMusic()) { Mix_FreeMusic(mix_music); mix_music = NULL; - return NG; + return false; } int ms = SDL_GetTicks() - start_time; @@ -184,5 +161,14 @@ static int cdrom_getPlayingInfo (cd_time *inf) { inf->s = ms / 1000; ms %= 1000; inf->f = (ms * CD_FPS) / 1000; - return OK; + return true; } + +cdromdevice_t cdrom_mp3 = { + .init = cdrom_init, + .exit = cdrom_exit, + .reset = cdrom_reset, + .start = cdrom_start, + .stop = cdrom_stop, + .getpos = cdrom_getPlayingInfo, +}; diff --git a/src/music_cdrom.c b/src/music_cdrom.c index 3a2d0b2..2a2151d 100644 --- a/src/music_cdrom.c +++ b/src/music_cdrom.c @@ -51,9 +51,8 @@ int muscd_init(void) { } else { prv.cddev = NATIVE_CD_DEVICE; } - prv.cddev->init(playlist); prv.cd_current_track = 0; - return OK; + return prv.cddev->init(playlist) ? OK : NG; } int muscd_init_bgm(DRIFILETYPE type, int base_no) { @@ -85,9 +84,8 @@ int muscd_start(int trk, int loop) { return OK; prv.cddev->stop(); - prv.cddev->start(trk, loop); prv.cd_current_track = trk; - return OK; + return prv.cddev->start(trk, loop) ? OK : NG; } int muscd_stop(void) { @@ -102,7 +100,7 @@ int muscd_getpos(int *t, int *m, int *s, int *f) { if (!prv.cddev) return NG; cd_time info; - if (prv.cddev->getpos(&info) != OK) + if (!prv.cddev->getpos(&info)) return NG; *t = info.t; *m = info.m;