Refactor cdromdevice_t interface

This commit is contained in:
kichikuou
2025-02-02 12:50:15 +09:00
parent 2857c13e15
commit 386c3c0fcd
5 changed files with 82 additions and 119 deletions
+20 -22
View File
@@ -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,
};
+21 -22
View File
@@ -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,
};
+9 -27
View File
@@ -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 <stdbool.h>
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__ */
+29 -43
View File
@@ -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,
};
+3 -5
View File
@@ -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;