diff options
| -rw-r--r-- | common/fmplayer_file.c | 35 | ||||
| -rw-r--r-- | common/fmplayer_file.h | 10 | ||||
| -rw-r--r-- | common/fmplayer_file_gio.c | 32 | ||||
| -rw-r--r-- | common/fmplayer_file_win.c | 28 | ||||
| -rw-r--r-- | fmdriver/fmdriver.h | 18 | ||||
| -rw-r--r-- | fmdriver/fmdriver_fmp.c | 2 | ||||
| -rw-r--r-- | fmdriver/fmdriver_pmd.c | 16 | ||||
| -rw-r--r-- | fmdriver/fmdriver_pmd.h | 1 | ||||
| -rw-r--r-- | fmdsp/fmdsp-pacc.c | 58 | ||||
| -rw-r--r-- | fmdsp/fmdsp-pacc.h | 6 | ||||
| -rw-r--r-- | fmdsp/fmdsp_sprites.h | 6 | ||||
| -rw-r--r-- | gtk/main.c | 6 | ||||
| -rw-r--r-- | win32/main.c | 4 | 
13 files changed, 200 insertions, 22 deletions
| diff --git a/common/fmplayer_file.c b/common/fmplayer_file.c index 3c05cab..ce7e1dc 100644 --- a/common/fmplayer_file.c +++ b/common/fmplayer_file.c @@ -5,6 +5,7 @@  void fmplayer_file_free(const struct fmplayer_file *fmfileptr) {    struct fmplayer_file *fmfile = (struct fmplayer_file *)fmfileptr;    if (!fmfile) return; +  free((void *)fmfile->filename_sjis);    free(fmfile->path);    free(fmfile->buf);    free(fmfile->ppzbuf[0]); @@ -109,6 +110,7 @@ struct fmplayer_file *fmplayer_file_alloc(const void *path, enum fmplayer_file_e      if (error) *error = FMPLAYER_FILE_ERR_NOMEM;      goto err;    } +  fmfile->filename_sjis = fmplayer_path_filename_sjis(path);    size_t filesize;    fmfile->buf = fmplayer_fileread(path, 0, 0, 0xffff, &filesize, error);    if (!fmfile->buf) goto err; @@ -139,17 +141,17 @@ static void loadppc(struct fmdriver_work *work, struct fmplayer_file *fmfile) {    }  } -static bool loadppzpvi(struct fmdriver_work *work, struct fmplayer_file *fmfile, const char *name) { +static bool loadppzpvi(struct fmdriver_work *work, struct fmplayer_file *fmfile, int bnum, const char *name) {    size_t filesize;    void *pvibuf = 0, *ppzbuf = 0;    pvibuf = fmplayer_fileread(fmfile->path, name, ".PVI", 0, &filesize, 0);    if (!pvibuf) goto err;    ppzbuf = calloc(ppz8_pvi_decodebuf_samples(filesize), 2);    if (!ppzbuf) goto err; -  if (!ppz8_pvi_load(work->ppz8, 0, pvibuf, filesize, ppzbuf)) goto err; +  if (!ppz8_pvi_load(work->ppz8, bnum, pvibuf, filesize, ppzbuf)) goto err;    free(pvibuf); -  free(fmfile->ppzbuf[0]); -  fmfile->ppzbuf[0] = ppzbuf; +  free(fmfile->ppzbuf[bnum]); +  fmfile->ppzbuf[bnum] = ppzbuf;    return true;  err:    free(ppzbuf); @@ -157,17 +159,17 @@ err:    return false;  } -static bool loadppzpzi(struct fmdriver_work *work, struct fmplayer_file *fmfile, const char *name) { +static bool loadppzpzi(struct fmdriver_work *work, struct fmplayer_file *fmfile, int bnum, const char *name) {    size_t filesize;    void *pzibuf = 0, *ppzbuf = 0;    pzibuf = fmplayer_fileread(fmfile->path, name, ".PZI", 0, &filesize, 0);    if (!pzibuf) goto err;    ppzbuf = calloc(ppz8_pzi_decodebuf_samples(filesize), 2);    if (!ppzbuf) goto err; -  if (!ppz8_pzi_load(work->ppz8, 0, pzibuf, filesize, ppzbuf)) goto err; +  if (!ppz8_pzi_load(work->ppz8, bnum, pzibuf, filesize, ppzbuf)) goto err;    free(pzibuf); -  free(fmfile->ppzbuf[0]); -  fmfile->ppzbuf[0] = ppzbuf; +  free(fmfile->ppzbuf[bnum]); +  fmfile->ppzbuf[bnum] = ppzbuf;    return true;  err:    free(ppzbuf); @@ -175,12 +177,13 @@ err:    return false;  } -static void loadpmdppz(struct fmdriver_work *work, struct fmplayer_file *fmfile) { -  const char *ppzfile = fmfile->driver.pmd.ppzfile; -  if (!strlen(ppzfile)) return; -  if (!loadppzpvi(work, fmfile, ppzfile) && !loadppzpzi(work, fmfile, ppzfile)) { -    fmfile->pmd_ppz_err = true; +// returns true if error +static bool loadpmdppz(struct fmdriver_work *work, struct fmplayer_file *fmfile,int bnum, const char *ppzfile) { +  if (!strlen(ppzfile)) false; +  if (!loadppzpvi(work, fmfile, bnum, ppzfile) && !loadppzpzi(work, fmfile, bnum, ppzfile)) { +    return true;    } +  return false;  }  static void loadpvi(struct fmdriver_work *work, struct fmplayer_file *fmfile) { @@ -199,7 +202,7 @@ static void loadpvi(struct fmdriver_work *work, struct fmplayer_file *fmfile) {  static void loadfmpppz(struct fmdriver_work *work, struct fmplayer_file *fmfile) {    const char *pvifile = fmfile->driver.fmp.ppz_name;    if (!strlen(pvifile)) return; -  fmfile->fmp_ppz_err = !loadppzpvi(work, fmfile, pvifile); +  fmfile->fmp_ppz_err = !loadppzpvi(work, fmfile, 0, pvifile);  }  void fmplayer_file_load(struct fmdriver_work *work, struct fmplayer_file *fmfile, int loopcnt) { @@ -219,9 +222,9 @@ void fmplayer_file_load(struct fmdriver_work *work, struct fmplayer_file *fmfile      }      pmd_init(work, &fmfile->driver.pmd);      loadppc(work, fmfile); -    loadpmdppz(work, fmfile); +    work->pcmerror[1] = loadpmdppz(work, fmfile, 0, fmfile->driver.pmd.ppzfile); +    work->pcmerror[2] = loadpmdppz(work, fmfile, 1, fmfile->driver.pmd.ppzfile2);      work->pcmerror[0] = fmfile->pmd_ppc_err; -    work->pcmerror[1] = fmfile->pmd_ppz_err;      break;    case FMPLAYER_FILE_TYPE_FMP:      { diff --git a/common/fmplayer_file.h b/common/fmplayer_file.h index 143c349..610a401 100644 --- a/common/fmplayer_file.h +++ b/common/fmplayer_file.h @@ -30,11 +30,15 @@ struct fmplayer_file {      struct driver_fmp fmp;    } driver;    bool pmd_ppc_err; -  bool pmd_ppz_err;    bool fmp_pvi_err;    bool fmp_ppz_err;    void *buf;    void *ppzbuf[2]; +  // for display with FMDSP +  // might be NULL +  // currently only supports sjis (CP932) +  // string valid while file object valid +  const char *filename_sjis;  };  struct fmplayer_file *fmplayer_file_alloc(const void *path, enum fmplayer_file_error *error);  void fmplayer_file_free(const struct fmplayer_file *fmfile); @@ -49,6 +53,10 @@ const wchar_t *fmplayer_file_strerror_w(enum fmplayer_file_error error);  //   fmplayer_fileread("/home/foo/bar.mz", "BAZ", ".PVI", &filesize);  void *fmplayer_fileread(const void *path, const char *pcmname, const char *extension, size_t maxsize, size_t *filesize, enum fmplayer_file_error *error); +// allocates string in sjis +// free with free() +char *fmplayer_path_filename_sjis(const void *path); +  void *fmplayer_path_dup(const void *path);  #endif // MYON_FMPLAYER_FILE_H_INCLUDED diff --git a/common/fmplayer_file_gio.c b/common/fmplayer_file_gio.c index a2b52d2..c690b15 100644 --- a/common/fmplayer_file_gio.c +++ b/common/fmplayer_file_gio.c @@ -1,5 +1,6 @@  #include "common/fmplayer_file.h"  #include <gio/gio.h> +#include <glib.h>  #include <stdlib.h>  #include <string.h> @@ -119,3 +120,34 @@ err:  void *fmplayer_path_dup(const void *path) {    return strdup(path);  } + +char *fmplayer_path_filename_sjis(const void *pathptr) { +  const char *uri = pathptr; +  GFile *file = 0; +  GFileInfo *finfo = 0; +  const char *filename = 0; +  char *filenamesjis = 0, *filenamebuf = 0; +  file = g_file_new_for_uri(uri); +  if (!file) goto err; +  finfo = g_file_query_info( +      file, +      G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, +      G_FILE_QUERY_INFO_NONE, +      0, +      0); +  if (!finfo) goto err; +  filename = g_file_info_get_attribute_string( +      finfo, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); +  filenamesjis = g_convert_with_fallback( +      filename, -1, +      "cp932", "utf-8", "?", +      0, 0, 0); +  if (!filenamesjis) goto err; +  filenamebuf = strdup(filenamesjis); +err: +  if (filenamesjis) g_free(filenamesjis); +  if (finfo) g_object_unref(G_OBJECT(finfo)); +  if (file) g_object_unref(G_OBJECT(file)); +  return filenamebuf; +} + diff --git a/common/fmplayer_file_win.c b/common/fmplayer_file_win.c index 5ca57dc..71fb263 100644 --- a/common/fmplayer_file_win.c +++ b/common/fmplayer_file_win.c @@ -114,3 +114,31 @@ void *fmplayer_path_dup(const void *pathptr) {    return strdup(path);  #endif  } + +char *fmplayer_path_filename_sjis(const void *pathptr) { +  wchar_t *u16_path = 0; +  char *filename_sjis = 0; +#if defined(FMPLAYER_FILE_WIN_UTF16) +  const wchar_t *path = pathptr; +  u16_path = wcsdup(path); +#elif defined(FMPLAYER_FILE_WIN_UTF8) +  const char *path = pathptr; +  u16_path = u8tou16(path); +#endif +  if (!u16_path) goto err; +  PathStripPath(u16_path); +  int bufsize = WideCharToMultiByte(932, 0, u16_path, -1, 0, 0, 0, 0); +  if (bufsize <= 0) goto err; +  filename_sjis = malloc(bufsize); +  if (!filename_sjis) goto err; +  bufsize = WideCharToMultiByte( +      932, 0, u16_path, -1, filename_sjis, bufsize, 0, 0); +  if (!bufsize) goto err; +  free(u16_path); +  return filename_sjis; + +err: +  free(filename_sjis); +  free(u16_path); +  return 0; +} diff --git a/fmdriver/fmdriver.h b/fmdriver/fmdriver.h index ba36c3e..f84a974 100644 --- a/fmdriver/fmdriver.h +++ b/fmdriver/fmdriver.h @@ -32,6 +32,8 @@ enum {  enum {    // 1 line = 80 characters, may contain half-width doublebyte characters    FMDRIVER_TITLE_BUFLEN = 80*2+1, + +  FMDRIVER_PCMCOUNT = 4,  };  enum fmdriver_track_type { @@ -108,10 +110,20 @@ struct fmdriver_work {    // only single-byte uppercase cp932    char filename[FMDRIVER_TITLE_BUFLEN]; -  // always 8 characters and pad with ' ' -  char pcmname[2][9]; + +  // PCM: 0    1    2    3 +  // PMD: PPC  PPZ1 PPZ2 PPC +  // FMP: PVI  PPZ + +  // if (!strlen(pcmtype[i])) this pcm is not available on this driver +  char pcmtype[FMDRIVER_PCMCOUNT][5]; +  // CP932 encoded +  char pcmname[FMDRIVER_PCMCOUNT][9]; +  // not set by drivers, used by visualizer (FMDSP) +  // set to true when for example the PCM file was not found +  bool pcmerror[FMDRIVER_PCMCOUNT]; +    // driver status (for display) -  bool pcmerror[2];    uint8_t ssg_noise_freq;    struct fmdriver_track_status track_status[FMDRIVER_TRACK_NUM];    uint8_t loop_cnt; diff --git a/fmdriver/fmdriver_fmp.c b/fmdriver/fmdriver_fmp.c index 9abfaaa..635ae4b 100644 --- a/fmdriver/fmdriver_fmp.c +++ b/fmdriver/fmdriver_fmp.c @@ -3596,6 +3596,8 @@ void fmp_init(struct fmdriver_work *work, struct driver_fmp *fmp) {    fmp_work_status_init(work, fmp);
    fmdriver_fillpcmname(work->pcmname[0], fmp->pvi_name);
    fmdriver_fillpcmname(work->pcmname[1], fmp->ppz_name);
 +  strcpy(work->pcmtype[0], "PVI");
 +  strcpy(work->pcmtype[1], "PPZ");
    work->playing = true;
  }
 diff --git a/fmdriver/fmdriver_pmd.c b/fmdriver/fmdriver_pmd.c index f4eaab7..f5322fa 100644 --- a/fmdriver/fmdriver_pmd.c +++ b/fmdriver/fmdriver_pmd.c @@ -1,6 +1,7 @@  #include "fmdriver_pmd.h"  #include "fmdriver_common.h"  #include <stddef.h> +#include <string.h>  enum {    SSG_ENV_STATE_OLD_AL, @@ -5876,7 +5877,7 @@ const char *pmd_get_memo(  void pmd_filenamecopy(char *dest, const char *src) {    int i;    for (i = 0; i < (PMD_FILENAMELEN+1); i++) { -    if (src[i] == '.') { +    if (src[i] == '.' || src[i] == ',') {        dest[i] = 0;        return;      } @@ -5906,6 +5907,7 @@ void pmd_init(struct fmdriver_work *work,    pmd_reset_timer(work, pmd);    pmd->playing = true;    work->driver_opna_interrupt = pmd_opna_interrupt; +    /*    static const int memotable[3] = {1, 4, 5};    for (int i = 0; i < 3; i++) { @@ -5923,6 +5925,10 @@ void pmd_init(struct fmdriver_work *work,    const char *pcmfile = pmd_get_memo(pmd, -2);    if (pcmfile) {      pmd_filenamecopy(pmd->ppzfile, pcmfile); +    const char *pcm2 = strchr(pcmfile, ','); +    if (pcm2) { +      pmd_filenamecopy(pmd->ppzfile2, pcm2+1); +    }    }    pcmfile = pmd_get_memo(pmd, -1);    if (pcmfile) { @@ -5933,8 +5939,16 @@ void pmd_init(struct fmdriver_work *work,      pmd_filenamecopy(pmd->ppcfile, pcmfile);    }    fmdriver_fillpcmname(work->pcmname[0], pmd->ppcfile); +  strcpy(work->pcmtype[0], "PPC");    fmdriver_fillpcmname(work->pcmname[1], pmd->ppzfile); +  strcpy(work->pcmtype[1], "PPZ1"); +  fmdriver_fillpcmname(work->pcmname[2], pmd->ppzfile2); +  strcpy(work->pcmtype[2], "PPZ2"); +  fmdriver_fillpcmname(work->pcmname[3], pmd->ppsfile); +  strcpy(work->pcmtype[3], "PPS");    work->playing = true; +  // PPS currently unsupported +  work->pcmerror[3] = true;  }  enum { diff --git a/fmdriver/fmdriver_pmd.h b/fmdriver/fmdriver_pmd.h index 25d42d7..cf16cdf 100644 --- a/fmdriver/fmdriver_pmd.h +++ b/fmdriver/fmdriver_pmd.h @@ -458,6 +458,7 @@ struct driver_pmd {    bool ssgeff_noise_mix;    bool ssgeff_on;    char ppzfile[PMD_FILENAMELEN+1]; +  char ppzfile2[PMD_FILENAMELEN+1];    char ppsfile[PMD_FILENAMELEN+1];    char ppcfile[PMD_FILENAMELEN+1];  }; diff --git a/fmdsp/fmdsp-pacc.c b/fmdsp/fmdsp-pacc.c index 00fb935..54a37ea 100644 --- a/fmdsp/fmdsp-pacc.c +++ b/fmdsp/fmdsp-pacc.c @@ -109,6 +109,7 @@ struct fmdsp_pacc {    struct pacc_ctx *pc;    struct pacc_vtable pacc;    struct pacc_tex *tex_font; +  struct pacc_tex *tex_fontm;    struct pacc_tex *tex_checker;    struct pacc_tex *tex_key_left;    struct pacc_tex *tex_key_right; @@ -140,6 +141,7 @@ struct fmdsp_pacc {    struct pacc_buf *buf_font_7;    struct pacc_buf *buf_font_2, *buf_font_2_d;    struct pacc_buf *buf_font_1, *buf_font_1_d; +  struct pacc_buf *buf_fontm_2, *buf_fontm_3;    struct pacc_buf *buf_checker, *buf_checker_1;    struct pacc_buf *buf_key_left;    struct pacc_buf *buf_key_right; @@ -193,6 +195,7 @@ struct fmdsp_pacc {    int comment_offset;    bool comment_prev_avail;    bool comment_next_avail; +  char *filename;  };  static struct pacc_tex *tex_from_font( @@ -224,6 +227,10 @@ static void fmdsp_pacc_deinit_buf(struct fmdsp_pacc *fp) {    fp->buf_font_2_d = 0;    fp->pacc.buf_delete(fp->buf_font_7);    fp->buf_font_7 = 0; +  fp->pacc.buf_delete(fp->buf_fontm_2); +  fp->buf_fontm_2 = 0; +  fp->pacc.buf_delete(fp->buf_fontm_3); +  fp->buf_fontm_3 = 0;    fp->pacc.buf_delete(fp->buf_checker);    fp->buf_checker = 0;    fp->pacc.buf_delete(fp->buf_checker_1); @@ -311,6 +318,8 @@ static void fmdsp_pacc_deinit_buf(struct fmdsp_pacc *fp) {  static void fmdsp_pacc_deinit_tex(struct fmdsp_pacc *fp) {    fp->pacc.tex_delete(fp->tex_font);    fp->tex_font = 0; +  fp->pacc.tex_delete(fp->tex_fontm); +  fp->tex_fontm = 0;    fp->pacc.tex_delete(fp->tex_checker);    fp->tex_checker = 0;    fp->pacc.tex_delete(fp->tex_key_left); @@ -375,6 +384,7 @@ void fmdsp_pacc_release(struct fmdsp_pacc *fp) {        fmdsp_pacc_deinit_buf(fp);        fmdsp_pacc_deinit_tex(fp);      } +    free(fp->filename);      free(fp);    }  } @@ -627,6 +637,8 @@ static void update_track_10(struct fmdsp_pacc *fp, const uint8_t *track_table, i  static bool fmdsp_pacc_init_tex(struct fmdsp_pacc *fp) {    fp->tex_font = tex_from_font(fp->pc, &fp->pacc, &font_fmdsp_small);    if (!fp->tex_font) goto err; +  fp->tex_fontm = tex_from_font(fp->pc, &fp->pacc, &font_fmdsp_medium); +  if (!fp->tex_fontm) goto err;    fp->tex_checker = fp->pacc.gen_tex(fp->pc, 2, 2);    if (!fp->tex_checker) goto err;    fp->tex_key_left = fp->pacc.gen_tex(fp->pc, KEY_LEFT_W, KEY_H); @@ -819,6 +831,10 @@ static bool fmdsp_pacc_init_buf(struct fmdsp_pacc *fp) {    if (!fp->buf_font_2_d) goto err;    fp->buf_font_7 = fp->pacc.gen_buf(fp->pc, fp->tex_font, pacc_buf_mode_static);    if (!fp->buf_font_7) goto err; +  fp->buf_fontm_2 = fp->pacc.gen_buf(fp->pc, fp->tex_fontm, pacc_buf_mode_static); +  if (!fp->buf_fontm_2) goto err; +  fp->buf_fontm_3 = fp->pacc.gen_buf(fp->pc, fp->tex_fontm, pacc_buf_mode_static); +  if (!fp->buf_fontm_3) goto err;    fp->buf_checker = fp->pacc.gen_buf(fp->pc, fp->tex_checker, pacc_buf_mode_static);    if (!fp->buf_checker) goto err;    fp->buf_checker_1 = fp->pacc.gen_buf(fp->pc, fp->tex_checker, pacc_buf_mode_static); @@ -1632,6 +1648,8 @@ static void mode_update(struct fmdsp_pacc *fp) {    fp->pacc.buf_clear(fp->buf_font_1);    fp->pacc.buf_clear(fp->buf_font_2);    fp->pacc.buf_clear(fp->buf_font_7); +  fp->pacc.buf_clear(fp->buf_fontm_2); +  fp->pacc.buf_clear(fp->buf_fontm_3);    fp->pacc.buf_clear(fp->buf_solid_2);    fp->pacc.buf_clear(fp->buf_solid_3);    fp->pacc.buf_clear(fp->buf_solid_7); @@ -1679,6 +1697,34 @@ static void mode_update(struct fmdsp_pacc *fp) {    fp->pacc.buf_rect(        fp->pc, fp->buf_tri,        FILEBAR_TRI_X, FILEBAR_TRI_Y, FILEBAR_TRI_W, FILEBAR_TRI_H); +  if (fp->work) { +    int pcmcount; +    for (pcmcount = 0; pcmcount < FMDRIVER_PCMCOUNT; pcmcount++) { +      if (!fp->work->pcmtype[pcmcount][0]) break; +    } +    for (int i = 0; i < pcmcount; i++) { +      int xoff = (pcmcount - i - 1) * FILEBAR_PCM_W; +      fp->pacc.buf_rect( +          fp->pc, fp->buf_solid_2, FILEBAR_PCMBAR_X-xoff, PLAYING_Y, 2, 7); +      fp->pacc.buf_printf( +          fp->pc, fp->buf_font_2, FILEBAR_PCM_X-xoff, PLAYING_Y+1, +          "%s", fp->work->pcmtype[i]); +      fp->pacc.buf_rect( +          fp->pc, fp->buf_tri, +          FILEBAR_PCM_TRI_X + 5*strlen(fp->work->pcmtype[i]) - xoff, +          FILEBAR_TRI_Y, FILEBAR_TRI_W, FILEBAR_TRI_H); +      fp->pacc.buf_printf( +          fp->pc, fp->work->pcmerror[i] ? fp->buf_fontm_3 : fp->buf_fontm_2, +          FILEBAR_PCM_NAME_X-xoff, FILEBAR_PCM_NAME_Y, +          "%s", fp->work->pcmname[i]); +      if (fp->filename) { +        fp->pacc.buf_printf( +            fp->pc, fp->buf_fontm_2, +            FILEBAR_FILENAME_X, FILEBAR_PCM_NAME_Y, +            "%s", fp->filename); +      } +    } +  }    switch (fp->lmode) {    case FMDSP_LEFT_MODE_OPNA: @@ -1848,6 +1894,7 @@ void fmdsp_pacc_render(struct fmdsp_pacc *fp) {    fp->pacc.draw(fp->pc, fp->buf_solid_3_d, pacc_mode_color);    fp->pacc.draw(fp->pc, fp->buf_vertical_3, pacc_mode_color);    fp->pacc.draw(fp->pc, fp->buf_horizontal_3, pacc_mode_color); +  fp->pacc.draw(fp->pc, fp->buf_fontm_3, pacc_mode_color);    fp->pacc.color(fp->pc, 2);    fp->pacc.draw(fp->pc, fp->buf_font_2, pacc_mode_color);    fp->pacc.draw(fp->pc, fp->buf_font_2_d, pacc_mode_color); @@ -1855,6 +1902,7 @@ void fmdsp_pacc_render(struct fmdsp_pacc *fp) {    fp->pacc.draw(fp->pc, fp->buf_solid_2_d, pacc_mode_color);    fp->pacc.draw(fp->pc, fp->buf_vertical_2, pacc_mode_color);    fp->pacc.draw(fp->pc, fp->buf_horizontal_2_d, pacc_mode_color); +  fp->pacc.draw(fp->pc, fp->buf_fontm_2, pacc_mode_color);    fp->pacc.color(fp->pc, 5);    fp->pacc.draw(fp->pc, fp->buf_panpot_5_d, pacc_mode_color);    fp->pacc.color(fp->pc, 7); @@ -1939,6 +1987,10 @@ void fmdsp_pacc_set_right_mode(struct fmdsp_pacc *fp, enum fmdsp_right_mode mode    fp->mode_changed = true;  } +void fmdsp_pacc_update_file(struct fmdsp_pacc *fp) { +  fp->mode_changed = true; +} +  static void font_putchar(      uint8_t *tex, int texwidth,      const void *data, @@ -2133,3 +2185,9 @@ void fmdsp_pacc_comment_scroll(struct fmdsp_pacc *fp, bool down) {    }    fmdsp_pacc_comment_draw(fp);  } + +void fmdsp_pacc_set_filename_sjis(struct fmdsp_pacc *fp, const char *filename) { +  free(fp->filename); +  fp->filename = strdup(filename); +} + diff --git a/fmdsp/fmdsp-pacc.h b/fmdsp/fmdsp-pacc.h index 7fabd0b..3e10e03 100644 --- a/fmdsp/fmdsp-pacc.h +++ b/fmdsp/fmdsp-pacc.h @@ -53,9 +53,15 @@ enum fmdsp_left_mode fmdsp_pacc_left_mode(const struct fmdsp_pacc *fp);  void fmdsp_pacc_set_left_mode(struct fmdsp_pacc *fp, enum fmdsp_left_mode mode);  enum fmdsp_right_mode fmdsp_pacc_right_mode(const struct fmdsp_pacc *fp);  void fmdsp_pacc_set_right_mode(struct fmdsp_pacc *fp, enum fmdsp_right_mode mode); +// redraw filename, PCM filenames +void fmdsp_pacc_update_file(struct fmdsp_pacc *fp);  void fmdsp_pacc_set_font16(struct fmdsp_pacc *fp, const struct fmdsp_font *font);  void fmdsp_pacc_comment_reset(struct fmdsp_pacc *fp);  void fmdsp_pacc_comment_scroll(struct fmdsp_pacc *fp, bool down); +// this will strdup the string and fmdsp_pacc will manage the memory +// currently only supports 1-byte CP932 (ANK) +void fmdsp_pacc_set_filename_sjis(struct fmdsp_pacc *fp, const char *filename); +  #endif // MYON_FMDSP_PACC_H_INCLUDED diff --git a/fmdsp/fmdsp_sprites.h b/fmdsp/fmdsp_sprites.h index 1553400..5c33554 100644 --- a/fmdsp/fmdsp_sprites.h +++ b/fmdsp/fmdsp_sprites.h @@ -181,6 +181,12 @@ enum {    COMMENT_TRI_X = 8,    COMMENT_TRI_U_Y = 349,    COMMENT_TRI_D_Y = 387, +  FILEBAR_PCMBAR_X = 551, +  FILEBAR_PCM_X = FILEBAR_PCMBAR_X + 4, +  FILEBAR_PCM_TRI_X = FILEBAR_PCM_X + 1, +  FILEBAR_PCM_NAME_X = FILEBAR_PCM_TRI_X + 27, +  FILEBAR_PCM_NAME_Y = FILEBAR_TRI_Y - 4, +  FILEBAR_PCM_W = 88,  };  enum { @@ -135,7 +135,7 @@ static void on_config(GtkMenuItem *menuitem, gpointer ptr) {  static void msgbox_err(const char *msg) {    GtkWidget *d = gtk_message_dialog_new(GTK_WINDOW(g.mainwin), GTK_DIALOG_MODAL,                            GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, -                          msg); +                          "%s", msg);    gtk_dialog_run(GTK_DIALOG(d));    gtk_widget_destroy(d);  } @@ -208,6 +208,10 @@ static bool openfile(const char *uri) {      strncpy(g.work.filename, uri, sizeof(g.work.filename)-1);    }    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);    g.ss->pause(g.ss, 0, 1);    g.sound_paused = false; diff --git a/win32/main.c b/win32/main.c index 5e194fd..026250d 100644 --- a/win32/main.c +++ b/win32/main.c @@ -145,6 +145,10 @@ static void openfile(HWND hwnd, const wchar_t *path) {    opna_fm_set_hires_env(&g.opna.fm, fmplayer_config.fm_hires_env);    WideCharToMultiByte(932, WC_NO_BEST_FIT_CHARS, path, -1, g.work.filename, sizeof(g.work.filename), 0, 0);    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);    if (!g.sound) {      g.sound = sound_init(hwnd, SRATE, SECTLEN, | 
