mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-10-02 19:58:07 +03:00
Refactor cdromdevice_t interface
This commit is contained in:
+20
-22
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user