diff -ruN TiMidity++-2.2.0/ChangeLog TiMidity++-2.3.0/ChangeLog --- TiMidity++-2.2.0/ChangeLog Mon Jul 19 13:11:17 1999 +++ TiMidity++-2.3.0/ChangeLog Sun Aug 1 03:36:07 1999 @@ -1,3 +1,81 @@ +1999-08-01 Masanao Izumo + + * Version 2.3.0 released. + +1999-07-31 Masanao Izumo + + * timidity/playmidi.c (compute_data): Move the call of apply_controls() + position to before output. + * timidity/playmidi.c (play_midi_file): Initialize `current_file_info' + at beginnig of play_midi_file(); + * timidity/readmidi.h (IS_ERROR_FILE): New macro to mark the error file. + * timidity/playmidi.c (play_midi_file): Mark IS_ERROR_FILE to + current_file_info if the file isn't recognized as MIDI file. + * timidity/playmidi.c: Enabled to control playing position during pause. + * interface/{w32g.h,w32g_c.c,w32g_canvas.c,w32g_i.c,w32g_ini.c, + w32g_panel.c,w32g_playlist.c,w32g_res.h,w32g_res.rc,w32g_utl.c, + w32g_utl.h}: + - Re-maked Windows GUI interface. + - Added new feature of changing the output. Now, Windows GUI TiMidity + can convert MIDI to WAVE file. + - Enabled to delete playlist file. + [Delete] Key: Delete the CurSel item. + [BackSpace] Key: Delete the upper of CurSel item. + +1999-07-30 Masanao Izumo + * timidity/controls.h (CTLE_PAUSE): New macro for pause event. + * timidity/playmidi.c (ctl_pause_event): New function to send CTLE_PAUSE. + * timidity/ncurs_c.c (display_aq_ratio): Bug fixed division by zero. + * timidity/aq_c.c (aq_setup): Clear the queue for file output. + * timidity/{controls.h,timidity.c} (CTLF_AUTOSTART, CTLF_AUTOEXIT): + New macro for ControlMode. + CTLF_AUTOSTART is toggle on/off with -i?a option. + CTLF_AUTOEXIT is toggle on/off with -i?x option. + +1999-07-28 Masanao Izumo + + * timidity/w32_a.c (wait, wait_playing): Changed wait to wait_playing. + * timidity/w32_a.c (PM_REQ_FLUSH): Implemented. + * timidity/miditrace.c (trace_nodelay): Removed. Use !ctl->trace_playing + instead of midi_trace.nodelay. + +1999-07-27 Masanao Izumo + + * timidity/{controls.h,playmidi.c} (RC_STOP): New macro for interface + to terminate playing. + * timidity/{timidity.c,playmidi.c} (intr): Uncommented. Ctl-C marks + `intr' true, and TiMidity will shutdown safety. + +1999-07-26 Eric A. Welsh + + * timidity/playmidi.c (voice reduction): + Improved both in quality and in speed. + * timidity/{timidity.c,playmidi.c} (auto polyphony reduction): + Added new feature of auto polyphony reduction. This feature is + enabled/disabled with -p a option. It is enabled by default. + +1999-07-25 Masanao Izumo + + * timidity/timidity.c (opt_aq_max_buff, opt_aq_fill_buff, + output_text_code): Fixed memory leak. + * interface/{w32g_utl.c,w32g_utl.h} (SETTING_TIMIDITY): Reconstructed. + * timidity/playmidi.c (play_pause_flag): Global variable. + +1999-07-24 Masanao Izumo + + * timidity/timidity.c (set_tim_opt): Orderd switch-case. + * timidity/timidity.c (set_ctl): Changed for Windows GUS. + * timidity/instrum.c (Instrument caching): Don't cache default instrument. + * interface/w32g_utl.c (PLAYLIST): Bug fixed and simplify. + +1999-07-23 Eric A. Welsh + + * timidity/playmidi.c (Voice reduction): Improved. + +1999-07-21 Masanao Izumo + + * timidity/aq.c (aq_add): Buffering in non trace mode. + 1999-07-19 Masanao Izumo * Version 2.2.0 released. diff -ruN TiMidity++-2.2.0/NEWS TiMidity++-2.3.0/NEWS --- TiMidity++-2.2.0/NEWS Sat Apr 17 21:55:35 1999 +++ TiMidity++-2.3.0/NEWS Sun Aug 1 03:35:35 1999 @@ -1,3 +1,32 @@ +8/1, 1999 + * Version 2.3.0 released. + * Make Windows GUI code elegant. + * Support MIDI to WAVE converter in Windows GUI. + +7/26, 1999 + * New feature: Auto polyphony reduction. + +7/19, 1999 + * Version 2.2.0 released. + * Enabled to specify the software buffer size with `-q' option + * Enabled build UMP on FreeBSD-ELF environment. + +7/9, 1999 + * Version 2.1.1 released. + +6/10, 1999 + * Version 2.1.0 released. + * Enable a multi-point interpolation in resampling. + Cubic spline curve and lagrange interpolation is supported. + * Support linux axp + * Load frequency table with -Z option. + +4/28, 1999 + * Version 2.0.2 released. + +4/25, 1999 + * Version 2.0.1 released. + 4/17, 1999 Major changes in release 2.0.0: diff -ruN TiMidity++-2.2.0/common.makefile.in TiMidity++-2.3.0/common.makefile.in --- TiMidity++-2.2.0/common.makefile.in Sun Apr 18 15:45:21 1999 +++ TiMidity++-2.3.0/common.makefile.in Sat Jul 31 19:23:45 1999 @@ -25,6 +25,10 @@ ## Please modify and uncomment if you want to change. #CC= @CC@ #CFLAGS = @CFLAGS@ +# For pentium gcc +#CFLAGS = -O6 -Os -mpentium -march=pentium -fomit-frame-pointer \ +# -funroll-all-loops -malign-double -malign-jumps=0 \ +# -malign-functions=0 -ffast-math -malign-loops=0 #CPPFLAGS = @CPPFLAGS@ #DEFS = @DEFS@ diff -ruN TiMidity++-2.2.0/configure TiMidity++-2.3.0/configure --- TiMidity++-2.2.0/configure Sat Jul 17 18:57:37 1999 +++ TiMidity++-2.3.0/configure Sat Jul 31 00:59:17 1999 @@ -856,7 +856,7 @@ PACKAGE=TiMidity++ -VERSION=2.2.0 +VERSION=2.3.0 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } @@ -7059,7 +7059,7 @@ lib_w32gui_opt='-lgdi32 -lcomctl32 -lcomdlg32' lib_user32_opt='-luser32' LDFLAGS="-mwindows $LDFLAGS" - INTERFACE_SRCS="$INTERFACE_SRCS w32g_c.c w32g_ini.c w32g_main.c w32g_utl.c" + INTERFACE_SRCS="$INTERFACE_SRCS w32g_c.c w32g_ini.c w32g_i.c w32g_playlist.c w32g_utl.c w32g_panel.c w32g_canvas.c" ;; xdynamic) diff -ruN TiMidity++-2.2.0/configure.in TiMidity++-2.3.0/configure.in --- TiMidity++-2.2.0/configure.in Sat Jul 17 18:55:27 1999 +++ TiMidity++-2.3.0/configure.in Sat Jul 31 00:49:07 1999 @@ -53,7 +53,7 @@ AC_INIT(timidity/timidity.c) AC_CANONICAL_SYSTEM -AM_INIT_AUTOMAKE(TiMidity++, 2.2.0, no-define) +AM_INIT_AUTOMAKE(TiMidity++, 2.3.0, no-define) dnl To use CONTAINS() macro (See acinclude.m4) CONTAINS_INIT @@ -871,7 +871,7 @@ [ lib_w32gui_opt='-lgdi32 -lcomctl32 -lcomdlg32' lib_user32_opt='-luser32' LDFLAGS="-mwindows $LDFLAGS" - INTERFACE_SRCS="$INTERFACE_SRCS w32g_c.c w32g_ini.c w32g_main.c w32g_utl.c" + INTERFACE_SRCS="$INTERFACE_SRCS w32g_c.c w32g_ini.c w32g_i.c w32g_playlist.c w32g_utl.c w32g_panel.c w32g_canvas.c" ]) diff -ruN TiMidity++-2.2.0/interface/Makefile.am TiMidity++-2.3.0/interface/Makefile.am --- TiMidity++-2.2.0/interface/Makefile.am Sun Apr 18 15:50:49 1999 +++ TiMidity++-2.3.0/interface/Makefile.am Sat Jul 31 00:48:23 1999 @@ -93,14 +93,15 @@ server_defs.h \ w32g.h \ w32g_c.c \ - w32g_c.h \ w32g_ini.c \ - w32g_main.c \ - w32g_main.h \ w32g_res.h \ w32g_res.rc \ w32g_utl.c \ w32g_utl.h \ + w32g_i.c \ + w32g_playlist.c \ + w32g_panel.c \ + w32g_canvas.c \ w32g_btn.bmp \ w32g_icon.ico \ w32g_sleep.bmp \ diff -ruN TiMidity++-2.2.0/interface/Makefile.in TiMidity++-2.3.0/interface/Makefile.in --- TiMidity++-2.2.0/interface/Makefile.in Mon Jul 19 13:11:47 1999 +++ TiMidity++-2.3.0/interface/Makefile.in Sun Aug 1 03:44:54 1999 @@ -121,7 +121,7 @@ libinterface_a_SOURCES = dumb_c.c wrdt_dumb.c wrdt_tty.c -EXTRA_libinterface_a_SOURCES = ncurs_c.c slang_c.c motif.h motif_c.c motif_i.c motif_p.c tk_c.c emacs_c.c vt100.h vt100.c vt100_c.c xaw.h xaw_c.c xaw_i.c xaw_redef.c xskin.h xskin_c.c xskin_i.c xskin_loadBMP.c xskin_spectrum.c wrdt_x.c x_sherry.c x_sherry.h x_wrdwindow.c x_wrdwindow.h VTPrsTbl.c VTparse.h x_mag.c x_mag.h dynamic_c.c mac_c.c mac_c.h mac_mag.c mac_mag.h mac_trace.c mac_wrdwindow.c mac_wrdwindow.h wrdt_mac.c wrdt_wcon.c gtk_c.c gtk_h.h gtk_i.c gtk_p.c soundspec.c soundspec.h x_sherry.c x_sherry.h check.xbm arrow.xbm on.xbm off.xbm server_c.c server_defs.h w32g.h w32g_c.c w32g_c.h w32g_ini.c w32g_main.c w32g_main.h w32g_res.h w32g_res.rc w32g_utl.c w32g_utl.h w32g_btn.bmp w32g_icon.ico w32g_sleep.bmp w32g_subbtn.bmp +EXTRA_libinterface_a_SOURCES = ncurs_c.c slang_c.c motif.h motif_c.c motif_i.c motif_p.c tk_c.c emacs_c.c vt100.h vt100.c vt100_c.c xaw.h xaw_c.c xaw_i.c xaw_redef.c xskin.h xskin_c.c xskin_i.c xskin_loadBMP.c xskin_spectrum.c wrdt_x.c x_sherry.c x_sherry.h x_wrdwindow.c x_wrdwindow.h VTPrsTbl.c VTparse.h x_mag.c x_mag.h dynamic_c.c mac_c.c mac_c.h mac_mag.c mac_mag.h mac_trace.c mac_wrdwindow.c mac_wrdwindow.h wrdt_mac.c wrdt_wcon.c gtk_c.c gtk_h.h gtk_i.c gtk_p.c soundspec.c soundspec.h x_sherry.c x_sherry.h check.xbm arrow.xbm on.xbm off.xbm server_c.c server_defs.h w32g.h w32g_c.c w32g_ini.c w32g_res.h w32g_res.rc w32g_utl.c w32g_utl.h w32g_i.c w32g_playlist.c w32g_panel.c w32g_canvas.c w32g_btn.bmp w32g_icon.ico w32g_sleep.bmp w32g_subbtn.bmp @ENABLE_WRD_TRUE@WRD_OBJS = wrdt_x.o x_wrdwindow.o VTPrsTbl.o x_mag.o x_sherry.o @@ -365,10 +365,6 @@ ../timidity/output.h ../timidity/controls.h \ ../timidity/instrum.h ../timidity/playmidi.h \ ../timidity/readmidi.h -dynamic_c.o: dynamic_c.c ../config.h ../timidity/timidity.h \ - ../utils/support.h ../timidity/common.h ../libarc/url.h \ - ../utils/mblock.h ../timidity/output.h ../timidity/controls.h \ - ../timidity/dlutils.h emacs_c.o: emacs_c.c ../config.h ../timidity/timidity.h \ ../utils/support.h ../timidity/common.h ../libarc/url.h \ ../utils/mblock.h ../timidity/output.h ../timidity/controls.h \ diff -ruN TiMidity++-2.2.0/interface/ncurs_c.c TiMidity++-2.3.0/interface/ncurs_c.c --- TiMidity++-2.2.0/interface/ncurs_c.c Sun Jul 18 01:58:27 1999 +++ TiMidity++-2.3.0/interface/ncurs_c.c Fri Jul 30 23:47:30 1999 @@ -1784,8 +1784,11 @@ } } mfp = head; - if(new_files != files) + if(new_files != files && new_files != NULL) + { + free(new_files[0]); free(new_files); + } } if(mfp == NULL) @@ -2261,7 +2264,6 @@ ctl_total_time(CTL_LAST_STATUS); ctl_master_volume(CTL_LAST_STATUS); ctl_file_name(NULL); - trace_nodelay(!ctl.trace_playing); display_key_helpmsg(); if(ctl.trace_playing) { @@ -2779,10 +2781,12 @@ static void display_aq_ratio(void) { static int last_rate = -1; - int rate; + int rate, devsiz; + if((devsiz = aq_get_dev_queuesize()) <= 0) + return; rate = (int)(((double)(aq_filled() + aq_soft_filled()) / - aq_get_dev_queuesize()) * 100 + 0.5); + devsiz) * 100 + 0.5); if(rate > 999) rate = 1000; diff -ruN TiMidity++-2.2.0/interface/w32g.h TiMidity++-2.3.0/interface/w32g.h --- TiMidity++-2.2.0/interface/w32g.h Wed Mar 24 01:59:41 1999 +++ TiMidity++-2.3.0/interface/w32g.h Sun Aug 1 01:24:50 1999 @@ -2,17 +2,171 @@ #define ___W32G_H_ #include -#include /* There is no on CYGWIN. - * Edit_* and ListBox_* are defined in - * - */ #ifndef MAXPATH #define MAXPATH 256 #endif /* MAXPATH */ -extern CHAR *INI_INVALID; -extern CHAR *INI_SEC_PLAYER; -extern CHAR *INI_SEC_TIMIDITY; +#define RC_EXT_BASE 1000 +enum { + RC_EXT_DROP = RC_EXT_BASE, + RC_EXT_LOAD_FILE, + RC_EXT_MODE_CHANGE, + RC_EXT_APPLY_SETTING, + RC_EXT_DELETE_PLAYLIST, +}; + +#define W32G_TIMIDITY_CFG "C:\\WINDOWS\\TIMIDITY.CFG" +#define MAX_W32G_MIDI_CHANNELS 32 + +#define FLAG_NOTE_OFF 1 +#define FLAG_NOTE_ON 2 + +#define FLAG_BANK 0x0001 +#define FLAG_PROG 0x0002 +#define FLAG_PAN 0x0004 +#define FLAG_SUST 0x0008 + + +#define TMCCC_BLACK RGB(0x00,0x00,0x00) +#define TMCCC_WHITE RGB(0xff,0xff,0xff) +#define TMCCC_RED RGB(0xff,0x00,0x00) + +#define TMCCC_FORE TMCCC_BLACK // Aliased +#define TMCCC_BACK RGB(0x00, 0xf0, 0x00) +#define TMCCC_LOW RGB(0x80, 0xd0, 0x00) +#define TMCCC_MIDDLE RGB(0xb0, 0xb0, 0x00) +#define TMCCC_HIGH RGB(0xe0, 0x00, 0x00) + +enum { + TMCC_BLACK, // Aliased FORE + TMCC_WHITE, + TMCC_RED, + TMCC_BACK, + TMCC_LOW, + TMCC_MIDDLE, + TMCC_HIGH, + TMCC_FORE_HALF, + TMCC_LOW_HALF, + TMCC_MIDDLE_HALF, + TMCC_HIGH_HALF, + TMCC_FORE_WEAKHALF, + TMCC_SIZE +}; +#define TMCC_FORE TMCC_BLACK // Aliased + +typedef struct _TmColors { + COLORREF color; + HPEN pen; + HBRUSH brush; +} TmColors; + +// Canvas Modes +enum { + TMCM_SLEEP, + TMCM_CHANNEL, + TMCM_TRACER +// TMCM_32CHANNEL +// TMCM_FREQUENCY +}; + + +#include "w32g_utl.h" + + +/* w32g_i.c */ +extern int w32g_open(void); +extern void w32g_close(void); +extern void w32g_send_rc(int rc, int32 value); +extern int w32g_get_rc(int32 *value, int wait_if_empty); +extern void w32g_lock(void); +extern void w32g_unlock(void); +extern void MainWndScrollbarProgressUpdate(int sec); +extern void PutsConsoleWnd(char *str); +extern void w32g_ctle_play_start(int sec); +extern void SettingWndApply(void); +extern int w32g_lock_open_file; +extern HINSTANCE hInst; + + +/* w32g_utl.c */ + +/* w32g_playlist.c */ +void w32g_add_playlist(int nfiles, char **files, int expand_flag); +char **w32g_get_playlist(int *nfiles); +extern int w32g_next_playlist(void); +extern int w32g_prev_playlist(void); +extern void w32g_first_playlist(void); +extern int w32g_isempty_playlist(void); +extern char *w32g_curr_playlist(void); +extern void w32g_update_playlist(void); +extern void w32g_get_playlist_index(int *selected, int *nfiles, int *cursel); +extern int w32g_goto_playlist(int num); +extern void w32g_delete_playlist(int pos); +extern int w32g_valid_playlist(void); +extern void w32g_setcur_playlist(void); + +/* w32g_panel.c */ +extern void w32g_init_panel(HWND hwnd); +extern void TmPanelStartToLoad(char *filename); +extern void TmPanelStartToPlay(int total_sec); +extern void TmPanelSetVoices(int v); +//extern void TmPanelInit(HWND hwnd); +extern void TmPanelRefresh(void); +extern void TmPanelSetTime(int sec); +extern void TmPanelSetMasterVol(int v); +extern void TmPanelUpdateList(void); + +/* w32g_canvas.c */ +extern void w32g_init_canvas(HWND hwnd); +extern void TmCanvasRefresh(void); +extern void TmCanvasReset(void); +extern void TmCanvasNote(int status, int ch, int note, int vel); +extern int TmCanvasChange(void); + +/* w32g_c.c */ +extern int w32g_play_active; +extern int w32g_current_volume[/* MAX_CHANNELS */]; +extern int w32g_current_expression[/* MAX_CHANNELS */]; + + + + + +// flags +extern int InitMinimizeFlag; +extern int DebugWndStartFlag; +extern int ConsoleWndStartFlag; +extern int ListWndStartFlag; +extern int TracerWndStartFlag; +extern int DocWndStartFlag; +extern int WrdWndStartFlag; +extern int DebugWndFlag; +extern int ConsoleWndFlag; +extern int ListWndFlag; +extern int TracerWndFlag; +extern int DocWndFlag; +extern int WrdWndFlag; +extern int SoundSpecWndFlag; + +extern int SubWindowMax; + +extern char *IniFile; +extern char *ConfigFile; +extern char *PlaylistFile; +extern char *PlaylistHistoryFile; +extern char *MidiFileOpenDir; +extern char *ConfigFileOpenDir; +extern char *PlaylistFileOpenDir; + +extern int PlayerThreadPriority; +extern int GUIThreadPriority; + +extern int WrdGraphicFlag; +extern int TraceGraphicFlag; +extern int DocMaxSize; +extern char *DocFileExt; + +extern int w32g_has_ini_file; #endif diff -ruN TiMidity++-2.2.0/interface/w32g_c.c TiMidity++-2.3.0/interface/w32g_c.c --- TiMidity++-2.2.0/interface/w32g_c.c Sat Jul 17 14:38:52 1999 +++ TiMidity++-2.3.0/interface/w32g_c.c Sun Aug 1 01:25:16 1999 @@ -1,6 +1,6 @@ /* - - TiMidity -- Experimental MIDI to WAVE converter + TiMidity -- MIDI to WAVE converter and player + Copyright (C) 1999 Masanao Izumo Copyright (C) 1995 Tuukka Toivonen This program is free software; you can redistribute it and/or modify @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. w32g_c.c: written by Daisuke Aoki + Masanao Izumo */ #ifdef HAVE_CONFIG_H @@ -32,996 +33,24 @@ #else #include #endif -#include -#if defined(__CYGWIN32__) || defined(__MINGW32__) -#include -#include -#endif - #include "timidity.h" #include "common.h" +#include "output.h" #include "instrum.h" #include "playmidi.h" -#include "readmidi.h" -#include "output.h" #include "controls.h" #include "miditrace.h" -#include "timer.h" -#include "bitset.h" -#include "arc.h" +#include "strtab.h" #include "aq.h" + #include "w32g.h" -/* FIXME */ -//#include #include -#include "w32g_main.h" -#include "w32g_res.h" -#include "w32g_utl.h" -#include "w32g_c.h" - -static void InitCrbLoopBuffer(void); - - -#define RC_CONTROL_CLEAR 1000 - -#define PLAYERMODE_CONTINUE 0x0001 -#define PLAYERMODE_REVERSE 0x0002 -#define PLAYERMODE_SINGLE 0x0004 -#define PLAYERMODE_TRUE_RANDOM 0x0008 -#define PLAYERMODE_HALF_RANDOM 0x0010 -#define PLAYERMODE_UNREPEAT 0x0100 -static int playermode = PLAYERMODE_CONTINUE; - -#define PLAYLISTMODE_LAST_ADD 0x0001 -#define PLAYLISTMODE_FIRST_ADD 0x0002 -#define PLAYLISTMODE_CLEAR 0x0100 -#define PLAYLISTMODE_IGNORE_CUR 0x0200 -#define PLAYLISTMODE_AUTOSTART 0x0400 -//static int playlistmode = PLAYLISTMODE_LAST_ADD | PLAYLISTMODE_AUTOSTART; -static int playlistmode = PLAYLISTMODE_LAST_ADD; - -volatile int player_status = PLAYERSTATUS_STOP; - -#if 0 /* not used */ -#define HISTORY_PLAYLIST_MAX 1024 -static PLAYLIST *old_playlist, *history_playList; -#endif - -PLAYLIST *playlist; -PLAYLIST *cur_pl = NULL; -int cur_pl_num = 0; -int playlist_num = 0; - -static HANDLE hMutexPlaylist = NULL; -void LockPlaylist(void) -{ - if(hMutexPlaylist==NULL) - hMutexPlaylist = CreateMutex(NULL,FALSE,"TiMidityPlaylistMutex"); - WaitForSingleObject(hMutexPlaylist, INFINITE); -} - -void UnLockPlaylist(void) -{ - if(hMutexPlaylist==NULL) - hMutexPlaylist = CreateMutex(NULL,FALSE,"TiMidityPlaylistMutex"); - ReleaseMutex(hMutexPlaylist); -} - -void PlayerPlaylistNum(void) -{ - LockPlaylist(); - cur_pl_num = num_before_playlist(cur_pl); - playlist_num = num_with_playlist(playlist); - UnLockPlaylist(); -} - -PLAYLIST *PlayerPlaylistAddFilename(char *filename) -{ - PLAYLIST *pl; - char *str; - LockPlaylist(); - - if(playlistmode & PLAYLISTMODE_CLEAR){ - del_all_playlist(playlist); - playlist = NULL; - } - - switch(playlistmode & 0x00ff){ - case PLAYLISTMODE_FIRST_ADD: - pl = first_insert_playlist_filename(playlist,filename); - playlist = first_playlist(pl); - break; - case PLAYLISTMODE_LAST_ADD: - default: - pl = last_insert_playlist_filename(playlist,filename); - playlist = first_playlist(pl); - break; - } - - if(!(playlistmode & PLAYLISTMODE_IGNORE_CUR)) - cur_pl = pl; - str = get_midi_title((char *)pl->filename); - if(str!=NULL){ - while(*str==' ') - str++; - strncpy((char *)pl->title,str,PLAYLIST_DATAMAX); - pl->title[PLAYLIST_DATAMAX] = '\0'; - } - PlayerPlaylistNum(); - UnLockPlaylist(); - return pl; -} - -static int isDirectory(char *path) -{ -#if defined(__CYGWIN32__) || defined(__MINGW32__) - struct stat st; - if(stat(path, &st) != -1) - return S_ISDIR(st.st_mode); -#endif - return GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY; -} - -PLAYLIST *PlayerPlaylistAddExpandFileArchives(char *filename) -{ - int backup_playlistmode = playlistmode; - PLAYLIST *p, *ret = NULL, *cur_pl_old = cur_pl; - int nfiles = 1, i; - char *infiles[1]; - char **files; - char *dirfile = NULL; - - LockPlaylist(); - - if(isDirectory(filename)) - { - dirfile = safe_malloc(strlen(filename) + 5); /*dir:*/ - strcpy(dirfile, "dir:"); - strcat(dirfile, filename); - filename = dirfile; - } - - infiles[0] = filename; - if(playlistmode & PLAYLISTMODE_CLEAR){ - del_all_playlist(playlist); - playlist = NULL; - } - playlistmode &= ~PLAYLISTMODE_CLEAR; - files = expand_file_archives(infiles, &nfiles); - ret = NULL; - for(i = 0;i < nfiles; i++) - { - p = PlayerPlaylistAddFilename(files[i]); - if(ret == NULL) - ret = p; - } - if(files != infiles) - free(files); - if(dirfile != NULL) - free(dirfile); - playlistmode = backup_playlistmode; - if(playlistmode & PLAYLISTMODE_IGNORE_CUR) - cur_pl = cur_pl_old; - else - cur_pl = ret; - PlayerPlaylistNum(); - UnLockPlaylist(); - return ret; -} - -PLAYLIST *PlayerPlaylistAddFiles -(int nfiles, char **files, int expand_file_archives_flag) -{ - int backup_playlistmode = playlistmode, i; - PLAYLIST *p, *ret = NULL, *cur_pl_old = cur_pl; - LockPlaylist(); - if(playlistmode & PLAYLISTMODE_CLEAR){ - del_all_playlist(playlist); - playlist = NULL; - } - playlistmode &= ~PLAYLISTMODE_CLEAR; - for(i=0;ifilename); - PutsDebugWnd("\n"); - pl = pl->next; - } - } -#endif - PlayerPlaylistNum(); - UnLockPlaylist(); - return ret; -} - -static int dropfiles_expand_file_archives_flag = 1; -PLAYLIST *PlayerPlaylistAddDropfiles(HDROP hDrop) -{ - return PlayerPlaylistAddDropfilesEx(hDrop, dropfiles_expand_file_archives_flag); -} - -#if 0 /* not used */ -static void CheckPlaylist(PLAYLIST *p) -{ - return; -} - -static void PlayerCheckPlaylist(void) -{ - CheckPlaylist(playlist); -} -#endif - -#define XOR(a,b) (((a) && !(b)) || (!(a) && (b))) - -static int progress_direction = 1; -static PLAYLIST *Player_1progress_playlist(PLAYLIST *p, int i) -{ - PLAYLIST *res; - int direction; - if(p==NULL) - return p; - if(i==0){ - direction = progress_direction; - } else { - if(XOR((playermode & PLAYERMODE_UNREPEAT),(i < 0))) /* reverse */ - direction = progress_direction = -1; - else - direction = progress_direction = 1; - } - if(direction < 0){ - res = p->prev; - if(res == NULL){ - if(playermode & PLAYERMODE_UNREPEAT) - res = p; - else - res = last_playlist(p); - } - } else { - res = p->next; - if(res == NULL){ - if(playermode & PLAYERMODE_UNREPEAT) - res = p; - else - res = first_playlist(p); - } - } - return res; -} - -static PLAYLIST *Player_progress_playlist(PLAYLIST *p, int n) -{ - PLAYLIST *res = p; - int i; - if(p==NULL) - return p; - if(n==0){ - res = Player_1progress_playlist(p, 0); - } else if(n>0){ - for(i=n;i>0;i--) - res = Player_1progress_playlist(p, 1); - } else { - for(i=n;i<0;i++) - res = Player_1progress_playlist(p, -1); - } - return res; -} - -static int IsPlayer1ProgressAblePlaylist(int n) -{ - PLAYLIST *p; - if(cur_pl == NULL) - return 0; - p = Player_1progress_playlist(cur_pl, n); - if(p==cur_pl) - return 0; - else - return 1; -} - -void SetCur_pl(PLAYLIST *pl) -{ - LockPlaylist(); - cur_pl = pl; - UnLockPlaylist(); -} - -void SetCur_plNum(int num) -{ - int i; - PlayerPlaylistNum(); - LockPlaylist(); - if(num >= 0 && num < playlist_num){ - PLAYLIST *pl = playlist; - for(i=0;inext; - } else - break; - } - cur_pl = pl; - } - UnLockPlaylist(); - PlayerPlaylistNum(); -} - -#if 0 -static void Player1ProgressCur_pl(int n) -{ - LockPlaylist(); - cur_pl = Player_1progress_playlist(cur_pl, n); - UnLockPlaylist(); -} -#endif - -static void PlayerProgressCur_pl(int n) -{ - LockPlaylist(); - cur_pl = Player_progress_playlist(cur_pl, n); - UnLockPlaylist(); -} - -static volatile int AutoPlayNum = 0; - -static int TmCanvasResetOK = 0; -static int TmPanelResetOK = 0; -static int MainWndScrollbarProgressResetOK = 0; -static int MainWndScrollbarVolumeResetOK = 0; - -static DWORD PlayerLoopSleepTimeMsecDefault = 1000; -static DWORD PlayerLoopSleepTimeMsecFast = 50; -void Player_loop(int init_flag) -{ - PLAYLIST *p; - DWORD PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - AutoPlayNum = 0; - if(init_flag){ - PLAYLIST *p = first_playlist(playlist); - SetCur_pl(p); - PlayerPlaylistNum(); - if(cur_pl!=NULL) - player_status = PLAYERSTATUS_DEMANDPLAY; - else - player_status = PLAYERSTATUS_STOP; - } - for(;;){ - volatile int cur_player_status = player_status; - p = cur_pl; - switch(cur_player_status){ - case PLAYERSTATUS_PLAYERROREND: - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecFast; -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : PLAYERROREND\n"); -#endif - if(IsPlayer1ProgressAblePlaylist(0)){ - PlayerProgressCur_pl(0); -// p = Player_progress_playlist(p,0); -// SetCur_pl(p); - PlayerPlaylistNum(); - player_status = PLAYERSTATUS_DEMANDPLAY; - } else - player_status = PLAYERSTATUS_STOP; - break; - case PLAYERSTATUS_PLAYEND: - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecFast; -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : PLAYEND\n"); -#endif - if(playermode & (PLAYERMODE_CONTINUE | PLAYERMODE_REVERSE)) { - if(IsPlayer1ProgressAblePlaylist(1)){ - PlayerProgressCur_pl(1); -// p = Player_progress_playlist(p,1); -// SetCur_pl(p); - PlayerPlaylistNum(); - player_status = PLAYERSTATUS_DEMANDPLAY; - } else if(!IsPlayer1ProgressAblePlaylist(-1)){ - player_status = PLAYERSTATUS_DEMANDPLAY; - } else - player_status = PLAYERSTATUS_STOP; - } else - player_status = PLAYERSTATUS_STOP; - /* - if(playermode & (PLAYERMODE_CONTINUE | PLAYERMODE_REVERSE)) - p = Player_progress_playlist(p,1); - if((p == cur_pl && AutoPlayNum >= 1)&& playermode & PLAYERMODE_SINGLE) - player_status = PLAYERSTATUS_STOP; - else - player_status = PLAYERSTATUS_DEMANDPLAY; - */ - break; - case PLAYERSTATUS_DEMANDPLAY: - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecFast; -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : DEMANDPLAY\n"); -#endif - AutoPlayNum++; - player_status = PLAYERSTATUS_PLAYSTART; - PlayerOnPlay(); - break; - case PLAYERSTATUS_QUIT: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : QUIT\n"); -#endif - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - AutoPlayNum = 0; - return; - case PLAYERSTATUS_STOP: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : STOP\n"); -#endif - if(!TmCanvasResetOK){ - PanelPartReset(); - TmCanvasReset(); - TmCanvasSet(); - TmCanvasUpdate(); - TmCanvasResetOK = 1; - } - if(!TmPanelResetOK){ - PanelPartReset(); - TmPanelPartReset(); - TmPanelSet(); - TmPanelUpdate(); - TmPanelResetOK = 1; - } - if(!MainWndScrollbarProgressResetOK){ - MainWndScrollbarProgressUpdate(); - MainWndScrollbarProgressResetOK = 1; - } - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - AutoPlayNum = 0; - break; - case PLAYERSTATUS_PLAYSTART: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : PLAYSTART\n"); -#endif - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - break; - case PLAYERSTATUS_PAUSE: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : PAUSE\n"); -#endif - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - break; - case PLAYERSTATUS_PLAY: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : PLAY\n"); -#endif - if(TmCanvasMode != TMCM_SLEEP){ - TmCanvasSet(); - TmCanvasResetOK = 0; - } - TmPanelSet(); - TmPanelResetOK = 0; - MainWndScrollbarProgressUpdate(); - MainWndScrollbarProgressResetOK = 0; - MainWndScrollbarVolumeUpdate(); - MainWndScrollbarVolumeResetOK = 0; - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecFast; - break; - case PLAYERSTATUS_ERROR: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : ERROR\n"); -#endif - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - break; - default: -#ifdef W32GUI_DEBUG1 - PrintfDebugWnd("PlayerLoop : default\n"); -#endif - PlayerLoopSleepTimeMsec = PlayerLoopSleepTimeMsecDefault; - break; - } - Sleep(PlayerLoopSleepTimeMsec); - } -} - - - - - - - - - - - - - -typedef volatile struct MIDIPLAYTHREAD_ { - HANDLE hThread; - DWORD dwThreadID; - int endflag; -} MIDIPLAYTHREAD; - -static MIDIPLAYTHREAD mMidiPlayThread[] = {{ 0, 0, 1 },{ 0, 0, 1 }}; -static volatile int CurMidiPlayThreadNum = 0; - -static MIDIPLAYTHREAD *GetCurMidiPlayThread(void) -{ - return (MIDIPLAYTHREAD *)&(mMidiPlayThread[CurMidiPlayThreadNum]); -} - -static MIDIPLAYTHREAD *GetNotCurMidiPlayThread(void) -{ - if(CurMidiPlayThreadNum == 0) - return (MIDIPLAYTHREAD *)&(mMidiPlayThread[1]); - else - return (MIDIPLAYTHREAD *)&(mMidiPlayThread[0]); -} - -static void ExchangeMidiPlayThread(void) -{ - if(CurMidiPlayThreadNum == 0) - CurMidiPlayThreadNum = 1; - else - CurMidiPlayThreadNum = 0; -} - -void MidiPlayThread(void *none); - -void PlayerOnStopEx(int rc) -{ - MIDIPLAYTHREAD *mpt; - if(rc == RC_QUIT || rc == RC_LOAD_FILE || rc == RC_REALLY_PREVIOUS || rc == RC_NEXT) - ; - else - rc = RC_LOAD_FILE; - PutCrbLoopBuffer(rc, 0); - mpt = GetCurMidiPlayThread(); - if(mpt->endflag) - player_status = PLAYERSTATUS_STOP; -} - -void PlayerOnStop(void) -{ - // PlayerOnStopEx(RC_QUIT); - PlayerOnStopEx(RC_LOAD_FILE); -} - -void PlayerOnPlayEx(int rc) -{ - MIDIPLAYTHREAD *mpt = GetNotCurMidiPlayThread(); -#if !(defined(__CYGWIN32__) || defined(__MINGW32__)) - SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE}; -#endif - - if(!mpt->endflag) - return; - mpt = GetCurMidiPlayThread(); - if(!mpt->endflag) - PlayerOnStopEx(rc); - mpt = GetNotCurMidiPlayThread(); - UpdateListWnd(); - -#if defined(__CYGWIN32__) || defined(__MINGW32__) - mpt->hThread = - CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE)MidiPlayThread, - NULL, 0, (LPDWORD)&mpt->dwThreadID); -#else - mpt->hThread = (HANDLE) _beginthreadNT - (MidiPlayThread,0,(void *)0,&sa,CREATE_SUSPENDED,&(mpt->dwThreadID)); -#endif - - mpt->endflag = 0; - ResumeThread(mpt->hThread); -} - -void PlayerOnKill(void) -{ - MIDIPLAYTHREAD *mpt; - mpt = GetNotCurMidiPlayThread(); - if(!mpt->endflag) - TerminateThread(mpt->hThread,0); - mpt = GetCurMidiPlayThread(); - if(!mpt->endflag) - TerminateThread(mpt->hThread,0); -} - -void PlayerCanselPause(void); -void PlayerOnPlay(void) -{ - MIDIPLAYTHREAD *mpt1; - MIDIPLAYTHREAD *mpt2; - if(player_status==PLAYERSTATUS_PLAY){ - PlayerCanselPause(); - } else { - mpt1 = GetCurMidiPlayThread(); - mpt2 = GetNotCurMidiPlayThread(); - if(mpt1->endflag || mpt2->endflag) - PlayerOnPlayEx(RC_LOAD_FILE); - } -} - -void PlayerOnQuit(void) -{ - DWORD dwRes; - MIDIPLAYTHREAD *mpt = GetCurMidiPlayThread(); - if(!mpt->endflag) - if(GetExitCodeThread(mpt->hThread,&dwRes)==STILL_ACTIVE) - ; - PlayerOnStop(); -} - -void PlayerOnNextPlay(void) -{ - if(cur_pl){ -// PLAYLIST *p = Player_progress_playlist(cur_pl,1);; -// SetCur_pl(p); - PlayerProgressCur_pl(1); - PlayerPlaylistNum(); - } - PlayerOnPlayEx(RC_NEXT); -} - -void PlayerOnPrevPlay(void) -{ - if(cur_pl){ -// PLAYLIST *p = Player_progress_playlist(cur_pl,-1);; -// SetCur_pl(p); - PlayerProgressCur_pl(-1); - PlayerPlaylistNum(); - } - PlayerOnPlayEx(RC_REALLY_PREVIOUS); -} - -static int PlayerOnPauseStatus = 0; -int PlayerOnPause(void) -{ - if(player_status==PLAYERSTATUS_PLAY){ - if(PlayerOnPauseStatus) - PlayerOnPauseStatus = 0; - else - PlayerOnPauseStatus = 1; - PutCrbLoopBuffer(RC_TOGGLE_PAUSE, 0); - } else - PlayerOnPauseStatus = 0; - return PlayerOnPauseStatus; -} - -void PlayerCanselPause(void) -{ - if(player_status==PLAYERSTATUS_PLAY){ - if(PlayerOnPauseStatus){ - PlayerOnPauseStatus = 0; - PutCrbLoopBuffer(RC_TOGGLE_PAUSE, 0); - } - } -} - -void PlayerOnPlayLoadFile(void) -{ - PlayerOnPlayEx(RC_LOAD_FILE); -} - -static int MainPlayThreadSleepTimeMsec = 200; -void MidiPlayThread(void *none) -{ - int rc; - MIDIPLAYTHREAD *mpt = GetNotCurMidiPlayThread(); -#ifdef W32GUI_DEBUG - PrintfDebugWnd("MidiPlayThread : Start.\n",rc); -#endif - mpt->endflag = 0; - if(cur_pl==NULL){ - player_status = PLAYERSTATUS_STOP; - mpt->endflag = 1; - return; - } - mpt = GetCurMidiPlayThread(); - while(!mpt->endflag){ - PlayerOnStop(); - Sleep(MainPlayThreadSleepTimeMsec); - } - Sleep(MainPlayThreadSleepTimeMsec); - player_status = PLAYERSTATUS_PLAYSTART; - ExchangeMidiPlayThread(); - InitCrbLoopBuffer(); - - if(target_play_mode) - playmidi_output_changed(2); - - if(play_mode->open_output() < 0){ - ctl->cmsg(CMSG_FATAL, VERB_NORMAL, - "Couldn't open %s (`%c')", - play_mode->id_name, play_mode->id_character); - player_status = PLAYERSTATUS_STOP; - } else { - extern void timidity_init_aq_buff(void); - aq_setup(); - timidity_init_aq_buff(); - - player_status = PLAYERSTATUS_PLAY; - PlayerCanselPause(); - PanelReset(); - TmCanvasReset(); - TmCanvasSet(); - TmPanelReset(); - TmPanelSet(); - rc = play_midi_file((char *)cur_pl->filename); - play_mode->close_output(); -#ifdef W32GUI_DEBUG - PrintfDebugWnd("MidiPlayThread : rc %d \n",rc); -#endif - switch(rc){ - case RC_ERROR: - player_status = PLAYERSTATUS_PLAYERROREND; - break; - case RC_LOAD_FILE: - case RC_QUIT: - player_status = PLAYERSTATUS_STOP; - break; - case RC_NEXT: - case RC_REALLY_PREVIOUS: - player_status = PLAYERSTATUS_STOP; - break; - default: - player_status = PLAYERSTATUS_PLAYEND; - break; - } - } - mpt = GetCurMidiPlayThread(); - mpt->endflag = 1; -#ifdef W32GUI_DEBUG - PrintfDebugWnd("MidiPlayThread : End.\n"); -#endif -#if defined(__CYGWIN32__) || defined(__MINGW32__) - ExitThread(0); -#else - _endthread(); -#endif -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#define CRBLOOPBUFFERMAX 64 -static CRBLOOPBUFFER CrbLoopBuffer[CRBLOOPBUFFERMAX]; -static int CrbLoopBuffer_first = 0; -static int CrbLoopBuffer_last = 0; - -static void InitCrbLoopBuffer(void) -{ - CrbLoopBuffer_first = 0; - CrbLoopBuffer_last = 0; -} - -static int LoopNum(int n, int digit) -{ - int ret = n; - for(;;){ - if(ret >= digit) ret -= digit; - else if(ret < 0) ret += digit; - else break; - } - return ret; -} - -static int IsRangeLoopNum(int n, int min, int max, int digit) -{ - int n_=LoopNum(n,digit),min_=LoopNum(min,digit),max_=LoopNum(max,digit),i; - if(min_==max_) - return (min_==n_)?1:0; - if(n_==min_ || n_==max_) - return 1; - for(i=n_;;i=LoopNum(i+1,digit)){ - if(i==max_) break; - if(i==min_) return 0; - } - for(i=n_;;i=LoopNum(i-1,digit)){ - if(i==min_) break; - if(i==max_) return 0; - } - return 1; -} - -// move n from start between min & max -static int MoveRangeLoopNum(int start, int n, int min, int max, int digit) -{ - int start_=LoopNum(start,digit); - int min_=LoopNum(min,digit),max_=LoopNum(max,digit); - int i; - if(!IsRangeLoopNum(start,min,max,digit)) - return -1; - if(n==0){ - return start_; - } else if(n>0){ - for(i=start_;n--;i=LoopNum(i+1,digit)) - if(i== max_) - break; - } else if(n<0){ - for(i=start_;n++;i=LoopNum(i-1,digit)) - if(i== min_) - break; - } - return i; -} - -static int CrbLoopNum(int n) -{ - return LoopNum(n,CRBLOOPBUFFERMAX); -} - -#if 0 /* not used */ -static int CrbIsRangeLoopNum(int n, int min, int max) -{ - return IsRangeLoopNum(n, min, max, CRBLOOPBUFFERMAX); -} -#endif - -static int CrbMoveRangeLoopNum(int start, int n, int min, int max) -{ - return MoveRangeLoopNum(start,n,min,max,CRBLOOPBUFFERMAX); -} - -static CRBLOOPBUFFER *ScanCrbLoopBuffer(int n) -{ - // n is - // -1 : last, -2 : before last, ... , ? : first - // 1 : first, 2 : next, ... , ? : last - int start,i; - if(n==0) - return NULL; - if(n>0){ - start = CrbLoopBuffer_first; - n--; - } else { - start = CrbLoopBuffer_last; - n++; - } - i = CrbMoveRangeLoopNum(start,n,CrbLoopBuffer_first,CrbLoopBuffer_last); - return (CRBLOOPBUFFER *)&(CrbLoopBuffer[i]); -} - -CRBLOOPBUFFER *GetCrbLoopBuffer(void) -{ - CRBLOOPBUFFER *ret; - if(CrbLoopBuffer_first==CrbLoopBuffer_last) - return NULL; - ret = ScanCrbLoopBuffer(2); - CrbLoopBuffer_first = CrbLoopNum(CrbLoopBuffer_first+1); - return ret; -} - -static void CheckCrbLoopBuffer(void); - -void PutCrbLoopBuffer(int cmd, int32 val) -{ - CRBLOOPBUFFER *b; - if(CrbLoopNum(CrbLoopBuffer_last+1)==CrbLoopBuffer_first){ - CrbLoopBuffer_last = CrbLoopNum(CrbLoopBuffer_last+1); - CrbLoopBuffer_first = CrbLoopNum(CrbLoopBuffer_first+1); - } else - CrbLoopBuffer_last = CrbLoopNum(CrbLoopBuffer_last+1); - b = ScanCrbLoopBuffer(-1); - b->cmd = cmd; - b->val = val; - CheckCrbLoopBuffer(); -} - -static int CrbLoopBufferLength(void) -{ - int i = CrbLoopBuffer_last - CrbLoopBuffer_first; - if(i>=0) - return i; - else - return CrbLoopNum(i + CRBLOOPBUFFERMAX); -} - -static void CheckCrbLoopBuffer(void) -{ - CRBLOOPBUFFER *b; - int i; - int len = CrbLoopBufferLength(); - for(i = -1;i >= -len;i--){ - b = ScanCrbLoopBuffer(i); - if(b->cmd == RC_QUIT){ - CrbLoopBuffer_last = CrbLoopNum(CrbLoopBuffer_last+i+1); - CrbLoopBuffer_first = CrbLoopNum(CrbLoopBuffer_last-1); - return; - } - } - for(i = -1;i >= -len;i--){ - b = ScanCrbLoopBuffer(i); - if(b->cmd == RC_CONTROL_CLEAR){ - CrbLoopBuffer_first = CrbLoopNum(CrbLoopBuffer_last+i+1); - return; - } - if(b->cmd == RC_NEXT || b->cmd == RC_PREVIOUS || b->cmd == RC_TOGGLE_PAUSE - || b->cmd == RC_CONTINUE || b->cmd == RC_REALLY_PREVIOUS || b->cmd == RC_RESTART - || b->cmd == RC_RELOAD || b->cmd == RC_LOAD_FILE){ - CrbLoopBuffer_last = CrbLoopNum(CrbLoopBuffer_last+i+1); - CrbLoopBuffer_first = CrbLoopNum(CrbLoopBuffer_last-1); - return; - } - } -} - - - +int w32g_play_active; +int w32g_current_volume[MAX_CHANNELS]; +int w32g_current_expression[MAX_CHANNELS]; +static int mark_apply_setting = 0; @@ -1033,7 +62,6 @@ static void ctl_pass_playing_list(int number_of_files, char *list_of_files[]); static void ctl_event(CtlEvent *e); static int ctl_read(int32 *valp); -static void ctl_current_time(int secs, int nvoices); static int cmsg(int type, int verbosity_level, char *fmt, ...); #define ctl w32gui_control_mode @@ -1041,8 +69,8 @@ ControlMode ctl= { "Win32 GUI interface", 'w', - 1,1,0, - 0, + 1,0,0, + CTLF_AUTOSTART | CTLF_LIST_LOOP, ctl_open, ctl_close, ctl_pass_playing_list, @@ -1051,434 +79,317 @@ ctl_event }; -PanelInfo *Panel = NULL; -/* -volatile static int PanelFlag = 0; -#define PANEL_BEGIN() {while(PanelFlag); PanelFlag = 1;} -#define PANEL_END() {PanelFlag = 0;} -*/ -static HANDLE hPanelSemaphore = NULL; -#define PANEL_BEGIN() WaitForSingleObject(hPanelSemaphore, INFINITE) -#define PANEL_END() ReleaseSemaphore(hPanelSemaphore, 1, NULL) - -static void ctl_refresh(void) -{ -} - -static void ctl_total_time(int tt) -{ - int32 centisecs = tt/(play_mode->rate/100); - PANEL_BEGIN(); - Panel->total_time = centisecs; - Panel->total_time_h = centisecs/100/60/60; - centisecs %= 100*60*60; - Panel->total_time_m = centisecs/100/60; - centisecs %= 100*60; - Panel->total_time_s = centisecs/100; - centisecs %= 100; - Panel->total_time_ss = centisecs; - PANEL_END(); - ctl_current_time(0, 0); -} - -static void ctl_master_volume(int mv) +static int ctl_open(int using_stdin, int using_stdout) { - PANEL_BEGIN(); - Panel->master_volume = mv; - PANEL_END(); + ctl.opened = 1; + return w32g_open(); } -static void ctl_file_name(char *name) +static void ctl_close(void) { - strncpy((char *)Panel->filename,name,MAXPATH); - PANEL_BEGIN(); - Panel->filename[MAXPATH] = '\0'; - PANEL_END(); + if(ctl.opened) + { + w32g_close(); + ctl.opened = 0; + } } -#if 0 /* not used */ -static void pseudo_ctl_voices(int x) -{ - int v = 0, i; - for(i = 0; i < upper_voices; i++) - if(voice[i].status != VOICE_FREE) - v++; - PANEL_BEGIN(); - Panel->cur_voices = v; - Panel->voices = voices; - Panel->upper_voices = upper_voices; - PANEL_END(); -} -#endif -static void ctl_current_time(int secs, int nvoices) +static int ctl_drop_file(HDROP hDrop) { - int32 centisecs = secs * 100; - - PANEL_BEGIN(); - Panel->cur_time = centisecs; - Panel->cur_time_h = centisecs/100/60/60; - centisecs %= 100*60*60; - Panel->cur_time_m = centisecs/100/60; - centisecs %= 100*60; - Panel->cur_time_s = centisecs/100; - centisecs %= 100; - Panel->cur_time_ss = centisecs; - Panel->cur_voices = nvoices; - PANEL_END(); -// pseudo_ctl_voices(0); -} + StringTable st; + int i, n, len; + char buffer[BUFSIZ]; + char **files; -static void ctl_channel_note(int ch, int note, int vel) -{ - PANEL_BEGIN(); - if (vel == 0) { - if (note == Panel->cnote[ch]) - Panel->v_flags[ch] = FLAG_NOTE_OFF; - Panel->cvel[ch] = 0; - } else if (vel > Panel->cvel[ch]) { - Panel->cvel[ch] = vel; - Panel->cnote[ch] = note; - Panel->ctotal[ch] = vel * Panel->channel[ch].volume * - Panel->channel[ch].expression / (127*127); - Panel->v_flags[ch] = FLAG_NOTE_ON; + init_string_table(&st); + n = DragQueryFile(hDrop,0xffffffffL, NULL, 0); + for(i = 0; i < n; i++) + { + DragQueryFile(hDrop, i, buffer, sizeof(buffer)); + if(is_directory(buffer)) + directory_form(buffer); + len = strlen(buffer); + put_string_table(&st, buffer, strlen(buffer)); } - PANEL_END(); -} + DragFinish(hDrop); -static void ctl_note(int status, int ch, int note, int vel) -{ - if(!ctl.trace_playing) - return; - if(ch < 0 || ch >= MAX_W32G_MIDI_CHANNELS) - return; - - if(status != VOICE_ON) - vel = 0; - - PANEL_BEGIN(); - switch(status) + files = make_string_array(&st); + if(files != NULL) { - case VOICE_DIE: - case VOICE_FREE: - case VOICE_OFF: - case VOICE_SUSTAINED: { - int32 n = note; - int32 i = 0; - if(n<0) n = 0; - if(n>127) n = 127; - while(n >= 32) - { - n -= 32; - i++; - } - Panel->xnote[ch][i] &= ~(((int32)1) << n); - } - break; - case VOICE_ON: { - int n = note; - int i = 0; - if(n<0) n = 0; - if(n>127) n = 127; - while(n >= 32) - { - n -= 32; - i++; - } - Panel->xnote[ch][i] |= ((int32)1) << n; - } - break; + w32g_add_playlist(n, files, 1); + free(files[0]); + free(files); } - PANEL_END(); - ctl_channel_note(ch, note, vel); -} - -static void ctl_program(int ch, int val) -{ - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - if (ch < 0 || ch >= MAX_W32G_MIDI_CHANNELS) return; - if(channel[ch].special_sample) - val = channel[ch].special_sample; - else - val += progbase; - - PANEL_BEGIN(); - Panel->channel[ch].program = val; - Panel->c_flags[ch] |= FLAG_PROG; - PANEL_END(); -} - -static void ctl_volume(int ch, int val) -{ - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - - PANEL_BEGIN(); - Panel->channel[ch].volume = val; - PANEL_END(); - ctl_channel_note(ch, Panel->cnote[ch], Panel->cvel[ch]); -} - -static void ctl_expression(int ch, int val) -{ - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - - PANEL_BEGIN(); - Panel->channel[ch].expression = val; - PANEL_END(); - ctl_channel_note(ch, Panel->cnote[ch], Panel->cvel[ch]); + w32g_update_playlist(); + if(n > 0) + TmPanelUpdateList(); + return RC_NONE; } -static void ctl_panning(int ch, int val) +static int ctl_load_file(char *fileptr) { - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - - PANEL_BEGIN(); - Panel->channel[ch].panning = val; - Panel->c_flags[ch] |= FLAG_PAN; - PANEL_END(); -} + StringTable st; + int len, n; + char **files; + char buffer[BUFSIZ]; + char *basedir; -static void ctl_sustain(int ch, int val) -{ - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - - PANEL_BEGIN(); - Panel->channel[ch].sustain = val; - Panel->c_flags[ch] |= FLAG_SUST; - PANEL_END(); -} + for(n = 0; n < 100; n++) { + if(fileptr[n] == '\0') + printf(""); + else + printf("%c", fileptr[n]); + } + printf("\n");fflush(stdout); + + init_string_table(&st); + n = 0; + basedir = fileptr; + fileptr += strlen(fileptr) + 1; + while(*fileptr) + { + snprintf(buffer, sizeof(buffer), "%s\\%s", basedir, fileptr); + if(is_directory(buffer)) + directory_form(buffer); + len = strlen(buffer); + put_string_table(&st, buffer, len); + n++; + fileptr += strlen(fileptr) + 1; + } -/*ARGSUSED*/ -static void ctl_pitch_bend(int channel, int val) -{ - /* - if(ch >= MAX_W32G_MIDI_CHANNELS) - return; - if (!ctl.trace_playing) - return; - semaphore_P(semid); - Panel->channel[ch].pitch_bend = val; - Panel->c_flags[ch] |= FLAG_BENDT; - semaphore_V(semid); - */ -} + if(n == 0) + { + put_string_table(&st, basedir, strlen(basedir)); + n++; + } -static void ctl_lyric(uint16 lyricid) -{ - default_ctl_lyric(lyricid); + files = make_string_array(&st); + if(files != NULL) + { + w32g_add_playlist(n, files, 1); + free(files[0]); + free(files); + } + w32g_update_playlist(); + if(n > 0) + TmPanelUpdateList(); + w32g_lock_open_file = 0; + return RC_NONE; } - -static void ctl_reset(void) +static int ctl_delete_playlist(int offset) { - int i; - - InitCrbLoopBuffer(); + int selected, nfiles, cur, pos; - if (!ctl.trace_playing) - return; - - while(Panel->wait_reset) - VOLATILE_TOUCH(Panel->wait_reset); - - Panel->wait_reset = 1; - for (i = 0; i < MAX_W32G_MIDI_CHANNELS; i++) { - if(ISDRUMCHANNEL(i)) - ctl_program(i, channel[i].bank); - else - ctl_program(i, channel[i].program); - ctl_volume(i, channel[i].volume); - ctl_expression(i, channel[i].expression); - ctl_panning(i, channel[i].panning); - ctl_sustain(i, channel[i].sustain); - if(channel[i].pitchbend == 0x2000 && - channel[i].modulation_wheel > 0) - ctl_pitch_bend(i, -1); - else - ctl_pitch_bend(i, channel[i].pitchbend); - ctl_channel_note(i, Panel->cnote[i], 0); - } - Panel->wait_reset = 0; -} - -void panel_init(void); - -static int ctl_open(int using_stdin, int using_stdout) -{ - InitCrbLoopBuffer(); - panel_init(); - ctl.opened=1; - return 0; + w32g_get_playlist_index(&selected, &nfiles, &cur); + pos = cur + offset; + if(pos < 0 || pos >= nfiles) + return RC_NONE; + w32g_delete_playlist(pos); + if(w32g_play_active && selected == pos) + return RC_LOAD_FILE; + return RC_NONE; } -static void ctl_close(void) +static int w32g_ext_control(int rc, int32 value) { - InitCrbLoopBuffer(); - if (ctl.opened) { - ctl.opened=0; - } - if(hPanelSemaphore!=NULL) - CloseHandle(hPanelSemaphore); - return; + switch(rc) + { + case RC_EXT_DROP: + return ctl_drop_file((HDROP)value); + case RC_EXT_LOAD_FILE: + return ctl_load_file((char *)value); + case RC_EXT_MODE_CHANGE: + return TmCanvasChange(); + case RC_EXT_APPLY_SETTING: + if(w32g_play_active) { + mark_apply_setting = 1; + return RC_STOP; + } + SettingWndApply(); + mark_apply_setting = 0; + return RC_NONE; + case RC_EXT_DELETE_PLAYLIST: + rc = ctl_delete_playlist(value); + TmPanelUpdateList(); + return rc; + } + return RC_NONE; } static int ctl_read(int32 *valp) { - CRBLOOPBUFFER *b; - if((b = GetCrbLoopBuffer()) == NULL) - return RC_NONE; - *valp = b->val; - return b->cmd; + int rc; + + rc = w32g_get_rc(valp, 0); + if(rc >= RC_EXT_BASE) + return w32g_ext_control(rc, *valp); + return rc; } static int cmsg(int type, int verbosity_level, char *fmt, ...) { - char buffer[10240]; - va_list ap; - va_start(ap, fmt); - vsprintf(buffer,fmt,ap); - va_end(ap); - -//printf("##cmsg<%s>\n", buffer); fflush(stdout); - -#ifdef W32GUI_DEBUG3 - PutsDebugWnd(buffer); - PutsDebugWnd("\n"); -#endif - - if ((type==CMSG_TEXT || type==CMSG_INFO || type==CMSG_WARNING) && - ctl.verbosityreset_panel = 0; - Panel->multi_part = 0; - Panel->wait_reset = 0; - Panel->cur_time = 0; - Panel->cur_time_h = 0; - Panel->cur_time_m = 0; - Panel->cur_time_s = 0; - Panel->cur_time_ss = 0; - for(i=0;iv_flags[i] = 0; - Panel->cnote[i] = 0; - Panel->cvel[i] = 0; - Panel->ctotal[i] = 0; - Panel->c_flags[i] = 0; - for(j=0;j<4;j++) - Panel->xnote[i][j] = 0; - } - Panel->titlename[0] = '\0'; - Panel->filename[0] = '\0'; - Panel->titlename_setflag = 0; - Panel->filename_setflag = 0; - Panel->cur_voices = 0; - Panel->voices = 0; - Panel->upper_voices = 0; - Panel->master_volume = 0; - PANEL_END(); -} - -void PanelReset(void) -{ - int i,j; - PANEL_BEGIN(); - Panel->reset_panel = 0; - Panel->multi_part = 0; - Panel->wait_reset = 0; - Panel->cur_time = 0; - Panel->cur_time_h = 0; - Panel->cur_time_m = 0; - Panel->cur_time_s = 0; - Panel->cur_time_ss = 0; - for(i=0;iv_flags[i] = 0; - Panel->cnote[i] = 0; - Panel->cvel[i] = 0; - Panel->ctotal[i] = 0; - Panel->c_flags[i] = 0; - for(j=0;j<4;j++) - Panel->xnote[i][j] = 0; - } - Panel->titlename[0] = '\0'; - Panel->filename[0] = '\0'; - Panel->titlename_setflag = 0; - Panel->filename_setflag = 0; - Panel->cur_voices = 0; - // Panel->voices = 0; - Panel->upper_voices = 0; - // Panel->master_volume = 0; - PANEL_END(); -} + if(w32g_valid_playlist() && (ctl.flags & CTLF_AUTOSTART)) + rc = RC_LOAD_FILE; + else + rc = RC_NONE; -void PanelPartReset(void) -{ - int i,j; - PANEL_BEGIN(); - Panel->reset_panel = 0; - Panel->multi_part = 0; - Panel->wait_reset = 0; - Panel->cur_time = 0; - Panel->cur_time_h = 0; - Panel->cur_time_m = 0; - Panel->cur_time_s = 0; - Panel->cur_time_ss = 0; - for(i=0;iv_flags[i] = 0; - Panel->cnote[i] = 0; - Panel->cvel[i] = 0; - Panel->ctotal[i] = 0; - Panel->c_flags[i] = 0; - for(j=0;j<4;j++) - Panel->xnote[i][j] = 0; - } - Panel->cur_voices = 0; - // Panel->voices = 0; - Panel->upper_voices = 0; - // Panel->master_volume = 0; - PANEL_END(); -} + while(1) + { + if(rc == RC_NONE) + { + if(play_mode->fd != -1) + { + aq_flush(1); + play_mode->close_output(); + TmCanvasReset(); + } + rc = w32g_get_rc(&value, 1); + } -void panel_init(void) -{ - if(hPanelSemaphore==NULL) - hPanelSemaphore = CreateSemaphore(NULL, 1, 1, "TiMidityPanelSemaphore"); - PANEL_BEGIN(); - if(Panel==NULL){ - Panel = (PanelInfo *)safe_malloc(sizeof(PanelInfo)); - memset((void *)Panel,0,sizeof(PanelInfo)); + redo: + switch(rc) + { + case RC_NONE: + Sleep(1000); + break; + + case RC_LOAD_FILE: /* Play playlist.selected */ + if(w32g_valid_playlist()) + { + w32g_play_active = 1; + if(play_mode->fd == -1) + { + int err; + if(play_mode->open_output() == -1) + { + ctl.cmsg(CMSG_FATAL, VERB_NORMAL, + "Couldn't open %s (`%c') %s", + play_mode->id_name, + play_mode->id_character, + play_mode->name ? play_mode->name : ""); + break; + } + aq_setup(); + timidity_init_aq_buff(); + } + w32g_setcur_playlist(); + rc = play_midi_file(w32g_curr_playlist()); + if(rc == RC_ERROR) + errcnt++; + else + errcnt = 0; + if(errcnt == 10) + { + w32g_msg_box("Too many MIDI files are error", + "TiMidity Warning", MB_OK); + errcnt = 0; + break; + } + w32g_play_active = 0; + goto redo; + } + break; + + case RC_ERROR: + case RC_TUNE_END: + if(play_mode->id_character != 'd') + break; + /* FALLTHROUGH */ + case RC_NEXT: + if(!w32g_valid_playlist()) + break; + if(w32g_next_playlist()) + { + rc = RC_LOAD_FILE; + goto redo; + } + else + { + /* end of list */ + if((ctl.flags & CTLF_AUTOEXIT) && w32g_valid_playlist()) + return; + if((ctl.flags & CTLF_LIST_LOOP) && w32g_valid_playlist()) + { + w32g_first_playlist(); + rc = RC_LOAD_FILE; + goto redo; + } + } + break; + + case RC_REALLY_PREVIOUS: + if(w32g_prev_playlist()) + { + rc = RC_LOAD_FILE; + goto redo; + } + break; + + case RC_QUIT: + return; + + case RC_CHANGE_VOLUME: + amplification += value; + TmPanelSetMasterVol(amplification); + TmPanelRefresh(); + break; + + case RC_TOGGLE_PAUSE: + play_pause_flag = !play_pause_flag; + + default: + if(rc >= RC_EXT_BASE) + { + int load; + if((rc == RC_EXT_DROP || rc == RC_EXT_LOAD_FILE) && + w32g_isempty_playlist() && + (ctl.flags & CTLF_AUTOSTART)) + load = 1; + else + load = 0; + w32g_ext_control(rc, value); + if(load) + { + rc = RC_LOAD_FILE; + goto redo; + } + } + break; } - PANEL_END(); - PanelFullReset(); + + if(mark_apply_setting) + SettingWndApply(); + rc = RC_NONE; + } } static void ctl_event(CtlEvent *e) @@ -1486,65 +397,88 @@ switch(e->type) { case CTLE_NOW_LOADING: - ctl_file_name((char *)e->v1); + TmPanelStartToLoad((char *)e->v1); break; case CTLE_LOADING_DONE: break; case CTLE_PLAY_START: - ctl_total_time((int)e->v1); + TmPanelStartToPlay((int)e->v1 / play_mode->rate); + w32g_ctle_play_start((int)e->v1 / play_mode->rate); break; case CTLE_PLAY_END: + MainWndScrollbarProgressUpdate(-1); break; case CTLE_TEMPO: break; case CTLE_METRONOME: -// update_indicator(); break; - case CTLE_CURRENT_TIME: - ctl_current_time((int)e->v1, (int)e->v2); -// display_aq_ratio(); + case CTLE_CURRENT_TIME: { + int sec; + if(midi_trace.flush_flag) + return; + if(ctl.trace_playing) + sec = (int)e->v1; + else + { + sec = current_trace_samples(); + if(sec < 0) + sec = (int)e->v1; + else + sec = sec / play_mode->rate; + } + MainWndScrollbarProgressUpdate(sec); + TmPanelSetVoices((int)e->v2); + TmPanelSetTime(sec); + } break; case CTLE_NOTE: - ctl_note((int)e->v1, (int)e->v2, (int)e->v3, (int)e->v4); + TmCanvasNote((int)e->v1, (int)e->v2, (int)e->v3, (int)e->v4); break; case CTLE_MASTER_VOLUME: - ctl_master_volume((int)e->v1); + TmPanelSetMasterVol((int)e->v1); + if(play_pause_flag) + TmPanelRefresh(); break; case CTLE_PROGRAM: - ctl_program((int)e->v1, (int)e->v2); break; case CTLE_VOLUME: - ctl_volume((int)e->v1, (int)e->v2); + if(e->v1 < MAX_CHANNELS) + w32g_current_volume[e->v1] = e->v2; break; case CTLE_EXPRESSION: - ctl_expression((int)e->v1, (int)e->v2); + if(e->v1 < MAX_CHANNELS) + w32g_current_expression[e->v1] = e->v2; break; case CTLE_PANNING: - ctl_panning((int)e->v1, (int)e->v2); break; case CTLE_SUSTAIN: - ctl_sustain((int)e->v1, (int)e->v2); break; case CTLE_PITCH_BEND: - ctl_pitch_bend((int)e->v1, (int)e->v2); break; case CTLE_MOD_WHEEL: - ctl_pitch_bend((int)e->v1, (int)e->v2); break; case CTLE_CHORUS_EFFECT: break; case CTLE_REVERB_EFFECT: break; case CTLE_LYRIC: - ctl_lyric((int)e->v1); + default_ctl_lyric((uint16)e->v1); break; case CTLE_REFRESH: - ctl_refresh(); + TmPanelRefresh(); + TmCanvasRefresh(); break; case CTLE_RESET: - ctl_reset(); + TmCanvasReset(); break; case CTLE_SPEANA: break; + case CTLE_PAUSE: + if(w32g_play_active) + { + MainWndScrollbarProgressUpdate((int)e->v2); + TmPanelSetTime((int)e->v2); + TmPanelRefresh(); + } } } diff -ruN TiMidity++-2.2.0/interface/w32g_c.h TiMidity++-2.3.0/interface/w32g_c.h --- TiMidity++-2.2.0/interface/w32g_c.h Wed Mar 24 01:59:43 1999 +++ TiMidity++-2.3.0/interface/w32g_c.h Thu Jan 1 09:00:00 1970 @@ -1,108 +0,0 @@ -#ifndef ___W32G_C_H_ -#define ___W32G_C_H_ - - -#define PLAYERSTATUS_NONE 0x0000 -#define PLAYERSTATUS_STOP 0x0001 -#define PLAYERSTATUS_PAUSE 0x0002 -#define PLAYERSTATUS_PLAY 0x0003 -#define PLAYERSTATUS_PLAYSTART 0x0004 -#define PLAYERSTATUS_DEMANDPLAY 0x0005 -#define PLAYERSTATUS_PLAYEND 0x0006 -#define PLAYERSTATUS_PLAYERROREND 0x0007 -#define PLAYERSTATUS_QUIT 0x0008 -#define PLAYERSTATUS_ERROR 0x0009 - -extern volatile int player_status; - -void PlayerOnPlay(void); -void PlayerOnQuit(void); -void PlayerOnStop(void); -void PlayerOnNextPlay(void); -void PlayerOnPrevPlay(void); -void PlayerOnPlayLoadFile(void); -int PlayerOnPause(void); -void PlayerOnKill(void); -void PlayerPlaylistNum(void); -PLAYLIST *PlayerPlaylistAddFilename(char *filename); -PLAYLIST *PlayerPlaylistAddExpandFileArchives(char *filename); -PLAYLIST *PlayerPlaylistAddFiles(int nfiles, char **files, int expand_file_archives_flag); -PLAYLIST *PlayerPlaylistAddDropfiles(HDROP hDrop); -PLAYLIST *PlayerPlaylistAddDropfilesEx(HDROP hDrop, int expand_file_archives_flag); - -void LockPlaylist(void); -void UnLockPlaylist(void); -void SetCur_pl(PLAYLIST *pl); -void SetCur_plNum(int num); - -extern PLAYLIST *playlist, *old_playlist, *history_playList; -extern PLAYLIST *cur_pl; -extern int cur_pl_num; -extern int playlist_num; - -#define CTLREADBUFFERMAX 128 -typedef struct CRBLOOPBUFFER_ { - int cmd; - int32 val; -} CRBLOOPBUFFER; - -void PutCrbLoopBuffer(int cmd, int32 val); -CRBLOOPBUFFER *GetCrbLoopBuffer(void); - -#define MAX_W32G_MIDI_CHANNELS 32 - -#define FLAG_NOTE_OFF 1 -#define FLAG_NOTE_ON 2 - -#define FLAG_BANK 0x0001 -#define FLAG_PROG 0x0002 -#define FLAG_PAN 0x0004 -#define FLAG_SUST 0x0008 - -typedef struct { - int reset_panel; - int wait_reset; - int multi_part; - - char v_flags[MAX_W32G_MIDI_CHANNELS]; - int16 cnote[MAX_W32G_MIDI_CHANNELS]; - int16 cvel[MAX_W32G_MIDI_CHANNELS]; - int16 ctotal[MAX_W32G_MIDI_CHANNELS]; - char c_flags[MAX_W32G_MIDI_CHANNELS]; - Channel channel[MAX_W32G_MIDI_CHANNELS]; - - int32 total_time; - int total_time_h; - int total_time_m; - int total_time_s; - int total_time_ss; - int32 cur_time; - int cur_time_h; - int cur_time_m; - int cur_time_s; - int cur_time_ss; - int cur_voices; - int voices; - int upper_voices; - char filename[MAXPATH + 64]; - char titlename[MAXPATH + 64]; - int filename_setflag; - int titlename_setflag; - int32 master_volume; - int32 master_volume_max; - int invalid_flag; - - int32 xnote[MAX_W32G_MIDI_CHANNELS][4]; - - char dummy[1024]; -} VOLATILE PanelInfo; - -extern PanelInfo *Panel; - -void PanelReset(void); -void PanelPartReset(void); - -extern void Player_loop(int init_flag); -extern void PlayerOnPlayEx(int rc); - -#endif /* ___W32G_C_H_ */ diff -ruN TiMidity++-2.2.0/interface/w32g_canvas.c TiMidity++-2.3.0/interface/w32g_canvas.c --- TiMidity++-2.2.0/interface/w32g_canvas.c Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.3.0/interface/w32g_canvas.c Sun Aug 1 00:39:02 1999 @@ -0,0 +1,562 @@ +/* + TiMidity++ -- MIDI to WAVE converter and player + Copyright (C) 1999 Masanao Izumo + Copyright (C) 1995 Tuukka Toivonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + w32g_i.c: by Daisuke Aoki + Masanao Izumo +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ +#include +#include +#include +#include "timidity.h" +#include "common.h" +#include "instrum.h" +#include "playmidi.h" +#include "readmidi.h" +#include "controls.h" +#include "timer.h" +#include "bitset.h" + +#include "w32g.h" +#include "w32g_res.h" + +#define TCTM_MAX_CHANNELS 16 +#define BITMAP_SLEEP_SIZEX 96 +#define BITMAP_SLEEP_SIZEY 64 + +#define TM_CANVAS_XMAX 160 +#define TM_CANVAS_YMAX 160 +#define TM_CANVASMAP_XMAX 16 +#define TM_CANVASMAP_YMAX 16 +#define TM_SEC_PER_BOX 0.05 + +#define TM_DISPLAY_SKEYS 24 /* Display Start KEY */ +#define TM_DISPLAY_NKEYS 96 /* Display Number of KEY */ + +static struct +{ + HWND hwnd; + HWND hParentWnd; + HDC hdc; + HDC hmdc; + HBITMAP hbitmap; + HBITMAP hSleepBitmap; + + RECT rcMe; // Whole window region + RECT rcDr; // Update rectangle region + + // margin + int left; + int top; + int right; + int bottom; + + // bar box size. + int rectx; + int recty; + int spacex; + int spacey; + + char bar[TCTM_MAX_CHANNELS]; + char bar_old[TCTM_MAX_CHANNELS]; + double bar_alive_time[TCTM_MAX_CHANNELS]; /* 0..0.8 */ + double last_bar_time; + uint8 xnote[TCTM_MAX_CHANNELS][TM_DISPLAY_NKEYS/8]; + Bitset channel_on_flags[TCTM_MAX_CHANNELS]; +} TmCanvas; + +static int TmCanvasMode = TMCM_SLEEP; + +static HWND hCanvasWnd; +static char CanvasWndClassName[] = "TiMidity Canvas"; +static LRESULT CALLBACK CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static void TmCanvasInit(HWND hwnd); +static void TmCanvasEnd(HWND hwnd); +static void TmCanvasRepaint(HWND hwnd); +static void TmCanvasFillRect(RECT *r, COLORREF c); +static HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; + +void w32g_init_canvas(HWND hwnd) +{ + WNDCLASS wndclass ; + hCanvasWnd = 0; + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wndclass.lpfnWndProc = CanvasWndProc ; + wndclass.cbClsExtra = 0 ; + wndclass.cbWndExtra = 0 ; + wndclass.hInstance = hInst ; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor(0,IDC_ARROW) ; + wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = CanvasWndClassName; + RegisterClass(&wndclass); + while(hCanvasWnd==0){ + hCanvasWnd = CreateWindowEx(0,CanvasWndClassName,0, + WS_CHILD, + CW_USEDEFAULT,0,TM_CANVAS_XMAX,TM_CANVAS_YMAX,GetDlgItem(hwnd,IDC_RECT_CANVAS),0,hInst,0); + } + ShowWindow(hCanvasWnd,SW_SHOW); + UpdateWindow(hCanvasWnd); +} + +static LRESULT CALLBACK +CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + switch (uMess) + { + case WM_CREATE: + TmCanvasInit(hwnd); + break; + case WM_DESTROY: + TmCanvasEnd(hwnd); + break; + case WM_PAINT: + TmCanvasRepaint(hwnd); + return 0; + case WM_LBUTTONDBLCLK: + w32g_send_rc(RC_EXT_MODE_CHANGE, 0); + break; + default: + return DefWindowProc(hwnd,uMess,wParam,lParam) ; + } + return 0L; +} + +static void TmCanvasInit(HWND hwnd) +{ + RECT rc; + int i; + + TmCanvas.hwnd = hwnd; + TmCanvas.hParentWnd = GetParent(TmCanvas.hwnd); + GetClientRect(TmCanvas.hParentWnd,&rc); + TmCanvas.rcMe = rc; + MoveWindow(TmCanvas.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE); + TmCanvas.left = 3; + TmCanvas.top = 2; + TmCanvas.right = 64; + TmCanvas.bottom = 64; + TmCanvas.rectx = 5; + TmCanvas.recty = 2; + TmCanvas.spacex = 1; + TmCanvas.spacey = 1; + TmCanvas.hdc = GetDC(TmCanvas.hwnd); + TmCanvas.hbitmap = CreateCompatibleBitmap(TmCanvas.hdc, + TM_CANVAS_XMAX, TM_CANVAS_YMAX); + TmCanvas.hmdc = CreateCompatibleDC(TmCanvas.hdc); + SelectObject(TmCanvas.hmdc,TmCanvas.hbitmap); + TmCanvas.hSleepBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_SLEEP)); + for(i = 0; i < TCTM_MAX_CHANNELS; i++) + init_bitset(&TmCanvas.channel_on_flags[i], 128); + TmCanvasReset(); +} + +static void TmCanvasEnd(HWND hwnd) +{ + ReleaseDC(TmCanvas.hwnd, TmCanvas.hdc); + TmCanvas.hdc = 0; +} + +static void TmCanvasRepaint(HWND hwnd) +{ + HDC hdc; + PAINTSTRUCT ps; + + if(!TmCanvas.hdc) + return; + + hdc = BeginPaint(TmCanvas.hwnd, &ps); + BitBltRect(hdc, TmCanvas.hmdc, &ps.rcPaint); + EndPaint(TmCanvas.hwnd, &ps); +} + +static void TmAddRedrawRect(int x, int y, int width, int height) +{ + int x2, y2; + + x2 = x + width; + y2 = y + height; + if(TmCanvas.rcDr.left == ~0L) + { + TmCanvas.rcDr.left = x; + TmCanvas.rcDr.top = y; + TmCanvas.rcDr.right = x2; + TmCanvas.rcDr.bottom = y2; + } + else + { + if(TmCanvas.rcDr.left > x) + TmCanvas.rcDr.left = x; + if(TmCanvas.rcDr.top > y) + TmCanvas.rcDr.top = y; + if(TmCanvas.rcDr.right < x2) + TmCanvas.rcDr.right = x2; + if(TmCanvas.rcDr.bottom < y2) + TmCanvas.rcDr.bottom = y2; + } +} + +static void TmCanvasResetChannelMode(void) +{ + int i, j, x, y; + HPEN pen; + HBRUSH brush; + + pen = tm_colors[TMCC_BACK].pen; + brush = tm_colors[TMCC_BACK].brush; + hgdiobj_hpen = SelectObject(TmCanvas.hmdc, pen); + hgdiobj_hbrush = SelectObject(TmCanvas.hmdc, brush); + + Rectangle(TmCanvas.hmdc, + TmCanvas.rcMe.left, TmCanvas.rcMe.top, + TmCanvas.rcMe.right, TmCanvas.rcMe.bottom); + + pen = tm_colors[TMCC_FORE_HALF].pen; + brush = tm_colors[TMCC_FORE_HALF].brush; + SelectObject(TmCanvas.hmdc, pen); + SelectObject(TmCanvas.hmdc, brush); + + for(j = 0; j < TM_CANVASMAP_YMAX; j++) + { + for(i = 0; i < TM_CANVASMAP_XMAX; i++) + { + x = TmCanvas.left + (TmCanvas.rectx + TmCanvas.spacex) * i; + y = TmCanvas.top + (TmCanvas.recty + TmCanvas.spacey) * j; + Rectangle(TmCanvas.hmdc, x, y, + x + TmCanvas.rectx, y + TmCanvas.recty); + } + } + + SelectObject(TmCanvas.hmdc, hgdiobj_hpen); + SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); +} + +static void TmDrawBar(int x, int y, int len, int c) +{ + HPEN pen; + HBRUSH brush; + static int last_c; + int i; + + if(hgdiobj_hpen == NULL) + { + pen = tm_colors[c].pen; + brush = tm_colors[c].brush; + hgdiobj_hpen = SelectObject(TmCanvas.hmdc, pen); + hgdiobj_hbrush = SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); + } + else if(last_c != c) + { + pen = tm_colors[c].pen; + brush = tm_colors[c].brush; + SelectObject(TmCanvas.hmdc, pen); + SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); + } + last_c = c; + + y = TM_CANVASMAP_YMAX - y - len; // Reverse up/down + + // Set up start position. + x = TmCanvas.left + x * (TmCanvas.rectx + TmCanvas.spacex); + y = TmCanvas.top + y * (TmCanvas.recty + TmCanvas.spacey); + + for(i = 0; i < len; i++, y += (TmCanvas.recty + TmCanvas.spacey)) + { + Rectangle(TmCanvas.hmdc, x, y, + x + TmCanvas.rectx, y + TmCanvas.recty); + TmAddRedrawRect(x, y, TmCanvas.rectx, TmCanvas.recty); + } +} + +static void TmCanvasChannelNote(int status, int ch, int note, int vel) +{ + int v; + double t, past_time; + unsigned int onoff; + int i; + + if(ch >= TCTM_MAX_CHANNELS) + return; + + onoff = (status == VOICE_ON || status == VOICE_SUSTAINED); + onoff <<= (8 * sizeof(onoff) - 1); + set_bitset(&TmCanvas.channel_on_flags[ch], &onoff, note, 1); + + t = get_current_calender_time(); + past_time = t - TmCanvas.last_bar_time; + TmCanvas.last_bar_time = t; + + /* decrease alive time of bar */ + for(i = 0; i < TCTM_MAX_CHANNELS; i++) + if(!has_bitset(&TmCanvas.channel_on_flags[i])) + TmCanvas.bar_alive_time[i] -= past_time; + + /* increase alive time of NoteON bar */ + if(status == VOICE_ON) + { + v = vel * w32g_current_volume[ch] * w32g_current_volume[ch]; // 0..2^21 + t = v / (127.0 * 127.0 * 8.0); // 0..16 + t *= TM_SEC_PER_BOX; + if(TmCanvas.bar_alive_time[ch] < t) + TmCanvas.bar_alive_time[ch] = t; + } + + /* Update bar[] */ + for(i = 0; i < TCTM_MAX_CHANNELS; i++) + { + if(TmCanvas.bar_alive_time[i] <= 0) + { + TmCanvas.bar_alive_time[i] = -1.0; + v = -1; + } + else + { + v = (int)(TmCanvas.bar_alive_time[i] / TM_SEC_PER_BOX); + if(v >= TM_CANVASMAP_YMAX) + v = TM_CANVASMAP_YMAX - 1; + } + TmCanvas.bar[i] = v; + } + + /* Update the display */ + hgdiobj_hpen = hgdiobj_hbrush = 0; + for(i = 0; i < TCTM_MAX_CHANNELS; i++) + { + if(TmCanvas.bar_old[i] < TmCanvas.bar[i]) + TmDrawBar(i, TmCanvas.bar_old[i] + 1, + TmCanvas.bar[i] - TmCanvas.bar_old[i], + TMCC_FORE); // Draw bar boxes + else if(TmCanvas.bar_old[i] > TmCanvas.bar[i]) + TmDrawBar(i, TmCanvas.bar[i] + 1, + TmCanvas.bar_old[i] - TmCanvas.bar[i], + TMCC_FORE_HALF); // Clear bar boxes + TmCanvas.bar_old[i] = TmCanvas.bar[i]; // Save old bar length + } + + if(hgdiobj_hpen) + { + SelectObject(TmCanvas.hmdc, hgdiobj_hpen); + SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); + } +} + +static void TmCanvasFillRect(RECT *r, COLORREF c) +{ + HPEN hPen; + HBRUSH hBrush; + HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; + + hPen = CreatePen(PS_SOLID, 1, c); + hBrush = CreateSolidBrush(c); + hgdiobj_hpen = SelectObject(TmCanvas.hmdc, hPen); + hgdiobj_hbrush = SelectObject(TmCanvas.hmdc, hBrush); + Rectangle(TmCanvas.hmdc, r->left, r->top, r->right, r->bottom); + SelectObject(TmCanvas.hmdc, hgdiobj_hpen); + DeleteObject(hPen); + SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); + DeleteObject(hBrush); +} + +#define BITMAP_SLEEP_SIZEX 96 +#define BITMAP_SLEEP_SIZEY 64 +static void TmCanvasResetSleepMode(void) +{ + HDC hdc; + int x, y; + + TmCanvasFillRect(&TmCanvas.rcMe, GetSysColor(COLOR_SCROLLBAR)); + + hdc = CreateCompatibleDC(TmCanvas.hmdc); + SelectObject(hdc, TmCanvas.hSleepBitmap); + x = (TmCanvas.rcMe.right - TmCanvas.rcMe.left - BITMAP_SLEEP_SIZEX)/2; + y = (TmCanvas.rcMe.bottom - TmCanvas.rcMe.top - BITMAP_SLEEP_SIZEY)/2; + if(x<0) x = 0; + if(y<0) y = 0; + BitBlt(TmCanvas.hmdc, x, y, BITMAP_SLEEP_SIZEX, BITMAP_SLEEP_SIZEY, + hdc, 0, 0, SRCCOPY); + DeleteDC(hdc); +} + +static const int black_key[12] = {0,1,0,1,0,0,1,0,1,0,1,0}; +static void TmCanvasResetTracerMode(void) +{ + int ch, note, x, y; + RECT rc; + + TmFillRect(TmCanvas.hmdc, &TmCanvas.rcMe, TMCC_BACK); + for(ch = 0; ch < 16; ch++) + { + rc.left = TmCanvas.left; + rc.top = TmCanvas.top + ch * 4; + rc.right = TmCanvas.left + 8 * 12; + rc.bottom = TmCanvas.top + ch * 4 + 3; + TmFillRect(TmCanvas.hmdc, &rc, TMCC_WHITE); + for(note = 0; note < TM_DISPLAY_NKEYS; note++) + { + if(!black_key[(note+TM_DISPLAY_SKEYS)%12]) + continue; + x = TmCanvas.left + note; + y = TmCanvas.top + ch * 4; + SetPixelV(TmCanvas.hmdc, x, y, TmCc(TMCC_BLACK)); + SetPixelV(TmCanvas.hmdc, x, y+1, TmCc(TMCC_BLACK)); + } + } +} + +static void TmCanvasTracerNote(int status, int ch, int note, int vel) +{ + int prev_key, bitidx, bitmask, is_black, x, y; + + if(note < TM_DISPLAY_SKEYS || + note >= TM_DISPLAY_SKEYS + TM_DISPLAY_NKEYS || + ch >= TCTM_MAX_CHANNELS) + return; + + vel = (status == VOICE_ON || status == VOICE_SUSTAINED); + is_black = black_key[note % 12]; + note -= TM_DISPLAY_SKEYS; + bitidx = note / 8; + bitmask = 1<<(note % 8); + prev_key = !!(TmCanvas.xnote[ch][bitidx] & bitmask); + if(vel == prev_key) + return; + x = TmCanvas.left + note; + y = TmCanvas.top + ch * 4; + if(vel) + { + /* Note On */ + TmCanvas.xnote[ch][bitidx] |= bitmask; + SetPixelV(TmCanvas.hmdc, x, y, TmCc(TMCC_RED)); + SetPixelV(TmCanvas.hmdc, x, y+1, TmCc(TMCC_RED)); + if(!is_black) + SetPixelV(TmCanvas.hmdc, x, y+2, TmCc(TMCC_RED)); + } + else + { + /* Note Off */ + TmCanvas.xnote[ch][bitidx] &= ~bitmask; + if(is_black) + { + SetPixelV(TmCanvas.hmdc, x, y, TmCc(TMCC_BLACK)); + SetPixelV(TmCanvas.hmdc, x, y+1, TmCc(TMCC_BLACK)); + } + else + { + SetPixelV(TmCanvas.hmdc, x, y, TmCc(TMCC_WHITE)); + SetPixelV(TmCanvas.hmdc, x, y+1, TmCc(TMCC_WHITE)); + SetPixelV(TmCanvas.hmdc, x, y+2, TmCc(TMCC_WHITE)); + } + } + TmAddRedrawRect(x, y, 1, 3); +} + +void TmCanvasReset(void) +{ + int i; + + memset(TmCanvas.xnote, 0, sizeof(TmCanvas.xnote)); + TmCanvas.last_bar_time = get_current_calender_time(); + for(i = 0; i < TCTM_MAX_CHANNELS; i++) + { + TmCanvas.bar_alive_time[i] = -1.0; + clear_bitset(&TmCanvas.channel_on_flags[i], 0, 128); + TmCanvas.bar[i] = -1; + TmCanvas.bar_old[i] = -1; + } + switch(TmCanvasMode) + { + case TMCM_SLEEP: + default: + TmCanvasResetSleepMode(); + break; + case TMCM_CHANNEL: + TmCanvasResetChannelMode(); + break; + case TMCM_TRACER: + TmCanvasResetTracerMode(); + break; + } + + TmCanvas.rcDr = TmCanvas.rcMe; + TmCanvasRefresh(); +} + +int TmCanvasChange(void) +{ + int rc = RC_NONE; + + switch(TmCanvasMode) + { + case TMCM_SLEEP: + TmCanvasMode = TMCM_CHANNEL; + if(!ctl->trace_playing) + rc = RC_SYNC_RESTART; + ctl->trace_playing = 1; + break; + case TMCM_CHANNEL: + TmCanvasMode = TMCM_TRACER; + if(!ctl->trace_playing) + rc = RC_SYNC_RESTART; + ctl->trace_playing = 1; + break; + case TMCM_TRACER: + TmCanvasMode = TMCM_SLEEP; + ctl->trace_playing = 0; + break; + default: + TmCanvasMode = TMCM_SLEEP; + ctl->trace_playing = 0; + break; + } + TmCanvasReset(); + return rc; +} + +void TmCanvasRefresh(void) +{ + if(!TmCanvas.hdc) + return; + if(TmCanvas.rcDr.left != ~0L) + { + BitBltRect(TmCanvas.hdc, TmCanvas.hmdc, &TmCanvas.rcDr); + TmCanvas.rcDr.left = ~0L; + } +} + +void TmCanvasNote(int status, int ch, int note, int vel) +{ + if(ch >= TCTM_MAX_CHANNELS || !TmCanvas.hdc) + return; + switch(TmCanvasMode) + { + default: + case TMCM_SLEEP: + break; + case TMCM_CHANNEL: + TmCanvasChannelNote(status, ch, note, vel); + break; + case TMCM_TRACER: + TmCanvasTracerNote(status, ch, note, vel); + break; + } +} diff -ruN TiMidity++-2.2.0/interface/w32g_i.c TiMidity++-2.3.0/interface/w32g_i.c --- TiMidity++-2.2.0/interface/w32g_i.c Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.3.0/interface/w32g_i.c Sun Aug 1 03:44:00 1999 @@ -0,0 +1,1380 @@ +/* + TiMidity++ -- MIDI to WAVE converter and player + Copyright (C) 1999 Masanao Izumo + Copyright (C) 1995 Tuukka Toivonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + w32g_i.c: by Daisuke Aoki + Masanao Izumo +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ +#include +#include +#include +#include +#include + +#ifndef NO_STRING_H +#include +#else +#include +#endif +//#include + +#include "timidity.h" +#include "common.h" +#include "instrum.h" +#include "playmidi.h" +#include "readmidi.h" +#include "output.h" +#include "controls.h" +#ifdef SUPPORT_SOUNDSPEC +#include "soundspec.h" +#endif /* SUPPORT_SOUNDSPEC */ +#include "aq.h" +#include "w32g.h" +#include "w32g_res.h" + +#include /* There is no on CYGWIN. + * Edit_* and ListBox_* are defined in + * + */ + +// #include /* FIXME */ +//#if defined(__CYGWIN32__) || defined(__MINGW32__) +//WINAPI void InitCommonControls(void); +//#endif + +#define IDM_STOP 12501 +#define IDM_PAUSE 12502 +#define IDM_PREV 12503 +#define IDM_FOREWARD 12504 +#define IDM_PLAY 12505 +#define IDM_BACKWARD 12506 +#define IDM_NEXT 12507 +#define IDM_CONSOLE 12511 +#define IDM_LIST 12512 +#define IDM_TRACER 12513 +#define IDM_DOC 12514 +#define IDM_WRD 12515 +#define IDM_SOUNDSPEC 12516 + +#define STARTWND_XSIZE 100 +#define STARTWND_YSIZE 100 +static char StartWndClassName[] = "MainWindow"; + + +HINSTANCE hInst; + +// HWND +static HWND hMainWnd = 0; +static HWND hConsoleWnd = 0; +static HWND hTracerWnd = 0; +static HWND hDocWnd = 0; +HWND hListWnd = 0; // global +static HWND hWrdWnd = 0; +static HWND hSettingWnd = 0; + +static struct { + int id; + HWND *hwnd; + int status; +#define SWS_EXIST 0x0001 +#define SWS_ICON 0x0002 +#define SWS_HIDE 0x0004 +} subwindow[] = +{ + {IDM_CONSOLE,&hConsoleWnd, 0}, + {IDM_LIST, &hListWnd, 0}, + {IDM_TRACER,&hTracerWnd, 0}, + {IDM_DOC, &hDocWnd, 0}, + {IDM_WRD, &hWrdWnd, 0}, + {0, NULL, 0} +}; + + +static void GUIThread(void *arglist); +static void update_subwindow(int id); +static HWND ID2SubWindow(int id); +static int ID2SubWindowIdx(int id); +static void MainWndUpdateButton(int id); +static void InitToolbar(HWND hwnd); +static LRESULT CALLBACK StartWinProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static WINBOOL CALLBACK MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static WINBOOL CALLBACK ListWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static WINBOOL CALLBACK ConsoleWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static void ConsoleWndVerbosityApplyIncDec(int diff); +static void InitSettingWnd(HWND hParentWnd); +static void OpenSettingWnd(HWND hwnd); +static void SettingWndSetup(SETTING_TIMIDITY *st); + +static HANDLE w32g_lock_sem = NULL; +static HANDLE w32g_empty_sem = NULL; +static int progress_jump = -1; +static HWND hMainWndScrollbarProgressWnd; +static HWND hMainWndScrollbarVolumeWnd; +#define W32G_VOLUME_MAX 200 +static VOLATILE int w32g_wait_for_init; + + + +static HANDLE hGUIThread = 0; +static HANDLE hPlayerThread = 0; +static DWORD dwGUIThreadID = 0; + +int InitMinimizeFlag = 0; +int DebugWndStartFlag = 1; +int ConsoleWndStartFlag = 0; +int ListWndStartFlag = 0; +int TracerWndStartFlag = 0; +int DocWndStartFlag = 0; +int WrdWndStartFlag = 0; + +int DebugWndFlag = 1; +int ConsoleWndFlag = 1; +int ListWndFlag = 1; +int TracerWndFlag = 0; +int DocWndFlag = 0; +int WrdWndFlag = 0; +int SoundSpecWndFlag = 0; + +char *IniFile; +char *ConfigFile; +char *PlaylistFile; +char *PlaylistHistoryFile; +char *MidiFileOpenDir; +char *ConfigFileOpenDir; +char *PlaylistFileOpenDir; + +int PlayerThreadPriority = THREAD_PRIORITY_NORMAL; +int GUIThreadPriority = THREAD_PRIORITY_NORMAL; + +int WrdGraphicFlag; +int TraceGraphicFlag; + +int DocMaxSize; +char *DocFileExt; +HWND hDebugEditWnd = 0; +HWND hDocEditWnd = 0; + +int w32g_lock_open_file = 0; + +#define RC_QUEUE_SIZE 8 +static struct +{ + int rc; + int32 value; +} rc_queue[RC_QUEUE_SIZE]; +static VOLATILE int rc_queue_len, rc_queue_beg, rc_queue_end; + + +void w32g_lock(void) +{ + WaitForSingleObject(w32g_lock_sem, INFINITE); +} + +void w32g_unlock(void) +{ + ReleaseSemaphore(w32g_lock_sem, 1, NULL); +} + +void w32g_send_rc(int rc, int32 value) +{ + int full; + + w32g_lock(); + + if(rc_queue_len == RC_QUEUE_SIZE) + { + /* Over flow. Remove the oldest message */ + rc_queue_len--; + rc_queue_beg = (rc_queue_beg + 1) % RC_QUEUE_SIZE; + full = 1; + } + else + full = 0; + + rc_queue_len++; + rc_queue[rc_queue_end].rc = rc; + rc_queue[rc_queue_end].value = value; + rc_queue_end = (rc_queue_end + 1) % RC_QUEUE_SIZE; + ReleaseSemaphore(w32g_empty_sem, 1, NULL); + w32g_unlock(); +} + +int w32g_get_rc(int32 *value, int wait_if_empty) +{ + int rc; + + while(rc_queue_len == 0) + { + if(!wait_if_empty) + return RC_NONE; + WaitForSingleObject(w32g_empty_sem, INFINITE); + VOLATILE_TOUCH(rc_queue_len); + } + + w32g_lock(); + rc = rc_queue[rc_queue_beg].rc; + *value = rc_queue[rc_queue_beg].value; + rc_queue_len--; + rc_queue_beg = (rc_queue_beg + 1) % RC_QUEUE_SIZE; + + w32g_unlock(); + return rc; +} + +static void NotImplemented(char *msg) +{ + char buff[BUFSIZ]; + strcpy(buff, msg); + strcat(buff, " is not implemented."); + w32g_msg_box(buff, "TiMidity Notice", MB_OK); +} + +void PutsConsoleWnd(char *str) +{ + HWND hwnd; + +// #### for debug +// fputs(str, stdout); +// fflush(stdout); + + if(!IsWindow(hConsoleWnd) || + !IsDlgButtonChecked(hConsoleWnd,IDC_CHECKBOX_VALID)) + return; + + hwnd = GetDlgItem(hConsoleWnd, IDC_EDIT_TERMINAL); + if(!hwnd) + return; + w32g_lock(); + Edit_SetSel(hwnd, 0, -1); + Edit_SetSel(hwnd, -1, -1); + Edit_ReplaceSel(hwnd, str); + w32g_unlock(); +} + +int SubWindowMax = 2; + + +void OnExit(void) +{ + PostQuitMessage(0); +} + +void OnDestroy(void) +{ + TmFreeColor(); + OnExit(); +} + + +static void ToggleSubWindow(int id) +{ + HWND hwnd = ID2SubWindow(id); + + if(!hwnd) + return; + if(IsWindowVisible(hwnd)) + ShowWindow(hwnd,SW_HIDE); + else + { + ShowWindow(hwnd,SW_SHOW); + switch(id) + { + case IDM_LIST: + w32g_update_playlist(); + break; + } + } + update_subwindow(id); + MainWndUpdateButton(id); +} + +static void DlgMidiFileOpen(void) +{ + OPENFILENAME ofn; + static char pFileName[16536]; + char *dir; + static char *filter = + "Midi file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36\0" + "Archive file\0*.lzh;*.zip;*.gz;*.tgz\0" + "All files\0*.*\0" + "\0\0"; + if(w32g_lock_open_file) + return; + + memset(pFileName, 0, sizeof(pFileName)); + memset(&ofn, 0, sizeof(OPENFILENAME)); + if(MidiFileOpenDir[0]) + dir = MidiFileOpenDir; + else + dir = NULL; + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = 0; + ofn.hInstance = hInst ; + ofn.lpstrFilter = filter; + ofn.lpstrCustomFilter= 0; + ofn.nMaxCustFilter = 1; + ofn.nFilterIndex = 1 ; + ofn.lpstrFile = pFileName; + ofn.nMaxFile = sizeof(pFileName); + ofn.lpstrFileTitle = 0; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = dir; + ofn.lpstrTitle = 0; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST + | OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_READONLY; + ofn.lpstrDefExt = 0; + ofn.lCustData = 0; + ofn.lpfnHook = 0; + ofn.lpTemplateName = 0; + + if(!GetOpenFileName(&ofn)) + return; + w32g_lock_open_file = 1; + w32g_send_rc(RC_EXT_LOAD_FILE, (int32)pFileName); +} + +static void VersionWnd() +{ + char VersionText[2048]; + + sprintf(VersionText, +" TiMidity++ version %s -- MIDI to WAVE converter and player" NLS +" Copyright (C) 1999 Masanao Izumo " NLS +" Copyright (C) 1995 Tuukka Toivonen " NLS +NLS +" Windows version by" NLS +" Davide Moretti ." NLS +" Nicolas Witczak." NLS +" Daisuke Aoki ." NLS +" Masanao Izumo ." NLS +NLS +" This program is free software; you can redistribute it and/or modify" NLS +" it under the terms of the GNU General Public License as published by" NLS +" the Free Software Foundation; either version 2 of the License, or" NLS +" (at your option) any later version." NLS +NLS +" This program is distributed in the hope that it will be useful," NLS +" but WITHOUT ANY WARRANTY; without even the implied warranty of"NLS +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" NLS +" GNU General Public License for more details." NLS +NLS +" You should have received a copy of the GNU General Public License" NLS +" along with this program; if not, write to the Free Software" NLS +" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." NLS + ,timidity_version); + w32g_msg_box(VersionText, "Version", MB_OK); +} + +void MainCmdProc(HWND hwnd, int wId, HWND hwndCtl, UINT wNotifyCode) +{ + switch(wId) + { + case IDM_STOP: + w32g_send_rc(RC_STOP, 0); + break; + case IDM_PAUSE: + w32g_send_rc(RC_TOGGLE_PAUSE, 0); + break; + case IDM_PREV: + w32g_send_rc(RC_REALLY_PREVIOUS, 0); + break; + case IDM_BACKWARD: + w32g_send_rc(RC_BACK, play_mode->rate * 1); + break; + case IDM_PLAY: + if(play_pause_flag) + { + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN, + TB_CHECKBUTTON, IDM_PAUSE, + (LPARAM)MAKELONG(FALSE, 0)); + w32g_send_rc(RC_TOGGLE_PAUSE, 0); + } + if(!w32g_play_active) + w32g_send_rc(RC_LOAD_FILE, 0); + break; + case IDM_FOREWARD: + w32g_send_rc(RC_FORWARD, play_mode->rate * 1); + break; + case IDM_NEXT: + w32g_send_rc(RC_NEXT, 0); + break; + + case IDM_CONSOLE: + case IDM_MWCONSOLE: + ToggleSubWindow(IDM_CONSOLE); + break; + case IDM_TRACER: + case IDM_MWTRACER: + NotImplemented("Tracer"); + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, IDM_TRACER, + (LPARAM)MAKELONG(FALSE, 0)); + break; + case IDM_LIST: + case IDM_MWPLAYLIST: + ToggleSubWindow(IDM_LIST); + break; + case IDM_DOC: + case IDM_MWDOCUMENT: + NotImplemented("Document"); + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, IDM_DOC, + (LPARAM)MAKELONG(FALSE, 0)); + break; + case IDM_WRD: + case IDM_MWWRDTRACER: + NotImplemented("WRD"); + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, IDM_WRD, + (LPARAM)MAKELONG(FALSE, 0)); + break; + case IDM_SOUNDSPEC: + case IDM_MWSOUNDSPEC: + NotImplemented("Sound spectrogram"); + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, IDM_SOUNDSPEC, + (LPARAM)MAKELONG(FALSE, 0)); + break; + case IDOK: + break; + case IDCANCEL: + OnExit(); + break; + case IDM_MFOPENFILE: + DlgMidiFileOpen(); + break; + case IDM_MFOPENDIR: + NotImplemented("Open Directory"); + break; + case IDM_MFLOADPLAYLIST: + NotImplemented("Load Playlist"); + break; + case IDM_MFSAVEPLAYLISTAS: + NotImplemented("Save Playlist"); + break; + case IDM_MFEXIT: + OnExit(); + break; + case IDM_SETTING: + OpenSettingWnd(hwnd); + break; + case IDM_MCSAVEINIFILE: + SaveIniFile(sp_current, st_current); + w32g_has_ini_file = 1; + break; + case IDM_MCLOADINIFILE: + if(w32g_has_ini_file) + { + LoadIniFile(sp_current, st_current); + SettingWndSetup(st_current); + OpenSettingWnd(hwnd); + } + else + w32g_msg_box("Can't load ini file.", + "TiMidity Warning", MB_OK); + break; + case IDM_MHVERSION: + VersionWnd(); + break; + } +} + +static WINBOOL CALLBACK +MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + HMENU hMenu; + + switch (uMess) + { + case WM_INITDIALOG: + hMenu = GetSystemMenu(hwnd, FALSE); + EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(hMenu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0); + InsertMenu(hMenu, 0, MF_BYPOSITION, SC_SCREENSAVE, "Screen Saver"); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_STOP, "Stop"); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PAUSE, "Pause"); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PREV, "Prev"); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_NEXT, "Next"); + InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PLAY, "Play"); + DrawMenuBar(hwnd); + break; + + HANDLE_MSG(hwnd,WM_COMMAND,MainCmdProc); + + HANDLE_MSG(hwnd,WM_CLOSE,DestroyWindow); + + case WM_DESTROY: + OnDestroy(); + break; + + case WM_SIZE: + if(wParam == SIZE_MINIMIZED) { + update_subwindow(-1); + } + break; + + case WM_DROPFILES: + w32g_send_rc(RC_EXT_DROP, (int32)wParam); + break; + + case WM_HSCROLL: { + int nScrollCode = (int)LOWORD(wParam); + int nPos = (int) HIWORD(wParam); + HWND bar = (HWND)lParam; + + if(bar != hMainWndScrollbarProgressWnd) + break; + + switch(nScrollCode) + { + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + progress_jump = nPos; + break; + case SB_LINELEFT: + progress_jump = GetScrollPos(bar, SB_CTL) - 1; + if(progress_jump < 0) + progress_jump = 0; + break; + case SB_PAGELEFT: + progress_jump = GetScrollPos(bar, SB_CTL) - 10; + if(progress_jump < 0) + progress_jump = 0; + break; + case SB_LINERIGHT: + progress_jump = GetScrollPos(bar, SB_CTL) + 1; + break; + case SB_PAGERIGHT: + progress_jump = GetScrollPos(bar, SB_CTL) + 10; + break; + case SB_ENDSCROLL: + if(progress_jump != -1) + { + w32g_send_rc(RC_JUMP, progress_jump * play_mode->rate); + SetScrollPos(hMainWndScrollbarProgressWnd, SB_CTL, + progress_jump, TRUE); + progress_jump = -1; + } + break; + } + break; + } + break; + + case WM_VSCROLL: { + int nScrollCode = (int) LOWORD(wParam); + int nPos = (int) HIWORD(wParam); + HWND bar = (HWND) lParam; + static int pos = -1; + + if(bar != hMainWndScrollbarVolumeWnd) + break; + + switch(nScrollCode) + { + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + pos = nPos; + break; + case SB_LINEUP: + case SB_PAGEUP: + pos = GetScrollPos(bar, SB_CTL) - 5; + if(pos < 0) + pos = 0; + break; + case SB_LINEDOWN: + case SB_PAGEDOWN: + pos = GetScrollPos(bar, SB_CTL) + 5; + if(pos > W32G_VOLUME_MAX) + pos = W32G_VOLUME_MAX; + break; + case SB_ENDSCROLL: + if(pos != -1) + { + w32g_send_rc(RC_CHANGE_VOLUME, + (W32G_VOLUME_MAX - pos) - amplification); + SetScrollPos(bar, SB_CTL, pos, TRUE); + pos = -1; + } + break; + } + } + break; + + case WM_SYSCOMMAND: + switch(wParam) + { + case IDM_STOP: + case IDM_PAUSE: + case IDM_PREV: + case IDM_PLAY: + case IDM_NEXT: + SendMessage(hwnd,WM_COMMAND,wParam,NULL); + break; + default: + break; + } + break; + } + return 0; +} + +static void update_subwindow(int id) +{ + int i; + + if(id == -1) + { + for(i = 0; subwindow[i].hwnd != NULL; i++) + update_subwindow(subwindow[i].id); + } + else + { + i = ID2SubWindowIdx(id); + if(i == -1) + return; + + if(IsWindow(*(subwindow[i].hwnd))) + subwindow[i].status |= SWS_EXIST; + else + { + subwindow[i].status = 0; + return; + } + if(IsIconic(*(subwindow[i].hwnd))) + subwindow[i].status |= SWS_ICON; + else + subwindow[i].status &= ~SWS_ICON; + if(IsWindowVisible(*(subwindow[i].hwnd))) + subwindow[i].status &= ~SWS_HIDE; + else + subwindow[i].status |= SWS_HIDE; + } +} + +static LRESULT CALLBACK +StartWinProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + switch(uMess) + { + HANDLE_MSG(hwnd, WM_CLOSE, DestroyWindow); + case WM_DESTROY: + OnDestroy(); + break; + default: + return DefWindowProc(hwnd,uMess,wParam,lParam); + } + return 0L; +} + +static void GUIThread(void *arglist) +{ + MSG msg; + HWND hStartWnd; + HICON hIcon; + WNDCLASSEX wcl; + +// InitCommonControls(); + + hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_TIMIDITY)); + memset(&wcl, 0, sizeof(wcl)); + wcl.cbSize = sizeof(WNDCLASSEX); + wcl.hInstance = hInst; + wcl.lpszClassName = StartWndClassName; + wcl.lpfnWndProc = StartWinProc; + wcl.style = 0; + wcl.hIcon = hIcon; + wcl.hCursor = LoadCursor(0,IDC_ARROW); + wcl.lpszMenuName = NULL; + wcl.cbClsExtra = 0; + wcl.cbWndExtra = 0; + wcl.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); + RegisterClassEx(&wcl); + + hStartWnd = CreateWindow(StartWndClassName, + "TiMidity", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + HWND_DESKTOP, + NULL, + hInst, + NULL); + ShowWindow(hStartWnd, SW_HIDE); + UpdateWindow(hStartWnd); + + /* Main Window */ + hMainWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG_MAIN), + hStartWnd, MainProc); + if(hIcon != NULL) + SendMessage(hMainWnd, WM_SETICON, FALSE, (LPARAM)hIcon); + UpdateWindow(hMainWnd); + + InitToolbar(hMainWnd); + + /* ListWnd */ + hListWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG_SIMPLE_LIST), + hStartWnd, ListWndProc); + ShowWindow(hListWnd,SW_HIDE); + UpdateWindow(hListWnd); + + /* ConsoleWnd */ + hConsoleWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG_CONSOLE), + hStartWnd, ConsoleWndProc); + ConsoleWndVerbosityApplyIncDec(0); + ShowWindow(hConsoleWnd, SW_HIDE); + UpdateWindow(hConsoleWnd); + CheckDlgButton(hConsoleWnd, IDC_CHECKBOX_VALID, 1); + + /* Scrollbar */ + hMainWndScrollbarProgressWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_PROGRESS); + hMainWndScrollbarVolumeWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_VOLUME); + EnableScrollBar(hMainWndScrollbarVolumeWnd, SB_CTL,ESB_ENABLE_BOTH); + SetScrollRange(hMainWndScrollbarVolumeWnd, SB_CTL, + 0, W32G_VOLUME_MAX, TRUE); + SetScrollPos(hMainWndScrollbarVolumeWnd, SB_CTL, + W32G_VOLUME_MAX - amplification, TRUE); + + /* TiMidity Setting */ + InitSettingWnd(hStartWnd); + + update_subwindow(-1); + + TmInitColor(); + w32g_init_panel(hMainWnd); /* Panel */ + w32g_init_canvas(hMainWnd); /* Canvas */ + + w32g_wait_for_init = 0; + while(GetMessage(&msg,NULL,0,0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + w32g_send_rc(RC_QUIT, 0); + ExitThread(0); +} + +void w32g_close(void) +{ + TerminateThread(hGUIThread, 0); + CloseHandle(w32g_lock_sem); + CloseHandle(w32g_empty_sem); +} + +int w32g_open(void) +{ + SaveSettingTiMidity(st_current); + + w32g_lock_sem = CreateSemaphore(NULL, 1, 1, "TiMidity Mutex Lock"); + w32g_empty_sem = CreateSemaphore(NULL, 0, 8, "TiMidity Empty Lock"); + + hPlayerThread = GetCurrentThread(); + w32g_wait_for_init = 1; + hGUIThread = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE)GUIThread, + NULL, 0, &dwGUIThreadID); + while(w32g_wait_for_init) + { + Sleep(0); + VOLATILE_TOUCH(w32g_wait_for_init); + } + return 0; +} + +static void InitToolbar(HWND hwnd) +{ + TBADDBITMAP MainTbab; + TBADDBITMAP SubWndTbab; + + static TBBUTTON MainTbb[] = + { + {4, IDM_STOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, + {3, IDM_PAUSE, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + {0, IDM_PREV, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, + {1, IDM_BACKWARD,TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, 0}, + {2, IDM_PLAY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, + {5, IDM_FOREWARD,TBSTATE_ENABLED,TBSTYLE_BUTTON, 0, 0}, + {6, IDM_NEXT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0} + }; + static TBBUTTON SubWndTbb[] = { + {3, IDM_CONSOLE,TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + {1, IDM_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + {2, IDM_TRACER, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + {0, IDM_DOC, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + {4, IDM_WRD, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, + }; + + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, + TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, + TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16)); + MainTbab.hInst = hInst; + MainTbab.nID = (int)IDB_BITMAP_MAIN_BUTTON; + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, + TB_ADDBITMAP, 7, (LPARAM)&MainTbab); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, + TB_ADDBUTTONS, (WPARAM)7, (LPARAM)MainTbb); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, + TB_AUTOSIZE, 0, 0); + + + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, + TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, + TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16)); + SubWndTbab.hInst = hInst; + SubWndTbab.nID = (int)IDB_BITMAP_SUBWND_BUTTON; + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, + TB_ADDBITMAP, 5, (LPARAM)&SubWndTbab); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, + TB_ADDBUTTONS, (WPARAM)5, (LPARAM)SubWndTbb); + SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, + TB_AUTOSIZE, 0, 0); +} + +static int ID2SubWindowIdx(int id) +{ + int i; + + for(i = 0; subwindow[i].id; i++) + if(subwindow[i].id == id) + return i; + return -1; +} + +static HWND ID2SubWindow(int id) +{ + int i; + + i = ID2SubWindowIdx(id); + if(i == -1) + return 0; + return *subwindow[i].hwnd; +} + +static void MainWndUpdateButton(int id) +{ + HWND hwnd = ID2SubWindow(id); + + if(!hwnd) + return; + if(IsWindowVisible(hwnd)) + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, id, (LPARAM)MAKELONG(TRUE, 0)); + else + SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, + TB_CHECKBUTTON, id, (LPARAM)MAKELONG(FALSE, 0)); +} + +static WINBOOL CALLBACK +ListWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + switch(uMess) + { + case WM_INITDIALOG: + w32g_update_playlist(); + break; + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case IDCLOSE: + ShowWindow(hwnd, SW_HIDE); + MainWndUpdateButton(IDM_LIST); + break; + case LBN_DBLCLK: + if(LOWORD(wParam) == IDC_LISTBOX_PLAYLIST) + { + HWND hListBox = (HWND)lParam; + int num = ListBox_GetCurSel(hListBox); + if(w32g_goto_playlist(num)) + w32g_send_rc(RC_LOAD_FILE, 0); + } + break; + } + break; + case WM_VKEYTOITEM: { + UINT vkey = (UINT)LOWORD(wParam); + int nCaretPos = (int)HIWORD(wParam); + int selected, nfiles; + switch(vkey) + { + case VK_RETURN: + if(w32g_goto_playlist(nCaretPos)) + w32g_send_rc(RC_LOAD_FILE, 0); + break; + case VK_DELETE: + w32g_send_rc(RC_EXT_DELETE_PLAYLIST, 0); + break; + case VK_BACK: + w32g_send_rc(RC_EXT_DELETE_PLAYLIST, -1); + break; + } + return -1; + } + break; + case WM_CLOSE: + ShowWindow(hListWnd, SW_HIDE); + MainWndUpdateButton(IDM_LIST); + break; + case WM_DROPFILES: + SendMessage(hMainWnd, WM_DROPFILES, wParam, lParam); + break; + case WM_SIZE: + if(wParam == SIZE_RESTORED) + { + HWND hListBox = GetDlgItem(hListWnd, IDC_LISTBOX_PLAYLIST); + if(!hListBox) + break; + MoveWindow(hListBox, 0, 0, LOWORD(lParam), HIWORD(lParam), FALSE); + ShowWindow(hListWnd, SW_HIDE); + ShowWindow(hListWnd, SW_SHOW); + } + break; + } + return 0; +} + +static void ClearEditCtlWnd(HWND hwnd) +{ + char pszVoid[]=""; + if(!IsWindow(hwnd)) + return; + Edit_SetText(hwnd, pszVoid); +} + +static BOOL CALLBACK +ConsoleWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + HWND w; + + switch(uMess) + { + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDCLOSE: + ShowWindow(hwnd, SW_HIDE); + MainWndUpdateButton(IDM_CONSOLE); + break; + case IDCLEAR: + if((w = GetDlgItem(hConsoleWnd, IDC_EDIT_TERMINAL)) != 0) + ClearEditCtlWnd(w); + break; +#if 0 + case IDC_CHECKBOX_VALID: + ConsoleWndValidApply(); + break; + case IDC_BUTTON_VERBOSITY: + ConsoleWndVerbosityApply(); + break; +#endif + case IDC_BUTTON_INC: + ConsoleWndVerbosityApplyIncDec(1); + break; + case IDC_BUTTON_DEC: + ConsoleWndVerbosityApplyIncDec(-1); + break; + } + break; + case WM_CLOSE: + ShowWindow(hwnd, SW_HIDE); + MainWndUpdateButton(IDM_CONSOLE); + break; + case WM_SETFOCUS: + HideCaret(hwnd); + break; + case WM_KILLFOCUS: + ShowCaret(hwnd); + break; + } + return 0; +} + +void ConsoleWndVerbosityApplyIncDec(int num) +{ + char buff[32]; + HWND hwnd; + + hwnd = GetDlgItem(hConsoleWnd, IDC_EDIT_VERBOSITY); + if(!hwnd) + return; + ctl->verbosity += num; + sprintf(buff, "%d", ctl->verbosity); + SetWindowText(hwnd, buff); +} + +void w32g_ctle_play_start(int sec) +{ + if(sec > 0) + { + SetScrollRange(hMainWndScrollbarProgressWnd, SB_CTL, 0, sec, TRUE); + MainWndScrollbarProgressUpdate(0); + } + else + MainWndScrollbarProgressUpdate(-1); +} + +void MainWndScrollbarProgressUpdate(int sec) +{ + static int lastsec = -1, enabled = 0; + + if(sec == lastsec) + return; + + if(sec == -1) + { + EnableWindow(hMainWndScrollbarProgressWnd, FALSE); + enabled = 0; + progress_jump = -1; + } + else + { + if(!enabled) + { + EnableWindow(hMainWndScrollbarProgressWnd, TRUE); + enabled = 1; + } + if(progress_jump == -1) + SetScrollPos(hMainWndScrollbarProgressWnd, SB_CTL, sec, TRUE); + } + lastsec = sec; +} + +// ***************************************************************************** +// TiMidity settings + +static BOOL CALLBACK SettingWndProc(HWND hwnd, UINT uMess, + WPARAM wParam, LPARAM lParam); +static HWND hComboOutput, hOutputEdit, hOutputRefBtn; + + +#define MAX_PLAY_MODE_LIST 8 +extern PlayMode w32_play_mode, wave_play_mode, raw_play_mode, au_play_mode, + aiff_play_mode; +static struct +{ + PlayMode *play_mode; + int32 orig_encoding; +} w32g_play_mode_list[] = +{ +{&w32_play_mode,0}, +{&wave_play_mode,0}, +{&au_play_mode,0}, +{&aiff_play_mode,0}, +{&raw_play_mode,0}, +{NULL,0} +}; + +static void InitSettingWnd(HWND hParentWnd) +{ + int i, selected, output_enabled; + + hSettingWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG_SETTING), + hParentWnd, SettingWndProc); + ShowWindow(hSettingWnd,SW_HIDE); + UpdateWindow(hSettingWnd); + + hComboOutput = GetDlgItem(hSettingWnd, IDC_COMBO_OUTPUT_MODE); + hOutputEdit = GetDlgItem(hSettingWnd, IDC_EDIT_OUTPUT_FILE); + hOutputRefBtn = GetDlgItem(hSettingWnd, IDC_BUTTON_REF); + + selected = 0; + for(i = 0; w32g_play_mode_list[i].play_mode != NULL; i++) + { + w32g_play_mode_list[i].orig_encoding = + w32g_play_mode_list[i].play_mode->encoding; + ComboBox_InsertString(hComboOutput, i, + w32g_play_mode_list[i].play_mode->id_name); + if(w32g_play_mode_list[i].play_mode->id_character == + play_mode->id_character) + selected = i; + } + ComboBox_SetCurSel(hComboOutput, selected); + SetDlgItemText(hSettingWnd, IDC_EDIT_OUTPUT_FILE, + play_mode->name ? play_mode->name : ""); + output_enabled = w32g_play_mode_list[selected].play_mode->id_character != 'd'; + EnableWindow(hOutputEdit, output_enabled); + EnableWindow(hOutputRefBtn, output_enabled); +} + +static void OpenSettingWnd(HWND hParentWnd) +{ + ShowWindow(hSettingWnd,SW_SHOW); + UpdateWindow(hSettingWnd); + SettingWndSetup(st_current); +} + +#define IS_CHECKED(hwnd, id) (SendDlgItemMessage(hwnd, id, BM_GETCHECK, 0, 0) == BST_CHECKED) +#define SET_CHECKED(hwnd, id, test) \ + if(test) \ + SendDlgItemMessage(hwnd, id, BM_SETCHECK, BST_CHECKED, 0); \ + else \ + SendDlgItemMessage(hwnd, id, BM_SETCHECK, BST_UNCHECKED, 0) + +static void SettingWndSetup(SETTING_TIMIDITY *st) +{ + char numstr[16]; + int flag[4]; + int i; + + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHORUS, st->opt_chorus_control); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_REVERB, st->opt_reverb_control); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_DELAY_EFFECT, st->effect_lr_mode != -1); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_FREE_INST, + st->free_instruments_afterwards); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_ANTIALIAS, st->antialiasing_allowed); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_MODWHEEL, st->opt_modulation_wheel); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_PORTAMENT, st->opt_portamento); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_NRPNVIB, st->opt_nrpn_vibrato); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHPRESS, st->opt_channel_pressure); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_OVOICE, st->opt_overlap_voice_allow); + SET_CHECKED(hSettingWnd, IDC_CHECKBOX_LOADINST_PLAYING, + st->opt_realtime_playing); + + /* Mono/Stereo */ + memset(flag, 0, sizeof(flag)); + if(strchr(st->opt_playmode + 1, 'M')) + flag[0] = 1; + else + flag[1] = 1; + SET_CHECKED(hSettingWnd, IDC_RADIO_MONO, flag[0]); + SET_CHECKED(hSettingWnd, IDC_RADIO_STEREO, flag[1]); + + /* 16/8/U/A */ + memset(flag, 0, sizeof(flag)); + if(strchr(st->opt_playmode + 1, '1')) + flag[0] = 1; + else if(strchr(st->opt_playmode + 1, 'U')) + flag[2] = 1; + else if(strchr(st->opt_playmode + 1, 'A')) + flag[3] = 1; + else + flag[1] = 1; + SET_CHECKED(hSettingWnd, IDC_RADIO_16BITS, flag[0]); + SET_CHECKED(hSettingWnd, IDC_RADIO_8BITS, flag[1]); + SET_CHECKED(hSettingWnd, IDC_RADIO_ULAW, flag[2]); + SET_CHECKED(hSettingWnd, IDC_RADIO_ALAW, flag[3]); + + /* Output Mode */ + for(i = 0; w32g_play_mode_list[i].play_mode != NULL; i++) + if(st->opt_playmode[0] == w32g_play_mode_list[i].play_mode->id_character) + break; + if(w32g_play_mode_list[i].play_mode == NULL) + i = 0; + ComboBox_SetCurSel(hComboOutput, i); + i = (w32g_play_mode_list[i].play_mode->id_character != 'd'); + EnableWindow(hOutputEdit, i); + EnableWindow(hOutputRefBtn, i); + + /* sample rate */ + sprintf(numstr, "%d", st->output_rate); + SetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, numstr); + + /* number of voices */ + sprintf(numstr, "%d", st->voices); + SetDlgItemText(hSettingWnd, IDC_EDIT_VOICES, numstr); + + /* Noise sharping */ + sprintf(numstr, "%d", st->noise_sharp_type); + SetDlgItemText(hSettingWnd, IDC_EDIT_NOISESHARPING, numstr); +} + +void SettingWndApply(void) +{ + char buff[BUFSIZ]; + extern void timidity_init_aq_buff(void); + int i, selected; + + st_current->opt_chorus_control = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_CHORUS); + st_current->opt_reverb_control = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_REVERB); + if(IS_CHECKED(hSettingWnd, IDC_CHECKBOX_DELAY_EFFECT)) + st_current->effect_lr_mode = 2; + else + st_current->effect_lr_mode = -1; + st_current->free_instruments_afterwards = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_FREE_INST); + st_current->antialiasing_allowed = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_ANTIALIAS); + st_current->opt_modulation_wheel = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_MODWHEEL); + st_current->opt_portamento = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_PORTAMENT); + st_current->opt_nrpn_vibrato = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_NRPNVIB); + st_current->opt_channel_pressure = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_CHPRESS); + st_current->opt_overlap_voice_allow = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_OVOICE); + st_current->opt_realtime_playing = + IS_CHECKED(hSettingWnd, IDC_CHECKBOX_LOADINST_PLAYING); + GetDlgItemText(hSettingWnd, IDC_EDIT_NOISESHARPING, buff, sizeof(buff)); + st_current->noise_sharp_type = atoi(buff); + GetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, buff, sizeof(buff)); + st_current->output_rate = atoi(buff); + GetDlgItemText(hSettingWnd, IDC_EDIT_VOICES, buff, sizeof(buff)); + st_current->voices = atoi(buff); + + selected = ComboBox_GetCurSel(hComboOutput); + i = 0; + st_current->opt_playmode[i++] = + w32g_play_mode_list[selected].play_mode->id_character; + if(IS_CHECKED(hSettingWnd, IDC_RADIO_16BITS)) + st_current->opt_playmode[i++] = '1'; + else if(IS_CHECKED(hSettingWnd, IDC_RADIO_8BITS)) + st_current->opt_playmode[i++] = '8'; + else if(IS_CHECKED(hSettingWnd, IDC_RADIO_ULAW)) + st_current->opt_playmode[i++] = 'U'; + else if(IS_CHECKED(hSettingWnd, IDC_RADIO_ALAW)) + st_current->opt_playmode[i++] = 'A'; + if(IS_CHECKED(hSettingWnd, IDC_RADIO_MONO)) + st_current->opt_playmode[i++] = 'M'; + else + st_current->opt_playmode[i++] = 'S'; + if(w32g_play_mode_list[selected].orig_encoding & PE_SIGNED) + st_current->opt_playmode[i++] = 's'; + else + st_current->opt_playmode[i++] = 'u'; + if(w32g_play_mode_list[selected].orig_encoding & PE_BYTESWAP) + st_current->opt_playmode[i++] = 'x'; + st_current->opt_playmode[i++] = '\0'; + + if(st_current->opt_playmode[0] == 'd') + st_current->OutputName[0] = '\0'; + else + { + GetDlgItemText(hSettingWnd, IDC_EDIT_OUTPUT_FILE, buff, sizeof(buff)); + strncpy(st_current->OutputName, buff, sizeof(st_current->OutputName)); + } + + free_instruments(1); + play_mode->close_output(); + + ApplySettingTiMidity(st_current); +} + +static void DlgSelectOutputFile(void) +{ + OPENFILENAME ofn; + static char pFileName[16536]; + char *dir; + static char *filter = NULL; +// "Midi file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36\0" +// "Archive file\0*.lzh;*.zip;*.gz;*.tgz\0" +// "All files\0*.*\0" +// "\0\0"; + if(w32g_lock_open_file) + return; + + memset(pFileName, 0, sizeof(pFileName)); + memset(&ofn, 0, sizeof(OPENFILENAME)); + if(MidiFileOpenDir[0]) + dir = MidiFileOpenDir; + else + dir = NULL; + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = 0; + ofn.hInstance = hInst; + ofn.lpstrFilter = filter; + ofn.lpstrCustomFilter= 0; + ofn.nMaxCustFilter = 1; + ofn.nFilterIndex = 1 ; + ofn.lpstrFile = pFileName; + ofn.nMaxFile = sizeof(pFileName); + ofn.lpstrFileTitle = 0; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = dir; + ofn.lpstrTitle = 0; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_HIDEREADONLY; + ofn.lpstrDefExt = 0; + ofn.lCustData = 0; + ofn.lpfnHook = 0; + ofn.lpTemplateName = 0; + + if(!GetSaveFileName(&ofn)) + return; + SetDlgItemText(hSettingWnd, IDC_EDIT_OUTPUT_FILE, pFileName); +} + +static BOOL CALLBACK SettingWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + static int setting_warning_displayed = 0; + + switch(uMess) + { + case WM_SHOWWINDOW: + if(wParam) + { + if(w32g_play_active && + !setting_warning_displayed) + w32g_msg_box("Don't change parameter while playing", + "Warning", MB_OK); + setting_warning_displayed = 1; + SettingWndSetup(st_current); + } + else + setting_warning_displayed = 0; + break; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDCANCEL: + ShowWindow(hSettingWnd, SW_HIDE); + break; + case IDOK: + w32g_send_rc(RC_EXT_APPLY_SETTING, 0); + ShowWindow(hSettingWnd, SW_HIDE); + break; + case IDDEFAULT: + SettingWndSetup(st_default); + break; + case IDC_COMBO_OUTPUT_MODE: { + int selected, output_enabled; + selected = ComboBox_GetCurSel(hComboOutput); + output_enabled = w32g_play_mode_list[selected].play_mode->id_character != 'd'; + EnableWindow(hOutputEdit, output_enabled); + EnableWindow(hOutputRefBtn, output_enabled); + } + break; + case IDC_BUTTON_REF: + DlgSelectOutputFile(); + break; + } + break; + + case WM_CLOSE: + ShowWindow(hSettingWnd, SW_HIDE); + break; + } + return 0; +} + +int w32g_msg_box(char *message, char *title, int type) +{ + return MessageBox(hMainWnd, message, title, type); +} diff -ruN TiMidity++-2.2.0/interface/w32g_ini.c TiMidity++-2.3.0/interface/w32g_ini.c --- TiMidity++-2.2.0/interface/w32g_ini.c Wed Mar 24 01:59:44 1999 +++ TiMidity++-2.3.0/interface/w32g_ini.c Sat Jul 31 22:07:12 1999 @@ -1,12 +1,92 @@ +/* + + TiMidity -- Experimental MIDI to WAVE converter + Copyright (C) 1999 Masanao Izumo + Copyright (C) 1995 Tuukka Toivonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + w32g_ini.c: written by Daisuke Aoki + Masanao Izumo +*/ + +#include +#include + #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ #include "timidity.h" +#include "common.h" +#include "output.h" #include "w32g.h" -#include "w32g_utl.h" + +#if MAX_CHANNELS > 32 /* FIXME */ +#error "MAX_CHANNELS > 32 is not supported Windows GUI version" +#endif + +int w32g_has_ini_file; + +static int str2mID(char *str) +{ + int i, v, val; + + if(strcmp(str + 1, "gs") == 0 || + strcmp(str + 1, "GS") == 0) + val = 0x41; + else if(strcmp(str + 1, "xg") == 0 || + strcmp(str + 1, "XG") == 0) + val = 0x43; + else if(strcmp(str + 1, "gm") == 0 || + strcmp(str + 1, "GM") == 0) + val = 0x7e; + else + { + val = 0; + for(i = 0; i < 2; i++) + { + v = str[i + 1]; + if('0' <= v && v <= '9') + v = v - '0'; + else if('A' <= v && v <= 'F') + v = v - 'A' + 10; + else if('a' <= v && v <= 'f') + v = v - 'a' + 10; + else + v = 0; + val = (val << 4 | v); + } + } + return val; +} + +static int32 str2size(char *str) +{ + int len = strlen(str); + if(str[len - 1] == 'k' || str[len - 1] == 'K') + return (int32)(1024.0 * atof(str)); + if(str[len - 1] == 'm' || str[len - 1] == 'M') + return (int32)(1024 * 1024 * atof(str)); + return atoi(str); +} void LoadIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st) { + char buff[1024]; + + /* [PLAYER] */ IniGetKeyInt(INI_SEC_PLAYER,"InitMinimizeFlag",&(sp->InitMinimizeFlag)); IniGetKeyInt(INI_SEC_PLAYER,"DebugWndStartFlag",&(sp->DebugWndStartFlag)); IniGetKeyInt(INI_SEC_PLAYER,"ConsoleWndStartFlag",&(sp->ConsoleWndStartFlag)); @@ -28,12 +108,8 @@ IniGetKeyStringN(INI_SEC_PLAYER,"MidiFileOpenDir",sp->MidiFileOpenDir,MAXPATH + 32); IniGetKeyStringN(INI_SEC_PLAYER,"ConfigFileOpenDir",sp->ConfigFileOpenDir,MAXPATH + 32); IniGetKeyStringN(INI_SEC_PLAYER,"PlaylistFileOpenDir",sp->PlaylistFileOpenDir,MAXPATH + 32); - IniGetKeyInt(INI_SEC_PLAYER,"ProcessPriority",&(sp->ProcessPriority)); IniGetKeyInt(INI_SEC_PLAYER,"PlayerThreadPriority",&(sp->PlayerThreadPriority)); - IniGetKeyInt(INI_SEC_PLAYER,"MidiPlayerThreadPriority",&(sp->MidiPlayerThreadPriority)); - IniGetKeyInt(INI_SEC_PLAYER,"MainThreadPriority",&(sp->MainThreadPriority)); - IniGetKeyInt(INI_SEC_PLAYER,"TracerThreadPriority",&(sp->TracerThreadPriority)); - IniGetKeyInt(INI_SEC_PLAYER,"WrdThreadPriority",&(sp->WrdThreadPriority)); + IniGetKeyInt(INI_SEC_PLAYER,"GUIThreadPriority",&(sp->GUIThreadPriority)); IniGetKeyStringN(INI_SEC_PLAYER,"SystemFont",sp->SystemFont,256); IniGetKeyStringN(INI_SEC_PLAYER,"PlayerFont",sp->PlayerFont,256); IniGetKeyStringN(INI_SEC_PLAYER,"WrdFont",sp->WrdFont,256); @@ -50,66 +126,63 @@ IniGetKeyInt(INI_SEC_PLAYER,"TraceGraphicFlag",&(sp->TraceGraphicFlag)); IniGetKeyInt(INI_SEC_PLAYER,"DocMaxSize",&(sp->DocMaxSize)); IniGetKeyStringN(INI_SEC_PLAYER,"DocFileExt",sp->DocFileExt,256); - - IniGetKeyInt(INI_SEC_TIMIDITY,"free_instruments_afterwards",&(st->free_instruments_afterwards)); - IniGetKeyInt(INI_SEC_TIMIDITY,"effect_lr_mode",&(st->effect_lr_mode)); - IniGetKeyInt(INI_SEC_TIMIDITY,"effect_lr_delay_msec",&(st->effect_lr_delay_msec)); -#if MAX_CHANNELS <= 32 - IniGetKeyInt32(INI_SEC_TIMIDITY,"quietchannels",(int32 *)&(st->quietchannels)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"drumchannels",(int32 *)&(st->drumchannels)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"drumchannel_mask",(int32 *)&(st->drumchannel_mask)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"default_drumchannels",(int32 *)&(st->default_drumchannels)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"default_drumchannel_mask",(int32 *)&(st->default_drumchannel_mask)); -#else /* FIXME */ -#error "MAX_CHANNELS > 32 is not supported Windows GUI version" -#endif - - - IniGetKeyChar(INI_SEC_TIMIDITY,"play_mode_id_character",&(st->play_mode_id_character)); - IniGetKeyInt(INI_SEC_TIMIDITY,"play_mode_encoding",&(st->play_mode_encoding)); - IniGetKeyChar(INI_SEC_TIMIDITY,"pmp_id_character",&(st->pmp_id_character)); - IniGetKeyStringN(INI_SEC_TIMIDITY,"OutputName",st->OutputName,MAXPATH + 32); - IniGetKeyInt(INI_SEC_TIMIDITY,"antialiasing_allowed",&(st->antialiasing_allowed)); - IniGetKeyInt(INI_SEC_TIMIDITY,"fast_decay",&(st->fast_decay)); - IniGetKeyInt(INI_SEC_TIMIDITY,"adjust_panning_immediately",&(st->adjust_panning_immediately)); - IniGetKeyInt(INI_SEC_TIMIDITY,"output_rate",&(st->output_rate)); - IniGetKeyIntArray(INI_SEC_TIMIDITY,"default_program",st->default_program,MAX_CHANNELS); + /* [TIMIDITY] */ IniGetKeyInt32(INI_SEC_TIMIDITY,"amplification",&(st->amplification)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"control_ratio",&(st->control_ratio)); - IniGetKeyInt(INI_SEC_TIMIDITY,"voices",&(st->voices)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"modify_release",&(st->modify_release)); - IniGetKeyInt(INI_SEC_TIMIDITY,"view_soundspec_flag",&(st->view_soundspec_flag)); - IniGetKeyInt32(INI_SEC_TIMIDITY,"allocate_cache_size",&(st->allocate_cache_size)); - IniGetKeyStringN(INI_SEC_TIMIDITY,"allocate_chace_size_string",st->allocate_chace_size_string,64); - IniGetKeyInt(INI_SEC_TIMIDITY,"ctl_verbosity",&(st->ctl_verbosity)); - IniGetKeyChar(INI_SEC_TIMIDITY,"ctl_id_character",&(st->ctl_id_character)); - IniGetKeyInt(INI_SEC_TIMIDITY,"ctl_trace_playing",&(st->ctl_trace_playing)); + IniGetKeyInt(INI_SEC_TIMIDITY,"antialiasing_allowed",&(st->antialiasing_allowed)); IniGetKeyInt(INI_SEC_TIMIDITY,"buffer_fragments",&(st->buffer_fragments)); - IniGetKeyStringN(INI_SEC_TIMIDITY,"output_text_code",st->output_text_code,64); + IniGetKeyInt32(INI_SEC_TIMIDITY,"control_ratio",&(st->control_ratio)); + IniGetKeyInt32(INI_SEC_TIMIDITY,"default_drumchannels",(int32 *)&(st->default_drumchannels)); + IniGetKeyInt32(INI_SEC_TIMIDITY,"default_drumchannel_mask",(int32 *)&(st->default_drumchannel_mask)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_modulation_wheel",&(st->opt_modulation_wheel)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_portamento",&(st->opt_portamento)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_nrpn_vibrato",&(st->opt_nrpn_vibrato)); - IniGetKeyInt(INI_SEC_TIMIDITY,"opt_reverb_control",&(st->opt_reverb_control)); - IniGetKeyInt(INI_SEC_TIMIDITY,"opt_chorus_control",&(st->opt_chorus_control)); - IniGetKeyIntArray(INI_SEC_TIMIDITY,"opt_chorus_control2",st->opt_chorus_control2,MAX_CHANNELS); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_channel_pressure",&(st->opt_channel_pressure)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_trace_text_meta_event",&(st->opt_trace_text_meta_event)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_overlap_voice_allow",&(st->opt_overlap_voice_allow)); - IniGetKeyInt(INI_SEC_TIMIDITY,"opt_default_mid",&(st->opt_default_mid)); - IniGetKeyIntArray(INI_SEC_TIMIDITY,"opt_default_mid_str",st->opt_default_mid_str,64); + IniGetKeyStringN(INI_SEC_TIMIDITY,"opt_default_mid",buff,sizeof(buff)); + st->opt_default_mid = str2mID(buff); IniGetKeyInt(INI_SEC_TIMIDITY,"default_tonebank",&(st->default_tonebank)); IniGetKeyInt(INI_SEC_TIMIDITY,"special_tonebank",&(st->special_tonebank)); + IniGetKeyInt(INI_SEC_TIMIDITY,"effect_lr_mode",&(st->effect_lr_mode)); + IniGetKeyInt(INI_SEC_TIMIDITY,"effect_lr_delay_msec",&(st->effect_lr_delay_msec)); + IniGetKeyInt(INI_SEC_TIMIDITY,"opt_reverb_control",&(st->opt_reverb_control)); + IniGetKeyInt(INI_SEC_TIMIDITY,"opt_chorus_control",&(st->opt_chorus_control)); + IniGetKeyInt(INI_SEC_TIMIDITY,"noise_sharp_type",&(st->noise_sharp_type)); + IniGetKeyInt(INI_SEC_TIMIDITY,"opt_evil_mode",&(st->opt_evil_mode)); + IniGetKeyInt(INI_SEC_TIMIDITY,"adjust_panning_immediately",&(st->adjust_panning_immediately)); + IniGetKeyInt(INI_SEC_TIMIDITY,"fast_decay",&(st->fast_decay)); +#ifdef SUPPORT_SOUNDSPEC + IniGetKeyInt(INI_SEC_TIMIDITY,"view_soundspec_flag",&(st->view_soundspec_flag)); + IniGetKeyFloat(INI_SEC_TIMIDITY,"spectrogram_update_sec",&v_float); + st->spectrogram_update_sec = v_float; +#endif + IniGetKeyIntArray(INI_SEC_TIMIDITY,"default_program",st->default_program,MAX_CHANNELS); + IniGetKeyStringN(INI_SEC_TIMIDITY,"opt_ctl",st->opt_ctl,sizeof(st->opt_ctl)); IniGetKeyInt(INI_SEC_TIMIDITY,"opt_realtime_playing",&(st->opt_realtime_playing)); + IniGetKeyInt(INI_SEC_TIMIDITY,"reduce_voice_threshold",&(st->reduce_voice_threshold)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"opt_playmode",st->opt_playmode,sizeof(st->opt_playmode)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"OutputName",st->OutputName,sizeof(st->OutputName)); + IniGetKeyInt(INI_SEC_TIMIDITY,"voices",&(st->voices)); + IniGetKeyInt32(INI_SEC_TIMIDITY,"quietchannels",(int32 *)&(st->quietchannels)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"opt_qsize",st->opt_qsize,sizeof(st->opt_qsize)); + IniGetKeyInt32(INI_SEC_TIMIDITY,"modify_release",&(st->modify_release)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"allocate_cache_size",buff,sizeof(buff)); + st->allocate_cache_size = str2size(buff); + IniGetKeyInt(INI_SEC_TIMIDITY,"output_rate",&(st->output_rate)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"output_text_code",st->output_text_code,sizeof(st->output_text_code)); + IniGetKeyInt(INI_SEC_TIMIDITY,"free_instruments_afterwards",&(st->free_instruments_afterwards)); + IniGetKeyStringN(INI_SEC_TIMIDITY,"out_wrd",st->opt_wrd,sizeof(st->opt_wrd)); +#if defined(__W32__) && defined(SMFCONV) IniGetKeyInt(INI_SEC_TIMIDITY,"opt_rcpcv_dll",&(st->opt_rcpcv_dll)); - IniGetKeyChar(INI_SEC_TIMIDITY,"wrdt_id",&(st->wrdt_id)); - IniGetKeyStringN(INI_SEC_TIMIDITY,"wrdt_open_opts",st->wrdt_open_opts,64); - IniGetKeyInt(INI_SEC_TIMIDITY,"noise_sharp_type",&(st->noise_sharp_type)); +#endif } void SaveIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st) { + /* [PLAYER] */ + IniPutKeyString(INI_SEC_PLAYER,"IniVersion",IniVersion); IniPutKeyInt(INI_SEC_PLAYER,"InitMinimizeFlag",&(sp->InitMinimizeFlag)); IniPutKeyInt(INI_SEC_PLAYER,"DebugWndStartFlag",&(sp->DebugWndStartFlag)); IniPutKeyInt(INI_SEC_PLAYER,"ConsoleWndStartFlag",&(sp->ConsoleWndStartFlag)); @@ -131,12 +204,8 @@ IniPutKeyStringN(INI_SEC_PLAYER,"MidiFileOpenDir",sp->MidiFileOpenDir,MAXPATH + 32); IniPutKeyStringN(INI_SEC_PLAYER,"ConfigFileOpenDir",sp->ConfigFileOpenDir,MAXPATH + 32); IniPutKeyStringN(INI_SEC_PLAYER,"PlaylistFileOpenDir",sp->PlaylistFileOpenDir,MAXPATH + 32); - IniPutKeyInt(INI_SEC_PLAYER,"ProcessPriority",&(sp->ProcessPriority)); IniPutKeyInt(INI_SEC_PLAYER,"PlayerThreadPriority",&(sp->PlayerThreadPriority)); - IniPutKeyInt(INI_SEC_PLAYER,"MidiPlayerThreadPriority",&(sp->MidiPlayerThreadPriority)); - IniPutKeyInt(INI_SEC_PLAYER,"MainThreadPriority",&(sp->MainThreadPriority)); - IniPutKeyInt(INI_SEC_PLAYER,"TracerThreadPriority",&(sp->TracerThreadPriority)); - IniPutKeyInt(INI_SEC_PLAYER,"WrdThreadPriority",&(sp->WrdThreadPriority)); + IniPutKeyInt(INI_SEC_PLAYER,"GUIThreadPriority",&(sp->GUIThreadPriority)); IniPutKeyStringN(INI_SEC_PLAYER,"SystemFont",sp->SystemFont,256); IniPutKeyStringN(INI_SEC_PLAYER,"PlayerFont",sp->PlayerFont,256); IniPutKeyStringN(INI_SEC_PLAYER,"WrdFont",sp->WrdFont,256); @@ -153,61 +222,56 @@ IniPutKeyInt(INI_SEC_PLAYER,"TraceGraphicFlag",&(sp->TraceGraphicFlag)); IniPutKeyInt(INI_SEC_PLAYER,"DocMaxSize",&(sp->DocMaxSize)); IniPutKeyStringN(INI_SEC_PLAYER,"DocFileExt",sp->DocFileExt,256); - - IniPutKeyInt(INI_SEC_TIMIDITY,"free_instruments_afterwards",&(st->free_instruments_afterwards)); - - IniPutKeyInt(INI_SEC_TIMIDITY,"effect_lr_mode",&(st->effect_lr_mode)); - IniPutKeyInt(INI_SEC_TIMIDITY,"effect_lr_delay_msec",&(st->effect_lr_delay_msec)); - -#if MAX_CHANNELS <= 32 - IniPutKeyInt32(INI_SEC_TIMIDITY,"quietchannels",(int32 *)&(st->quietchannels)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"drumchannels",(int32 *)&(st->drumchannels)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"drumchannel_mask",(int32 *)&(st->drumchannel_mask)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"default_drumchannels",(int32 *)&(st->default_drumchannels)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"default_drumchannel_mask",(int32 *)&(st->default_drumchannel_mask)); -#else /* FIXME */ -#error "MAX_CHANNELS > 32 is not supported Windows GUI version" -#endif - IniPutKeyChar(INI_SEC_TIMIDITY,"play_mode_id_character",&(st->play_mode_id_character)); - IniPutKeyInt(INI_SEC_TIMIDITY,"play_mode_encoding",&(st->play_mode_encoding)); - IniPutKeyChar(INI_SEC_TIMIDITY,"pmp_id_character",&(st->pmp_id_character)); - IniPutKeyStringN(INI_SEC_TIMIDITY,"OutputName",st->OutputName,MAXPATH + 32); - IniPutKeyInt(INI_SEC_TIMIDITY,"antialiasing_allowed",&(st->antialiasing_allowed)); - IniPutKeyInt(INI_SEC_TIMIDITY,"fast_decay",&(st->fast_decay)); - IniPutKeyInt(INI_SEC_TIMIDITY,"adjust_panning_immediately",&(st->adjust_panning_immediately)); - IniPutKeyInt(INI_SEC_TIMIDITY,"output_rate",&(st->output_rate)); - IniPutKeyIntArray(INI_SEC_TIMIDITY,"default_program",st->default_program,MAX_CHANNELS); + /* [TIMIDITY] */ IniPutKeyInt32(INI_SEC_TIMIDITY,"amplification",&(st->amplification)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"control_ratio",&(st->control_ratio)); - IniPutKeyInt(INI_SEC_TIMIDITY,"voices",&(st->voices)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"modify_release",&(st->modify_release)); - IniPutKeyInt(INI_SEC_TIMIDITY,"view_soundspec_flag",&(st->view_soundspec_flag)); - IniPutKeyInt32(INI_SEC_TIMIDITY,"allocate_cache_size",&(st->allocate_cache_size)); - IniPutKeyStringN(INI_SEC_TIMIDITY,"allocate_chace_size_string",st->allocate_chace_size_string,64); - IniPutKeyInt(INI_SEC_TIMIDITY,"ctl_verbosity",&(st->ctl_verbosity)); - IniPutKeyChar(INI_SEC_TIMIDITY,"ctl_id_character",&(st->ctl_id_character)); - IniPutKeyInt(INI_SEC_TIMIDITY,"ctl_trace_playing",&(st->ctl_trace_playing)); + IniPutKeyInt(INI_SEC_TIMIDITY,"antialiasing_allowed",&(st->antialiasing_allowed)); IniPutKeyInt(INI_SEC_TIMIDITY,"buffer_fragments",&(st->buffer_fragments)); - IniPutKeyStringN(INI_SEC_TIMIDITY,"output_text_code",st->output_text_code,64); + IniPutKeyInt32(INI_SEC_TIMIDITY,"control_ratio",&(st->control_ratio)); + IniPutKeyInt32(INI_SEC_TIMIDITY,"default_drumchannels",(int32 *)&(st->default_drumchannels)); + IniPutKeyInt32(INI_SEC_TIMIDITY,"default_drumchannel_mask",(int32 *)&(st->default_drumchannel_mask)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_modulation_wheel",&(st->opt_modulation_wheel)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_portamento",&(st->opt_portamento)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_nrpn_vibrato",&(st->opt_nrpn_vibrato)); - IniPutKeyInt(INI_SEC_TIMIDITY,"opt_reverb_control",&(st->opt_reverb_control)); - IniPutKeyInt(INI_SEC_TIMIDITY,"opt_chorus_control",&(st->opt_chorus_control)); - IniPutKeyIntArray(INI_SEC_TIMIDITY,"opt_chorus_control2",st->opt_chorus_control2,MAX_CHANNELS); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_channel_pressure",&(st->opt_channel_pressure)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_trace_text_meta_event",&(st->opt_trace_text_meta_event)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_overlap_voice_allow",&(st->opt_overlap_voice_allow)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_default_mid",&(st->opt_default_mid)); - IniPutKeyIntArray(INI_SEC_TIMIDITY,"opt_default_mid_str",st->opt_default_mid_str,64); IniPutKeyInt(INI_SEC_TIMIDITY,"default_tonebank",&(st->default_tonebank)); IniPutKeyInt(INI_SEC_TIMIDITY,"special_tonebank",&(st->special_tonebank)); + IniPutKeyInt(INI_SEC_TIMIDITY,"effect_lr_mode",&(st->effect_lr_mode)); + IniPutKeyInt(INI_SEC_TIMIDITY,"effect_lr_delay_msec",&(st->effect_lr_delay_msec)); + IniPutKeyInt(INI_SEC_TIMIDITY,"opt_reverb_control",&(st->opt_reverb_control)); + IniPutKeyInt(INI_SEC_TIMIDITY,"opt_chorus_control",&(st->opt_chorus_control)); + IniPutKeyInt(INI_SEC_TIMIDITY,"noise_sharp_type",&(st->noise_sharp_type)); + IniPutKeyInt(INI_SEC_TIMIDITY,"opt_evil_mode",&(st->opt_evil_mode)); + IniPutKeyInt(INI_SEC_TIMIDITY,"adjust_panning_immediately",&(st->adjust_panning_immediately)); + IniPutKeyInt(INI_SEC_TIMIDITY,"fast_decay",&(st->fast_decay)); +#ifdef SUPPORT_SOUNDSPEC + IniPutKeyInt(INI_SEC_TIMIDITY,"view_soundspec_flag",&(st->view_soundspec_flag)); + v_float = st->spectrogram_update_sec; + IniPutKeyFloat(INI_SEC_TIMIDITY,"spectrogram_update_sec",&v_float); +#endif + IniPutKeyIntArray(INI_SEC_TIMIDITY,"default_program",st->default_program,MAX_CHANNELS); + IniPutKeyStringN(INI_SEC_TIMIDITY,"opt_ctl",st->opt_ctl,sizeof(st->opt_ctl)); IniPutKeyInt(INI_SEC_TIMIDITY,"opt_realtime_playing",&(st->opt_realtime_playing)); + IniPutKeyInt(INI_SEC_TIMIDITY,"reduce_voice_threshold",&(st->reduce_voice_threshold)); + IniPutKeyStringN(INI_SEC_TIMIDITY,"opt_playmode",st->opt_playmode,sizeof(st->opt_playmode)); + IniPutKeyStringN(INI_SEC_TIMIDITY,"OutputName",st->OutputName,sizeof(st->OutputName)); + IniPutKeyInt(INI_SEC_TIMIDITY,"voices",&(st->voices)); + IniPutKeyInt32(INI_SEC_TIMIDITY,"quietchannels",(int32 *)&(st->quietchannels)); + IniPutKeyStringN(INI_SEC_TIMIDITY,"opt_qsize",st->opt_qsize,sizeof(st->opt_qsize)); + IniPutKeyInt32(INI_SEC_TIMIDITY,"modify_release",&(st->modify_release)); + IniPutKeyInt32(INI_SEC_TIMIDITY,"allocate_cache_size",&(st->allocate_cache_size)); + IniPutKeyInt(INI_SEC_TIMIDITY,"output_rate",&(st->output_rate)); + if(st->output_rate == 0) + st->output_rate = play_mode->rate; + IniPutKeyStringN(INI_SEC_TIMIDITY,"output_text_code",st->output_text_code,sizeof(st->output_text_code)); + IniPutKeyInt(INI_SEC_TIMIDITY,"free_instruments_afterwards",&(st->free_instruments_afterwards)); + IniPutKeyStringN(INI_SEC_TIMIDITY,"out_wrd",st->opt_wrd,sizeof(st->opt_wrd)); +#if defined(__W32__) && defined(SMFCONV) IniPutKeyInt(INI_SEC_TIMIDITY,"opt_rcpcv_dll",&(st->opt_rcpcv_dll)); - IniPutKeyChar(INI_SEC_TIMIDITY,"wrdt_id",&(st->wrdt_id)); - IniPutKeyStringN(INI_SEC_TIMIDITY,"wrdt_open_opts",st->wrdt_open_opts,64); - IniPutKeyInt(INI_SEC_TIMIDITY,"noise_sharp_type",&(st->noise_sharp_type)); +#endif } diff -ruN TiMidity++-2.2.0/interface/w32g_main.c TiMidity++-2.3.0/interface/w32g_main.c --- TiMidity++-2.2.0/interface/w32g_main.c Fri Apr 16 18:32:57 1999 +++ TiMidity++-2.3.0/interface/w32g_main.c Thu Jan 1 09:00:00 1970 @@ -1,3920 +0,0 @@ -/* - TiMidity++ -- MIDI to WAVE converter and player - Copyright (C) 1999 Masanao Izumo - Copyright (C) 1995 Tuukka Toivonen - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - w32g_main.c: Written by Daisuke Aoki - Modified by Masanao Izumo -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif /* HAVE_CONFIG_H */ -#include -#include -#include -#include -#include - -#ifndef NO_STRING_H -#include -#else -#include -#endif -//#include - -#include "timidity.h" -#include "common.h" -#include "instrum.h" -#include "playmidi.h" -#include "readmidi.h" -#include "output.h" -#include "controls.h" -#include "tables.h" -#include "miditrace.h" -#include "reverb.h" -#ifdef SUPPORT_SOUNDSPEC -#include "soundspec.h" -#endif /* SUPPORT_SOUNDSPEC */ -#include "recache.h" -#include "arc.h" -#include "strtab.h" -#include "wrd.h" -#include "mid.defs" -#include "w32g.h" -#include "w32g_main.h" -#include "w32g_res.h" -#include "w32g_utl.h" -#include "w32g_c.h" -// #include /* FIXME */ -#if defined(__CYGWIN32__) || defined(__MINGW32__) -WINAPI void InitCommonControls(void); -#endif - -#define W32ENABLE_OPTIONS - -extern int read_config_file(char *name, int self); -extern void timidity_init_player(void); -extern void timidity_start_initialize(void); -static void OpenSettingWnd(HWND hParentWnd); -static void SettingWndSetup(void); -static void SettingWndDefault(void); - -//static void CmdLineToArgv(LPSTR lpCmdLine, int *argc, CHAR ***argv); - - -#ifndef CLR_INVALID -#define CLR_INVALID 0xffffffff -#endif /* CLR_INVALID */ -extern int optind; - -#define TMS_REPEAT 10 -#define SAFE_SET(x,y) while(((x)=(y))==0); -#define SAFE_NOT(x,y) while((x)==(y)); -#define SAFE_SET_NOT_NULL_REPEAT(x,y,n) \ - { int i521342 = n; for(i521342=(z);i521342>0&&((x)=(y))==NULL;i521342--);} -#define SAFE_SET_NOT_NULL_REPEATX(x,y) \ - { int i521342 = TMS_REPEAT; for(i521342=(z);i521342>0&&((x)=(y))==NULL;i521342--);} -#define SAFE_NOT_NULL_REPEAT(x,n) \ - { int i521342 = n; for(i521342=(z);i521342>0&&(x)==NULL;i521342--);} -#define SAFE_NOT_NULL_REPEATX(x) \ - { int i521342 = TMS_REPEAT; for(i521342=(z);i521342>0&&(x)==NULL;i521342--);} - -#ifdef W32GUI_DEBUG - #define SAFE_NOT(x,y) \ - while((x)==(y)) PrintfDebugWnd("Error : %lu",GetLastError()); - #define SAFE_NOT_TYPE(x,y,typestr) \ - while((x)==(y)) PrintfDebugWnd("Error(%s) : %lu",typestr,GetLastError()); - #define SAFE_SET_NOT(x,y,z) \ - while(((x)=(y))==(z)) PrintfDebugWnd("Error : %lu",GetLastError()); - #define SAFE_SET_NOT_TYPE(x,y,z,typestr) \ - while(((x)=(y))==(z)) PrintfDebugWnd("Error(%s) : %lu",typestr,GetLastError()); - #define SAFE_SET_NOT2(x,y,z1,z2) \ - while((x)=(y),(x)==(z1)||(x)==(z2)) PrintfDebugWnd("Error : %lu",GetLastError()); - #define SAFE_SET_NOT2_TYPE(x,y,z1,z2,typestr) \ - while(((x)=(y))==0,(x)==(z1)||(x)==(z2)) PrintfDebugWnd("Error(%s) : %lu",typestr,GetLastError()); -#else - #define SAFE_NOT(x,y) while((x)==(y)); - #define SAFE_NOT_TYPE(x,y,typestr) while((x)==(y)); - #define SAFE_SET_NOT(x,y,z) while(((x)=(y))==(z)); - #define SAFE_SET_NOT4(x,y,z,typestr) while(((x)=(y))==(z)); - #define SAFE_SET_NOT2(x,y,z1,z2) while((x)=(y),(x)==(z1)||(x)==(z2)); - #define SAFE_SET_NOT2_TYPE(x,y,z1,z2,typestr) while((x)=(y),(x)==(z1)||(x)==(z2)); -#endif - #define SAFE_SET_NOT_NULL(x,y) SAFE_SET_NOT(x,y,NULL) - #define SAFE_SET_NOT_NULL_TYPE(x,y,typestr) SAFE_SET_NOT_TYPE(x,y,NULL,typestr) - -HINSTANCE hInst ; - -// HWND -HWND hStartWnd = 0; -HWND hMainWnd = 0; -HWND hDebugWnd = 0; -HWND hConsoleWnd = 0; -HWND hTracerWnd = 0; -HWND hDocWnd = 0; -HWND hListWnd = 0; -HWND hWrdWnd = 0; -HWND hSoundSpecWnd = 0; -static HWND hSettingWnd = 0; - -// Main Thread. -HANDLE hMainThread = 0; -DWORD dwMainThreadID = 0; -static volatile int wait_thread_flag = 1; -typedef struct MAINTHREAD_ARGS_ { - int *pArgc; - char ***pArgv; -} MAINTHREAD_ARGS; -void MainThread(void *arglist); - -int InitMinimizeFlag = 0; - -int DebugWndStartFlag = 1; -int ConsoleWndStartFlag = 0; -int ListWndStartFlag = 0; -int TracerWndStartFlag = 0; -int DocWndStartFlag = 0; -int WrdWndStartFlag = 0; - -int DebugWndFlag = 1; -int ConsoleWndFlag = 1; -int ListWndFlag = 1; -int TracerWndFlag = 0; -int DocWndFlag = 0; -int WrdWndFlag = 0; -int SoundSpecWndFlag = 0; - -char *IniFile; -char *ConfigFile; -char *PlaylistFile; -char *PlaylistHistoryFile; -char *MidiFileOpenDir; -char *ConfigFileOpenDir; -char *PlaylistFileOpenDir; - -int ProcessPriority; -int PlayerThreadPriority; -int MidiPlayerThreadPriority; -int MainThreadPriority; -int TracerThreadPriority; -int WrdThreadPriority; - -int WrdGraphicFlag; -int TraceGraphicFlag; - -int DocMaxSize; -char *DocFileExt; - -HWND hDebugEditWnd = 0; -HWND hDocEditWnd = 0; -/* WinMain */ -int w32gui_main(int argc, char **argv) -{ - MSG msg; -// int argc; -// CHAR **argv = NULL; -// CmdLineToArgv(lpCmdLine,&argc,&argv); - -// prevent several instances from being launched -// if( (hPrevWnd = FindWindow(StartWndClassName,0)) != 0 ){ -// BringWindowToTop( hPrevWnd ); -// return 0; -// } - - hInst = GetModuleHandle(0); - InitCommonControls(); - w32g_initialize(); - - SaveSettingPlayer(sp_temp); // Initialize sp_temp - LoadIniFile(sp_temp,st_temp); - ApplySettingPlayer(sp_temp); // At first, apply only player setting - -// Main thread (1) - { - MAINTHREAD_ARGS arglist; -#if !(defined(__CYGWIN32__) || defined(__MINGW32__)) - SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE}; -#endif - arglist.pArgc = &argc; - arglist.pArgv = &argv; - -#if defined(__CYGWIN32__) || defined(__MINGW32__) - hMainThread = - CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE)MainThread, - &arglist, 0, &dwMainThreadID); -#else - hMainThread = (HANDLE)_beginthreadNT(MainThread,0,(void *)&arglist, - &sa,CREATE_SUSPENDED,&dwMainThreadID); -#endif - } - - while(wait_thread_flag) - { - VOLATILE_TOUCH(wait_thread_flag); - Sleep(100); - } - -// Window thread (2) - InitStartWnd(SW_HIDE); - -// message loop for the application - while( GetMessage(&msg,NULL,0,0) ){ -// HandleFastSearch(msg); -//PrintfDebugWnd("H%lu M%lu WP%lu LP%lu T%lu x%d y%d\n", -// msg.hwnd, msg.message, msg.wParam, msg.lParam, msg.time, msg.pt.x, msg.pt.y); - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return (msg.wParam); // Returns the value from PostQuitMessage -} - -// *************************************************************************** -// System Function - -void OnExit(void) -{ - PostQuitMessage(0) ; -} - -void OnDestroy(void) -{ - PlayerOnStop(); - w32g_finish_ctl(); - PlayerOnKill(); - OnExit(); -} - -// *************************************************************************** -// Start Window - -#define STARTWND_XSIZE 100 -#define STARTWND_YSIZE 100 -static char StartWndClassName[] = "TiMidity_Win32GUI"; - -static LRESULT CALLBACK StartWinProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitStartWnd(int nCmdShow) -{ - WNDCLASS wndclass ; - - wndclass.style = CS_HREDRAW | CS_VREDRAW ; - wndclass.lpfnWndProc = StartWinProc ; - wndclass.cbClsExtra = 0 ; - wndclass.cbWndExtra = 0 ; - wndclass.hInstance = hInst ; - wndclass.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON_TIMIDITY)) ; - wndclass.hCursor = LoadCursor(0,IDC_ARROW) ; - wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = StartWndClassName; - - RegisterClass(&wndclass); - hStartWnd = CreateWindowEx(WS_EX_DLGMODALFRAME,StartWndClassName,0, - WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN , - CW_USEDEFAULT,0,STARTWND_XSIZE,STARTWND_YSIZE,0,0,hInst,0); - ShowWindow(hStartWnd,SW_HIDE); -// ShowWindow(hStartWnd,nCmdShow); - UpdateWindow(hStartWnd); -} - -LRESULT CALLBACK -StartWinProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - LRESULT res; - - switch (uMess) - { - HANDLE_MSG(hwnd,WM_CLOSE,DestroyWindow); - case WM_DESTROY: - OnDestroy(); - break; - case WM_CREATE: -#ifdef W32GUI_DEBUG - InitDebugWnd(hwnd); - while(!IsWindow(hDebugEditWnd)); -#endif - InitMainWnd(hwnd); - InitConsoleWnd(hwnd); - InitListWnd(hwnd); - InitTracerWnd(hwnd); - InitDocWnd(hwnd); - InitWrdWnd(hwnd); - InitSoundSpecWnd(hwnd); - while(!IsWindow(hConsoleWnd)); - ResumeThread(hMainThread); - break; - default: - if(uMess == WM_ACTIVATEAPP) - break; - res = DefWindowProc(hwnd,uMess,wParam,lParam); - return res; - } - return 0L; -} - -/*****************************************************************************/ -// Main Window - -#define SWS_EXIST 0x0001 -#define SWS_ICON 0x0002 -#define SWS_HIDE 0x0004 -typedef struct SUBWINDOW_ { - HWND *hwnd; - int status; -} SUBWINDOW; -SUBWINDOW subwindow[] = -{ - {&hConsoleWnd,0}, - {&hListWnd,0}, - {&hTracerWnd,0}, - {&hDocWnd,0}, - {&hWrdWnd,0}, - {&hSoundSpecWnd,0}, - {NULL,0} -}; - -int SubWindowMax = 2; -SUBWINDOW SubWindowHistory[] = -{ - {&hConsoleWnd,0}, - {&hListWnd,0}, - {&hTracerWnd,0}, - {&hDocWnd,0}, - {&hWrdWnd,0}, - {&hSoundSpecWnd,0}, - {NULL,0} -}; - -BOOL CALLBACK MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); - -void update_subwindow(void); -void OnShow(void); -void OnHide(void); - -void InitMainWnd(HWND hParentWnd) -{ -// FIXME - HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_TIMIDITY)); -// HICON hIcon = LoadIcon(NULL, IDI_APPLICATION); - hMainWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),hParentWnd,MainProc); - if ( hIcon != NULL) SendMessage( hMainWnd, WM_SETICON, FALSE, (LPARAM)hIcon); -} - -void MainCmdProc(HWND hwnd, int wId, HWND hwndCtl, UINT wNotifyCode); - -void MainWndSetPauseButton(int flag); -void MainWndSetPlayButton(int flag); - -void MainWndToggleConsoleButton(void); -void MainWndUpdateConsoleButton(void); -void MainWndToggleTracerButton(void); -void MainWndUpdateTracerButton(void); -void MainWndToggleListButton(void); -void MainWndUpdateListButton(void); -void MainWndToggleDocButton(void); -void MainWndUpdateDocButton(void); -void MainWndToggleWrdButton(void); -void MainWndUpdateWrdButton(void); -void MainWndToggleSoundSpecButton(void); -void MainWndUpdateSoundSpecButton(void); - -void ShowSubWindow(HWND hwnd,int showflag); -void ToggleSubWindow(HWND hwnd); - -static void VersionWnd(HWND hParentWnd); -static void TiMidityWnd(HWND hParentWnd); - -static void InitCanvasWnd(HWND hwnd); -static void TmCanvasInit(HWND hwnd); -static void InitPanelWnd(HWND hwnd); -static void TmPanelInit(HWND hwnd); - -static void InitMainToolbar(HWND hwnd); -#define IDM_STOP 12501 -#define IDM_PAUSE 12502 -#define IDM_PREV 12503 -#define IDM_FOREWARD 12504 -#define IDM_PLAY 12505 -#define IDM_BACKWARD 12506 -#define IDM_NEXT 12507 -static void InitSubWndToolbar(HWND hwnd); -#define IDM_CONSOLE 12511 -#define IDM_LIST 12512 -#define IDM_TRACER 12513 -#define IDM_DOC 12514 -#define IDM_WRD 12515 -#define IDM_SOUNDSPEC 12516 - -HICON hiconstop = 0; - -BOOL CALLBACK -MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - HDROP hDrop; - switch (uMess) - { - case WM_INITDIALOG: - update_subwindow(); - MainWndUpdateConsoleButton(); - MainWndUpdateTracerButton(); - MainWndUpdateListButton(); - MainWndUpdateDocButton(); - MainWndUpdateWrdButton(); - MainWndUpdateSoundSpecButton(); - MainWndScrollbarProgressInit(); - InitPanelWnd(hwnd); - InitCanvasWnd(hwnd); - InitMainToolbar(hwnd); - InitSubWndToolbar(hwnd); - { - HMENU hMenu = GetSystemMenu(hwnd, FALSE); - EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED); - EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED); - EnableMenuItem(hMenu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0); - InsertMenu(hMenu, 0, MF_BYPOSITION, SC_SCREENSAVE, "Screen Saver"); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, 0); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_STOP, "Stop"); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PAUSE, "Pause"); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PREV, "Prev"); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_NEXT, "Next"); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_PLAY, "Play"); - DrawMenuBar(hwnd); - } - return FALSE; - HANDLE_MSG(hwnd,WM_COMMAND,MainCmdProc); - HANDLE_MSG(hwnd,WM_CLOSE,DestroyWindow); - case WM_DESTROY: - OnDestroy(); - return FALSE; - case WM_SIZE: - if(wParam == SIZE_MINIMIZED){ - update_subwindow(); - OnHide(); - } - return FALSE; - case WM_QUERYOPEN: - OnShow(); - return FALSE; - case WM_DROPFILES: - hDrop = (HDROP)wParam; - PlayerPlaylistAddDropfiles(hDrop); - DragFinish(hDrop); - PlayerOnPlayLoadFile(); - MainWndSetPlayButton(1); - MainWndSetPauseButton(0); - TmPanelUpdate(); - UpdateListWnd(); - return FALSE; - case WM_HSCROLL: - { - int nScrollCode = (int) LOWORD(wParam); - int nPos = (int) HIWORD(wParam); - HWND hwndScrollBar = (HWND) lParam; - if(hwndScrollBar == hMainWndScrollbarProgressWnd){ - if(nScrollCode == SB_THUMBPOSITION){ - MainWndScrollbarProgressApply(nPos); - } else if(nScrollCode == SB_LINELEFT){ - nPos = GetScrollPos(hwndScrollBar,SB_CTL); - nPos--; - MainWndScrollbarProgressApply(nPos); - MainWndScrollbarProgressNotUpdate = 1; - } else if(nScrollCode == SB_LINERIGHT){ - nPos = GetScrollPos(hwndScrollBar,SB_CTL); - nPos++; - MainWndScrollbarProgressApply(nPos); - MainWndScrollbarProgressNotUpdate = 1; - } - if(nScrollCode == SB_THUMBTRACK) - MainWndScrollbarProgressNotUpdate = 1; - else - MainWndScrollbarProgressNotUpdate = 0; - } - } - return FALSE; - case WM_VSCROLL: - { - int nScrollCode = (int) LOWORD(wParam); - int nPos = (int) HIWORD(wParam); - HWND hwndScrollBar = (HWND) lParam; - if(hwndScrollBar == hMainWndScrollbarVolumeWnd){ - if(nScrollCode == SB_THUMBPOSITION){ - MainWndScrollbarVolumeApply(nPos); - } else if(nScrollCode == SB_LINEUP){ - nPos = GetScrollPos(hwndScrollBar,SB_CTL); - nPos--; - MainWndScrollbarVolumeApply(nPos); - MainWndScrollbarVolumeNotUpdate = 1; - } else if(nScrollCode == SB_LINEDOWN){ - nPos = GetScrollPos(hwndScrollBar,SB_CTL); - nPos++; - MainWndScrollbarVolumeApply(nPos); - MainWndScrollbarVolumeNotUpdate = 1; - } - if(nScrollCode == SB_THUMBTRACK) - MainWndScrollbarVolumeNotUpdate = 1; - else - MainWndScrollbarVolumeNotUpdate = 0; - } - } - return FALSE; - case WM_SYSCOMMAND: - switch(wParam){ - case IDM_STOP: - case IDM_PAUSE: - case IDM_PREV: - case IDM_PLAY: - case IDM_NEXT: - SendMessage(hwnd,WM_COMMAND,wParam,NULL); - break; - default: - break; - } - return FALSE; - /* - case WM_SETFOCUS: - HideCaret((HWND)wParam); - break; - case WM_KILLFOCUS: - ShowCaret((HWND)wParam); - break; - */ - default: - return FALSE; - } -} - -void MainCmdProc(HWND hwnd, int wId, HWND hwndCtl, UINT wNotifyCode) -{ - int iRes; - switch(wId) - { - case IDM_STOP: - PlayerOnStop(); - MainWndSetPlayButton(0); - MainWndSetPauseButton(0); - break; - case IDM_PAUSE: - iRes = PlayerOnPause(); - MainWndSetPauseButton(iRes); - break; - case IDM_PREV: - PlayerOnPrevPlay(); - MainWndSetPlayButton(1); - MainWndSetPauseButton(0); - break; - case IDM_BACKWARD: - break; - case IDM_PLAY: - PlayerOnPlay(); - MainWndSetPlayButton(1); - MainWndSetPauseButton(0); - break; - case IDM_FOREWARD: - break; - case IDM_NEXT: - PlayerOnNextPlay(); - MainWndSetPlayButton(1); - MainWndSetPauseButton(0); - break; - case IDM_CONSOLE: - case IDM_MWCONSOLE: - ToggleSubWindow(hConsoleWnd); - break; - case IDM_TRACER: - case IDM_MWTRACER: -/* ToggleSubWindow(hTracerWnd); */ - MainWndUpdateTracerButton(); - break; - case IDM_LIST: - case IDM_MWPLAYLIST: - ToggleSubWindow(hListWnd); - break; - case IDM_DOC: - case IDM_MWDOCUMENT: -/* ToggleSubWindow(hDocWnd); */ - MainWndUpdateDocButton(); - break; - case IDM_WRD: - case IDM_MWWRDTRACER: -/* ToggleSubWindow(hWrdWnd); */ - MainWndUpdateWrdButton(); - break; - case IDM_SOUNDSPEC: - case IDM_MWSOUNDSPEC: -/* ToggleSubWindow(hSoundSpecWnd); */ - MainWndUpdateSoundSpecButton(); - break; - case IDOK: - break; - case IDCANCEL: - OnExit(); - break; - case IDM_MFOPENFILE: - DlgMidiFileOpen(); - break; - case IDM_MFOPENDIR: - break; - case IDM_MFLOADPLAYLIST: - break; - case IDM_MFSAVEPLAYLISTAS: - break; - case IDM_MFEXIT: - OnExit(); - break; - - case IDM_SETTING: - OpenSettingWnd(hwnd); - break; - - case IDM_MCSAVEINIFILE: - SaveIniFile(sp_current, st_current); - break; - case IDM_MCLOADINIFILE: - if(player_status != PLAYERSTATUS_STOP) - { - MessageBox(hMainWnd, "Can't load Ini file while playing", - "Warning", MB_OK); - break; - } - LoadIniFile(sp_current,st_current); - ApplySettingPlayer(sp_current); - ApplySettingTimidity(st_current); - SettingWndSetup(); - break; - case IDM_MWDEBUG: -#ifdef W32GUI_DEBUG - if(IsWindowVisible(hDebugWnd)) - ShowWindow(hDebugWnd,SW_HIDE); - else - ShowWindow(hDebugWnd,SW_SHOW); -#endif - break; - case IDM_MHTOPIC: - break; - case IDM_MHHELP: - break; - case IDM_MHVERSION: - VersionWnd(hwnd); - break; - case IDM_MHTIMIDITY: - TiMidityWnd(hwnd); - break; - } -} - -void update_subwindow(void) -{ - SUBWINDOW *s = subwindow; - int i; - for(i=0;s[i].hwnd!=NULL;i++){ - if(IsWindow(*(s[i].hwnd))) - s[i].status |= SWS_EXIST; - else { - s[i].status = 0; - continue; - } - if(IsIconic(*(s[i].hwnd))) - s[i].status |= SWS_ICON; - else - s[i].status &= ~ SWS_ICON; - if(IsWindowVisible(*(s[i].hwnd))) - s[i].status &= ~ SWS_HIDE; - else - s[i].status |= SWS_HIDE; - } -} - -void MainWndSetPauseButton(int flag) -{ - if(flag) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN, - TB_CHECKBUTTON, IDM_PAUSE, (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_MAIN, - TB_CHECKBUTTON, IDM_PAUSE, (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndSetPlayButton(int flag) -{ - return; -} - -void MainWndUpdateConsoleButton(void) -{ - if(IsWindowVisible(hConsoleWnd)) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_CONSOLE, (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_CONSOLE, (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndUpdateListButton(void) -{ - if(IsWindowVisible(hListWnd)) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_LIST, (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_LIST, (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndUpdateDocButton(void) -{ - if(IsWindowVisible(hDocWnd)) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_DOC, (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_DOC, (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndUpdateTracerButton(void) -{ - if(IsWindowVisible(hTracerWnd)) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_TRACER, - (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_TRACER, - (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndUpdateWrdButton(void) -{ - if(IsWindowVisible(hWrdWnd)) - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_WRD, (LPARAM)MAKELONG(TRUE, 0)); - else - SendDlgItemMessage(hMainWnd, IDC_TOOLBARWINDOW_SUBWND, - TB_CHECKBUTTON, IDM_WRD, (LPARAM)MAKELONG(FALSE, 0)); -} - -void MainWndUpdateSoundSpecButton(void) -{ -} - -void ShowSubWindow(HWND hwnd,int showflag) -{ - int i, num; - RECT rc,rc2; - int max = 0; - if(showflag){ - if(IsWindowVisible(hwnd)) - return; - for(i=0;SubWindowHistory[i].hwnd!=NULL;i++) - if(*(SubWindowHistory[i].hwnd)==hwnd) - num = i; - for(i=0;SubWindowHistory[i].hwnd!=NULL;i++) - if(*(SubWindowHistory[i].hwnd)!=hwnd){ - if(SubWindowHistory[i].status > 0) - SubWindowHistory[i].status += 1; - if(SubWindowHistory[i].status>SubWindowMax){ - if(SubWindowHistory[i].status>max){ - GetWindowRect(*(SubWindowHistory[i].hwnd), &rc); - max = SubWindowHistory[i].status; - } - ShowWindow(*(SubWindowHistory[i].hwnd),SW_HIDE); - SubWindowHistory[i].status = 0; - } - } - if(max>0){ - GetWindowRect(hwnd, &rc2); - MoveWindow(hwnd,rc.left,rc.top,rc2.right-rc2.left,rc2.bottom-rc2.top,TRUE); - } - ShowWindow(hwnd,SW_SHOW); - SubWindowHistory[num].status = 1; - } else { - if(!IsWindowVisible(hwnd)) - return; - for(i=0;SubWindowHistory[i].hwnd!=NULL;i++) - if(*(SubWindowHistory[i].hwnd)==hwnd) - num = i; - for(i=0;SubWindowHistory[i].hwnd!=NULL;i++) - if(i!=num) - if(SubWindowHistory[i].status>=SubWindowHistory[num].status) - SubWindowHistory[i].status -= 1; - ShowWindow(hwnd,SW_HIDE); - SubWindowHistory[num].status = 0; - } - MainWndUpdateConsoleButton(); - MainWndUpdateListButton(); - MainWndUpdateTracerButton(); - MainWndUpdateDocButton(); - MainWndUpdateWrdButton(); - MainWndUpdateSoundSpecButton(); -} - -void ToggleSubWindow(HWND hwnd) -{ - if(IsWindowVisible(hwnd)) - ShowSubWindow(hwnd,0); - else - ShowSubWindow(hwnd,1); -} - -void OnShow(void) -{ - SUBWINDOW *s = subwindow; - int i; - for(i=0;s[i].hwnd!=NULL;i++) - if(s[i].status & SWS_EXIST) { - if(s[i].status & SWS_HIDE) - ShowWindow(*(s[i].hwnd),SW_HIDE); - else - ShowWindow(*(s[i].hwnd),SW_SHOW); - } -} - -void OnHide(void) -{ - SUBWINDOW *s = subwindow; - int i; - for(i=0;s[i].hwnd!=NULL;i++){ - if(s[i].status & SWS_EXIST) - ShowWindow(*(s[i].hwnd),SW_HIDE); - } -} - -//----------------------------------------------------------------------------- -// Toolbar Main - -static TBBUTTON MainTbb[] = { - {4, IDM_STOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, - {3, IDM_PAUSE, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, - {0, IDM_PREV, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, - {1, IDM_FOREWARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, - {2, IDM_PLAY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, - {5, IDM_BACKWARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, - {6, IDM_NEXT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0} -}; - -static void InitMainToolbar(HWND hwnd) -{ - TBADDBITMAP MainTbab; - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, - TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, - TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16)); - MainTbab.hInst = hInst; - MainTbab.nID =(int)IDB_BITMAP_MAIN_BUTTON; - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, - TB_ADDBITMAP, 7, (LPARAM)&MainTbab); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, - TB_ADDBUTTONS, (WPARAM)7,(LPARAM)&MainTbb); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_MAIN, - TB_AUTOSIZE, 0, 0); -} - -//----------------------------------------------------------------------------- -// Toolbar SubWnd - -static TBBUTTON SubWndTbb[] = { - {3, IDM_CONSOLE, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, - {1, IDM_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, - {2, IDM_TRACER, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, - {0, IDM_DOC, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, - {4, IDM_WRD, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}, -}; - -static void InitSubWndToolbar(HWND hwnd) -{ - TBADDBITMAP SubWndTbab; - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, - TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, - TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16,16)); - SubWndTbab.hInst = hInst; - SubWndTbab.nID =(int)IDB_BITMAP_SUBWND_BUTTON; - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, - TB_ADDBITMAP, 5, (LPARAM)&SubWndTbab); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, - TB_ADDBUTTONS, (WPARAM)5,(LPARAM)&SubWndTbb); - SendDlgItemMessage(hwnd, IDC_TOOLBARWINDOW_SUBWND, - TB_AUTOSIZE, 0, 0); -} - - - - - - - - - - -//----------------------------------------------------------------------------- -// Canvas Window - -#define TM_CANVAS_XMAX 160 -#define TM_CANVAS_YMAX 160 -// #define TM_CANVAS_XMAX 128 -// #define TM_CANVAS_YMAX 108 -#define TM_CANVASMAP_XMAX 16 -#define TM_CANVASMAP_YMAX 16 -struct TmCanvas_ { - HWND hwnd; - HWND hParentWnd; - int left; - int top; - int right; - int bottom; - int rectx; - int recty; - int spacex; - int spacey; - char map[TM_CANVASMAP_XMAX][TM_CANVASMAP_YMAX]; - char map2[TM_CANVASMAP_XMAX][TM_CANVASMAP_YMAX]; - char bar[TM_CANVASMAP_XMAX]; - char bar_old[TM_CANVASMAP_XMAX]; - int bar_delay; - uint32 xnote[MAX_W32G_MIDI_CHANNELS][4]; - uint32 xnote_old[MAX_W32G_MIDI_CHANNELS][4]; - int xnote_reset; - HDC hdc; - HDC hmdc; - HGDIOBJ hgdiobj_hmdcprev; - HBITMAP hbitmap; - HBITMAP hSleepBitmap; -} TmCanvas; - -// int TmCanvasMode = TMCM_CHANNEL; -int TmCanvasMode = TMCM_SLEEP; - -#define IDC_CANVAS 4242 - -static HWND hCanvasWnd; -static char CanvasWndClassName[] = "TiMidity Canvas"; -static LRESULT CALLBACK CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -static void TmCanvasClear(void); -static void TmCanvasChange(void); - -static void InitCanvasWnd(HWND hwnd) -{ - WNDCLASS wndclass ; - hCanvasWnd = 0; - wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; - wndclass.lpfnWndProc = CanvasWndProc ; - wndclass.cbClsExtra = 0 ; - wndclass.cbWndExtra = 0 ; - wndclass.hInstance = hInst ; - wndclass.hIcon = NULL; - wndclass.hCursor = LoadCursor(0,IDC_ARROW) ; - wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = CanvasWndClassName; - RegisterClass(&wndclass); - while(hCanvasWnd==0){ - hCanvasWnd = CreateWindowEx(0,CanvasWndClassName,0, - WS_CHILD, - CW_USEDEFAULT,0,TM_CANVAS_XMAX,TM_CANVAS_YMAX,GetDlgItem(hwnd,IDC_RECT_CANVAS),0,hInst,0); - } - ShowWindow(hCanvasWnd,SW_SHOW); - UpdateWindow(hCanvasWnd); -} - -static LRESULT CALLBACK -CanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess) - { - case WM_CREATE: - TmCanvasInit(hwnd); - break; - case WM_PAINT: - TmCanvasUpdate(); - return 0; - case WM_TM_CANVAS_UPDATE: - TmCanvasUpdate(); - break; - case WM_LBUTTONDBLCLK: - TmCanvasChange(); - break; - default: - return DefWindowProc(hwnd,uMess,wParam,lParam) ; - } - return 0L; -} - -#define TMCCC_FORE RGB(0x00,0x00,0x00) -#define TMCCC_BACK RGB(0x00,0xf0,0x00) -#define TMCCC_LOW RGB(0x80,0xd0,0x00) -#define TMCCC_MIDDLE RGB(0xb0,0xb0,0x00) -#define TMCCC_HIGH RGB(0xe0,0x00,0x00) - -#define TMCCF_NONE 1 -#define TMCCF_HALF 1 - -#define TMCC_BACK 0 -#define TMCC_FORE 1 -#define TMCC_LOW 2 -#define TMCC_MIDDLE 3 -#define TMCC_HIGH 4 -#define TMCC_FORE_HALF 11 -#define TMCC_LOW_HALF 12 -#define TMCC_MIDDLE_HALF 13 -#define TMCC_HIGH_HALF 14 -#define TMCC_FORE_WEAKHALF 15 - -static COLORREF WeakHalfColor(COLORREF fc, COLORREF bc) -{ - return fc*1/3 + bc*2/3; -} - -static COLORREF HalfColor(COLORREF fc, COLORREF bc) -{ - return fc*1/6 + bc*5/6; -} - -static COLORREF TmCc(int c) -{ - switch(c){ - case TMCC_BACK: - return TMCCC_BACK; - case TMCC_FORE: - return TMCCC_FORE; - case TMCC_FORE_HALF: - return HalfColor(TMCCC_FORE,TMCCC_BACK); - case TMCC_FORE_WEAKHALF: - return WeakHalfColor(TMCCC_FORE,TMCCC_BACK); - case TMCC_LOW: - return TMCCC_LOW; - case TMCC_MIDDLE: - return TMCCC_MIDDLE; - case TMCC_HIGH: - return TMCCC_HIGH; - case TMCC_LOW_HALF: - return HalfColor(TMCCC_LOW,TMCCC_BACK); - case TMCC_MIDDLE_HALF: - return HalfColor(TMCCC_MIDDLE,TMCCC_BACK); - case TMCC_HIGH_HALF: - return HalfColor(TMCCC_HIGH,TMCCC_BACK); - default: - return TMCCC_BACK; - } -} - -static HANDLE hCanvasSemaphore = NULL; -// #define CANVAS_BEGIN() WaitForSingleObject(hCanvasSemaphore, INFINITE) -// #define CANVAS_END() ReleaseSemaphore(hCanvasSemaphore, 1, NULL) -#define CANVAS_BEGIN() -#define CANVAS_END() - -static int TmCanvasStart = 0; -static void TmCanvasInit(HWND hwnd) -{ - RECT rc; - if(hCanvasSemaphore==NULL) - hCanvasSemaphore = CreateSemaphore(NULL, 1, 1, "TiMidityCanvasSemaphore"); - CANVAS_BEGIN(); - TmCanvas.hwnd = hwnd; - TmCanvas.hParentWnd = GetParent(TmCanvas.hwnd); - GetClientRect(TmCanvas.hParentWnd,&rc); - MoveWindow(TmCanvas.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE); - TmCanvas.left = 3; - TmCanvas.top = 2; - TmCanvas.right = 64; - TmCanvas.bottom = 64; - TmCanvas.rectx = 5; - TmCanvas.recty = 2; - TmCanvas.spacex = 1; - TmCanvas.spacey = 1; - TmCanvas.bar_delay = 1; - TmCanvas.hdc = GetDC(TmCanvas.hwnd); - SAFE_SET_NOT_NULL(TmCanvas.hbitmap, - CreateCompatibleBitmap(TmCanvas.hdc,TM_CANVAS_XMAX,TM_CANVAS_YMAX)); - SAFE_SET_NOT_NULL(TmCanvas.hmdc,CreateCompatibleDC(TmCanvas.hdc)); - TmCanvas.hgdiobj_hmdcprev = SelectObject(TmCanvas.hmdc,TmCanvas.hbitmap); - ReleaseDC(TmCanvas.hwnd,TmCanvas.hdc); - TmCanvas.hSleepBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_SLEEP)); - CANVAS_END(); - TmCanvasReset(); - TmCanvasStart = 1; - TmCanvasClear(); - TmCanvasSet(); - TmCanvasUpdate(); -} - -static void TmCanvasClearChannelMode(void) -{ - HPEN hPen; - HBRUSH hBrush; - HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; - SAFE_SET_NOT_NULL(hPen,CreatePen(PS_SOLID,1,TmCc(TMCC_BACK))); - SAFE_SET_NOT_NULL(hBrush,CreateSolidBrush(TmCc(TMCC_BACK))); - hgdiobj_hpen = SelectObject(TmCanvas.hmdc, hPen); - hgdiobj_hbrush = SelectObject(TmCanvas.hmdc, hBrush); - Rectangle(TmCanvas.hmdc,0,0,TM_CANVAS_XMAX,TM_CANVAS_YMAX); - SelectObject(TmCanvas.hmdc, hgdiobj_hpen); - DeleteObject(hPen); - SelectObject(TmCanvas.hmdc, hgdiobj_hbrush); - DeleteObject(hBrush); - InvalidateRect(hCanvasWnd, NULL, FALSE); -} - -static void TmCanvasResetChannelMode(void) -{ - int i,j; - for(i=0;iv_flags[ch] == FLAG_NOTE_ON) - v = Panel->ctotal[ch]/8; - else - v = 0; - if(v<0) v = 0; else if(v>15) v = 15; -// Vibrate bar. -#if 1 - if(v != TmCanvas.bar[ch]){ -#else - if(v == TmCanvas.bar[ch]){ - v = v * (rand()%7 + 7) / 10; - if(v<0) - v = 0; - } - { -#endif - if(TmCanvas.bar_delay){ - int old = TmCanvas.bar[ch]; - if(TmCanvas.bar[ch]<0) - TmCanvas.bar[ch] = v; - else - TmCanvas.bar[ch] = (TmCanvas.bar[ch]*10*1/3 + v*10*2/3)/10; - if(old == TmCanvas.bar[ch]){ - if(v>TmCanvas.bar[ch]) - TmCanvas.bar[ch] = old + 1; - else if(v= 120) - continue; - note = note % 12; - if(TmCanvas.xnote[i][j] & reff) - color = TCTM_ON; - else if(note == 1 || note == 3 || note == 6 || note == 8 || note == 10) - color = TCTM_OFF_BRACK; - else - color = TCTM_OFF_WHITE; - if(TmCanvas.xnote_reset || diff & reff){ - int x,y; - x = TmCanvas.left + j * 32 + k - 24; - y = TmCanvas.top + i * 4; - if(note == 1 || note == 3 || note == 6 || note == 8 || note == 10){ - for(l=0;l<2;l++) - SetPixelV(TmCanvas.hmdc,x,y+l,color); - } else { - for(l=0;l<3;l++) - SetPixelV(TmCanvas.hmdc,x,y+l,color); - } - } - } - } - } - } -*/ - TmCanvas.hdc = BeginPaint(TmCanvas.hwnd, &ps); - GetClientRect(TmCanvas.hwnd, &rc); - BitBlt(TmCanvas.hdc,rc.left,rc.top,rc.right,rc.bottom,TmCanvas.hmdc,0,0,SRCCOPY); - EndPaint(TmCanvas.hwnd, &ps); - if(change_flag || TmCanvas.xnote_reset) - InvalidateRect(hCanvasWnd, NULL, FALSE); - TmCanvas.xnote_reset = 0; -} - -static void TmCanvasSetTracerMode(void) -{ - int i,j,k,l; - int change_flag = 0; - int32 diff; - int32 reff; - int note; - COLORREF color; - int x,y; - - if(Panel!=NULL){ - for(i=0;ixnote[i][j]; - if(TmCanvas.xnote[i][j] != TmCanvas.xnote_old[i][j]){ - change_flag = 1; - } - } - } - } - if(change_flag || TmCanvas.xnote_reset){ - for(i=0;i= 120) - continue; - note = note % 12; - if(TmCanvas.xnote[i][j] & reff) - color = TCTM_ON; - else if(note == 1 || note == 3 || note == 6 || note == 8 || note == 10) - color = TCTM_OFF_BRACK; - else - color = TCTM_OFF_WHITE; - if(TmCanvas.xnote_reset || diff & reff){ - x = TmCanvas.left + j * 32 + k - 24; - y = TmCanvas.top + i * 4; - if(note == 1 || note == 3 || note == 6 || note == 8 || note == 10){ - for(l=0;l<2;l++) - SetPixelV(TmCanvas.hmdc,x,y+l,color); - SetPixelV(TmCanvas.hmdc,x,y+2,TCTM_OFF_WHITE); - } else { - for(l=0;l<3;l++) - SetPixelV(TmCanvas.hmdc,x,y+l,color); - } - } - } - } - } - InvalidateRect(hCanvasWnd, NULL, FALSE); - } -} - -static void TmCanvasClearTracerMode(void) -{ - TmCanvasClearChannelMode(); -} - - - - - - - - - - - - - - -volatile static int TmCanvasClearFlag = 0; -static void TmCanvasClear(void) -{ - if(TmCanvasClearFlag) - return; - CANVAS_BEGIN(); - TmCanvasClearFlag = 1; - switch(TmCanvasMode){ - case TMCM_CHANNEL: - TmCanvasClearChannelMode(); - break; - case TMCM_TRACER: - TmCanvasClearTracerMode(); - break; - case TMCM_SLEEP: - default: - TmCanvasClearSleepMode(); - break; - } - TmCanvasClearFlag = 0; - CANVAS_END(); -} - -volatile static int TmCanvasUpdateFlag = 0; -void TmCanvasUpdate(void) -{ - if(!TmCanvasStart) - return; - if(TmCanvasUpdateFlag) - return; - CANVAS_BEGIN(); - TmCanvasClearFlag = 1; - switch(TmCanvasMode){ - case TMCM_CHANNEL: - TmCanvasUpdateChannelMode(); - break; - case TMCM_TRACER: - TmCanvasUpdateTracerMode(); - break; - case TMCM_SLEEP: - default: - TmCanvasUpdateSleepMode(); - break; - } - TmCanvasClearFlag = 0; - CANVAS_END(); -} - -volatile static int TmCanvasResetFlag = 0; -void TmCanvasReset(void) -{ - if(!TmCanvasStart) - return; - if(TmCanvasResetFlag) - return; - CANVAS_BEGIN(); - TmCanvasResetFlag = 1; - switch(TmCanvasMode){ - case TMCM_CHANNEL: - TmCanvasResetChannelMode(); - break; - case TMCM_TRACER: - TmCanvasResetTracerMode(); - break; - case TMCM_SLEEP: - default: - TmCanvasResetSleepMode(); - break; - } - TmCanvasResetFlag = 0; - CANVAS_END(); -} - -volatile static int TmCanvasSetFlag = 0; -void TmCanvasSet(void) -{ - if(!TmCanvasStart) - return; - if(TmCanvasSetFlag) - return; - CANVAS_BEGIN(); - TmCanvasSetFlag = 1; - switch(TmCanvasMode){ - case TMCM_CHANNEL: - TmCanvasSetChannelMode(); - break; - case TMCM_TRACER: - TmCanvasSetTracerMode(); - break; - case TMCM_SLEEP: - default: - TmCanvasSetSleepMode(); - break; - } - TmCanvasSetFlag = 0; - CANVAS_END(); -} - -static void TmCanvasChange(void) -{ - TmCanvasClear(); - TmCanvasReset(); - TmCanvasSet(); - TmCanvasUpdate(); - switch(TmCanvasMode){ - case TMCM_SLEEP: - TmCanvasMode = TMCM_CHANNEL; - break; - case TMCM_CHANNEL: - TmCanvasMode = TMCM_TRACER; - break; - case TMCM_TRACER: - TmCanvasMode = TMCM_SLEEP; - break; - default: - TmCanvasMode = TMCM_SLEEP; - break; - } - TmCanvasClear(); - TmCanvasReset(); - TmCanvasSet(); - TmCanvasUpdate(); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//----------------------------------------------------------------------------- -// Main Panel - -#define TM_PANEL_XMAX 350 -#define TM_PANEL_YMAX 100 - -#define TMP_SPACE 2 -#define TMP_TITLE_CHAR_SIZE 12 -#define TMP_FILE_CHAR_SIZE 10 -#define TMP_MISCH_CHAR_SIZE 9 -#define TMP_MISC_CHAR_SIZE 12 -#define TMP_3L_CSIZE TMP_MISC_CHAR_SIZE -#define TMP_3L_CSSIZE TMP_MISCH_CHAR_SIZE -#define TMP_3L_SPACE 1 -#define TMP_4L_CSIZE TMP_MISC_CHAR_SIZE -#define TMP_4L_CSSIZE TMP_MISCH_CHAR_SIZE -#define TMP_4L_SPACE 1 - -static HFONT hTitleFont = NULL; -static HFONT hFileFont = NULL; -static HFONT hMiscHFont = NULL; -static HFONT hMiscFont = NULL; - -#define TMP_FONT_SIZE 12 -#define TMP_FONTSMALL_SIZE 10 -#define TMP_TITLE_MAX 256 -#define TMP_FILE_MAX 256 -struct TmPanel_ { - HWND hwnd; - HWND hParentWnd; - RECT rcMe; - RECT rcTitleH; - RECT rcTitle; - RECT rcFileH; - RECT rcFile; - RECT rcTimeH; - RECT rcTime; - RECT rcVoicesH; - RECT rcVoices; - RECT rcMasterVolume; - RECT rcMasterVolumeH; - RECT rcListH; - RECT rcList; - int TitleDone; - int FileDone; - int TimeDone; - int VoicesDone; - int MasterVolumeDone; - int ListDone; - int TitleHDone; - int FileHDone; - int TimeHDone; - int VoicesHDone; - int MasterVolumeHDone; - int ListHDone; - char Title[TMP_TITLE_MAX+1]; - char File[TMP_FILE_MAX+1]; - int cur_time_h; - int cur_time_m; - int cur_time_s; - int cur_time_ss; - int total_time_h; - int total_time_m; - int total_time_s; - int total_time_ss; - int cur_voices; - int voices; -#if 0 /* Not used */ - int upper_voices; -#endif - int master_volume; - int cur_pl_num; - int playlist_num; - HDC hdc; - HDC hmdc; - HGDIOBJ hgdiobj_hmdcprev; - HBITMAP hbitmap; - HFONT hfont; - HFONT hfontsmall; - char font[256]; -} TmPanel; - -static HWND hPanelWnd; -static char PanelWndClassName[] = "TiMidity Panel"; -static LRESULT CALLBACK PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -static void TmPanelClear(void); -int TmPanelMode = 0; -static int TmPanelAllUpdate = 1; - -static void InitPanelWnd(HWND hwnd) -{ - WNDCLASS wndclass ; - hPanelWnd = 0; - wndclass.style = CS_HREDRAW | CS_VREDRAW ; - wndclass.lpfnWndProc = PanelWndProc ; - wndclass.cbClsExtra = 0 ; - wndclass.cbWndExtra = 0 ; - wndclass.hInstance = hInst ; - wndclass.hIcon = NULL; - wndclass.hCursor = LoadCursor(0,IDC_ARROW) ; - wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = PanelWndClassName; - RegisterClass(&wndclass); - SAFE_SET_NOT_NULL( - hPanelWnd, - CreateWindowEx(0,PanelWndClassName,0,WS_CHILD, - CW_USEDEFAULT,0,TM_PANEL_XMAX,TM_PANEL_YMAX, - GetDlgItem(hwnd,IDC_RECT_PANEL),0,hInst,0) - ); - ShowWindow(hPanelWnd,SW_SHOW); - UpdateWindow(hPanelWnd); -} - -static LRESULT CALLBACK -PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess) - { - case WM_CREATE: - TmPanelInit(hwnd); - break; - case WM_PAINT: - TmPanelUpdate(); -// SendMessage(GetParent(hwnd),WM_PAINT,0,0); - return 0; - default: - return DefWindowProc(hwnd,uMess,wParam,lParam) ; - } - return 0L; -} - -#define TMP_DONOT 1 -#define TMP_PREPARE 2 -#define TMP_DONE 3 - -static int TmPanelStart = 0; -static void TmPanelInit(HWND hwnd) -{ - int i,top,bottom; - RECT rc; - TmPanel.hwnd = hwnd; - TmPanel.hParentWnd = GetParent(TmPanel.hwnd); - GetClientRect(TmPanel.hParentWnd,&rc); - MoveWindow(TmPanel.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE); - TmPanel.hdc = GetDC(TmPanel.hwnd); - SAFE_SET_NOT_NULL(TmPanel.hbitmap, - CreateCompatibleBitmap(TmPanel.hdc,TM_PANEL_XMAX,TM_PANEL_YMAX)); - SAFE_SET_NOT_NULL(TmPanel.hmdc,CreateCompatibleDC(TmPanel.hdc)); - TmPanel.hgdiobj_hmdcprev = SelectObject(TmPanel.hmdc,TmPanel.hbitmap); - ReleaseDC(TmPanel.hwnd,TmPanel.hdc); - GetClientRect(TmPanel.hwnd,&rc); - TmPanel.rcMe.left = rc.left; - TmPanel.rcMe.top = rc.top; - TmPanel.rcMe.right = rc.right; - TmPanel.rcMe.bottom = rc.bottom; - TmPanel.rcTitle.left = TmPanel.rcMe.left+TMP_SPACE; - TmPanel.rcTitle.top = TmPanel.rcMe.top+TMP_SPACE; - TmPanel.rcTitle.right = TmPanel.rcMe.right-TMP_SPACE; - TmPanel.rcTitle.bottom = TmPanel.rcTitle.top+TMP_TITLE_CHAR_SIZE+TMP_SPACE; - TmPanel.rcFile.left = TmPanel.rcMe.left+TMP_SPACE; - TmPanel.rcFile.top = TmPanel.rcTitle.bottom+TMP_SPACE; - TmPanel.rcFile.right = TmPanel.rcMe.right-TMP_SPACE; - TmPanel.rcFile.bottom = TmPanel.rcFile.top+TMP_FILE_CHAR_SIZE+TMP_SPACE; - top = TmPanel.rcFile.bottom+TMP_SPACE; - bottom = top + TMP_3L_CSIZE; - i = (TMP_3L_CSIZE - TMP_3L_CSSIZE)/2; - TmPanel.rcTimeH.left = TmPanel.rcMe.left + TMP_SPACE; - TmPanel.rcTimeH.top = top + i; - TmPanel.rcTimeH.right = TmPanel.rcTimeH.left + TMP_3L_CSSIZE*4; - TmPanel.rcTimeH.bottom = bottom - i; - TmPanel.rcTime.left = TmPanel.rcTimeH.right + TMP_3L_SPACE; - TmPanel.rcTime.top = top; - TmPanel.rcTime.right = TmPanel.rcTime.left + TMP_3L_CSIZE*12; - TmPanel.rcTime.bottom = bottom; - TmPanel.rcVoicesH.left = TmPanel.rcTime.right + TMP_3L_SPACE; - TmPanel.rcVoicesH.top = top + i; - TmPanel.rcVoicesH.right = TmPanel.rcVoicesH.left + TMP_3L_CSSIZE*6; - TmPanel.rcVoicesH.bottom = bottom - i; - TmPanel.rcVoices.left = TmPanel.rcVoicesH.right + TMP_3L_SPACE; - TmPanel.rcVoices.top = top; - TmPanel.rcVoices.right = TmPanel.rcVoices.left + TMP_3L_CSIZE*7; - TmPanel.rcVoices.bottom = bottom; - TmPanel.rcMasterVolumeH.left = TmPanel.rcVoices.right + TMP_3L_SPACE; - TmPanel.rcMasterVolumeH.top = top + i; - TmPanel.rcMasterVolumeH.right = TmPanel.rcMasterVolumeH.left + TMP_3L_CSSIZE*4; - TmPanel.rcMasterVolumeH.bottom = bottom - i; - TmPanel.rcMasterVolume.left = TmPanel.rcMasterVolumeH.right + TMP_3L_SPACE; - TmPanel.rcMasterVolume.top = top; - TmPanel.rcMasterVolume.right = TmPanel.rcMasterVolume.left + TMP_3L_CSIZE*4; - TmPanel.rcMasterVolume.bottom = bottom; - top = TmPanel.rcTime.bottom + TMP_SPACE; - bottom = top + TMP_4L_CSIZE; - i = (TMP_4L_CSIZE - TMP_4L_CSSIZE)/2; - TmPanel.rcListH.left = TmPanel.rcMe.left + TMP_SPACE; - TmPanel.rcListH.top = top + i; - TmPanel.rcListH.right = TmPanel.rcListH.left + TMP_4L_CSSIZE*4; - TmPanel.rcListH.bottom = bottom - i; - TmPanel.rcList.left = TmPanel.rcListH.right + TMP_4L_SPACE; - TmPanel.rcList.top = top; - TmPanel.rcList.right = TmPanel.rcList.left + TMP_4L_CSIZE*9; - TmPanel.rcList.bottom = bottom; - TmPanelStart = 1; - TmPanelClear(); - TmPanelFullReset(); - TmPanelAllUpdate = 1; - TmPanelUpdate(); -} - -static void TmPanelRect(RECT rc, COLORREF color) -{ - HPEN hPen; - HBRUSH hBrush; - HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; - SAFE_SET_NOT_NULL(hPen,CreatePen(PS_SOLID,1,color)); - SAFE_SET_NOT_NULL(hBrush,CreateSolidBrush(color)); - hgdiobj_hpen = SelectObject(TmPanel.hmdc, hPen); - hgdiobj_hbrush = SelectObject(TmPanel.hmdc, hBrush); - Rectangle(TmPanel.hmdc,rc.left,rc.top,rc.right,rc.bottom); - SelectObject(TmPanel.hmdc, hgdiobj_hpen); - DeleteObject(hPen); - SelectObject(TmPanel.hmdc, hgdiobj_hbrush); - DeleteObject(hBrush); - InvalidateRect(TmPanel.hwnd,&rc, FALSE); -} - -static void TmPanelClear(void) -{ - if(!TmPanelStart) - return; - TmPanelRect(TmPanel.rcMe,TmCc(TMCC_BACK)); -} - -void TmPanelPartReset(void) -{ - if(!TmPanelStart) - return; - TmPanel.TimeDone = TMP_DONOT; - TmPanel.VoicesDone = TMP_DONOT; - TmPanel.MasterVolumeDone = TMP_DONOT; - TmPanel.ListDone = TMP_DONOT; - TmPanel.cur_time_h = -1; - TmPanel.cur_time_m = -1; - TmPanel.cur_time_s = -1; - TmPanel.cur_time_ss = -1; - TmPanel.total_time_h = -1; - TmPanel.total_time_m = -1; - TmPanel.total_time_s = -1; - TmPanel.total_time_ss = -1; - TmPanel.cur_voices = -1; -// TmPanel.voices = -1; - TmPanel.cur_pl_num = -1; - TmPanel.playlist_num = -1; -} - -void TmPanelReset(void) -{ - if(!TmPanelStart) - return; - TmPanelClear(); - TmPanel.TitleDone = TMP_DONOT; - TmPanel.FileDone = TMP_DONOT; - TmPanel.TimeDone = TMP_DONOT; - TmPanel.VoicesDone = TMP_DONOT; - TmPanel.MasterVolumeDone = TMP_DONOT; - TmPanel.ListDone = TMP_DONOT; - TmPanel.TitleHDone = TMP_DONOT; - TmPanel.FileHDone = TMP_DONOT; - TmPanel.TimeHDone = TMP_DONOT; - TmPanel.VoicesHDone = TMP_DONOT; - TmPanel.MasterVolumeHDone = TMP_DONOT; - TmPanel.ListHDone = TMP_DONOT; - TmPanel.Title[0] = '\0'; - TmPanel.File[0] = '\0'; - TmPanelRect(TmPanel.rcTitle,TmCc(TMCC_FORE_HALF)); - TmPanelRect(TmPanel.rcFile,TmCc(TMCC_FORE_HALF)); - TmPanel.cur_time_h = -1; - TmPanel.cur_time_m = -1; - TmPanel.cur_time_s = -1; - TmPanel.cur_time_ss = -1; - TmPanel.total_time_h = -1; - TmPanel.total_time_m = -1; - TmPanel.total_time_s = -1; - TmPanel.total_time_ss = -1; - TmPanel.cur_voices = -1; - TmPanel.cur_pl_num = -1; - TmPanel.playlist_num = -1; - TmPanel.voices = -1; - TmPanel.master_volume = -1; - TmPanelAllUpdate = 1; -} - -void TmPanelFullReset(void) -{ - if(!TmPanelStart) - return; - TmPanelClear(); - TmPanel.TitleDone = TMP_DONOT; - TmPanel.FileDone = TMP_DONOT; - TmPanel.TimeDone = TMP_DONOT; - TmPanel.VoicesDone = TMP_DONOT; - TmPanel.MasterVolumeDone = TMP_DONOT; - TmPanel.ListDone = TMP_DONOT; - TmPanel.TitleHDone = TMP_DONOT; - TmPanel.FileHDone = TMP_DONOT; - TmPanel.TimeHDone = TMP_DONOT; - TmPanel.VoicesHDone = TMP_DONOT; - TmPanel.MasterVolumeHDone = TMP_DONOT; - TmPanel.ListHDone = TMP_DONOT; - TmPanel.Title[0] = '\0'; - TmPanel.File[0] = '\0'; - TmPanelRect(TmPanel.rcTitle,TmCc(TMCC_FORE_HALF)); - TmPanelRect(TmPanel.rcFile,TmCc(TMCC_FORE_HALF)); - TmPanel.cur_time_h = -1; - TmPanel.cur_time_m = -1; - TmPanel.cur_time_s = -1; - TmPanel.cur_time_ss = -1; - TmPanel.total_time_h = -1; - TmPanel.total_time_m = -1; - TmPanel.total_time_s = -1; - TmPanel.total_time_ss = -1; - TmPanel.cur_voices = -1; - TmPanel.cur_pl_num = -1; - TmPanel.playlist_num = -1; - TmPanel.voices = -1; - TmPanel.master_volume = -1; -// Font Setting - if(hTitleFont!=NULL) - DeleteObject(hTitleFont); - SAFE_SET_NOT_NULL( - hTitleFont, - CreateFont(TMP_TITLE_CHAR_SIZE,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE, - DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, - DEFAULT_PITCH | FF_DONTCARE,PlayerFont) - ); - if(hFileFont!=NULL) - DeleteObject(hFileFont); - SAFE_SET_NOT_NULL( - hFileFont, - CreateFont(TMP_FILE_CHAR_SIZE,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE, - DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, - DEFAULT_PITCH | FF_DONTCARE,PlayerFont) - ); - if(hMiscHFont!=NULL) - DeleteObject(hMiscHFont); - SAFE_SET_NOT_NULL( - hMiscHFont, - CreateFont(TMP_MISCH_CHAR_SIZE,0,0,0,FW_BOLD,FALSE,FALSE,FALSE, - DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, - DEFAULT_PITCH | FF_DONTCARE,PlayerFont) - ); - if(hMiscFont!=NULL) - DeleteObject(hMiscFont); - SAFE_SET_NOT_NULL( - hMiscFont, - CreateFont(TMP_MISC_CHAR_SIZE,0,0,0,FW_BOLD,FALSE,FALSE,FALSE, - DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, - DEFAULT_PITCH | FF_DONTCARE,PlayerFont) - ); - TmPanelAllUpdate = 1; -} - -#define RANGE(x,min,max) { if((x)max) (x) = max; } - -void TmPanelUpdate(void) -{ - PAINTSTRUCT ps; - - if(!TmPanelStart) - return; - -// Panel : 1st line - if(TmPanel.TitleDone==TMP_PREPARE){ - HGDIOBJ hgdiobj; - HFONT hfont = hTitleFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - ExtTextOut(TmPanel.hmdc,TmPanel.rcTitle.left,TmPanel.rcTitle.top, - ETO_CLIPPED,&(TmPanel.rcTitle), - TmPanel.Title,strlen(TmPanel.Title),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcTitle), FALSE); - TmPanel.TitleDone=TMP_DONE; - } - -// Panel : 2nd line - if(TmPanel.FileDone==TMP_PREPARE){ - HGDIOBJ hgdiobj; - HFONT hfont = hFileFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - ExtTextOut(TmPanel.hmdc,TmPanel.rcFile.left,TmPanel.rcFile.top, - ETO_CLIPPED,&(TmPanel.rcFile), - TmPanel.File,strlen(TmPanel.File),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcFile), FALSE); - TmPanel.FileDone=TMP_DONE; - } - -// Panel : 3rd line - if(TmPanel.TimeHDone==TMP_PREPARE){ - char buffer[] = "TIME"; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscHFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_BACK)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcTimeH.right = TmPanel.rcTimeH.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcTimeH.left,TmPanel.rcTimeH.top, - ETO_CLIPPED,&(TmPanel.rcTimeH), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcTimeH), FALSE); - TmPanel.TimeHDone=TMP_DONE; - } - if(TmPanel.TimeDone==TMP_PREPARE){ - char buffer[32]; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscFont; -#if 1 - sprintf(buffer,"%02d:%02d:%02d/%02d:%02d:%02d", - TmPanel.cur_time_h,TmPanel.cur_time_m,TmPanel.cur_time_s, - TmPanel.total_time_h,TmPanel.total_time_m,TmPanel.total_time_s); -#else - sprintf(buffer,"%02.2d:%02.2d:%02.2d.%02.2d/%02.2d:%02.2d:%02.2d.%02.2d", - TmPanel.cur_time_h,TmPanel.cur_time_m, - TmPanel.cur_time_s,TmPanel.cur_time_ss, - TmPanel.total_time_h,TmPanel.total_time_m, - TmPanel.total_time_s,TmPanel.total_time_ss); -#endif - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcTime.left = TmPanel.rcTimeH.right + TMP_3L_SPACE; - TmPanel.rcTime.right = TmPanel.rcTime.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcTime.left,TmPanel.rcTime.top, - ETO_CLIPPED,&(TmPanel.rcTime), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcTime), FALSE); - TmPanel.TimeDone=TMP_DONOT; - } - - if(TmPanel.VoicesHDone==TMP_PREPARE){ - char buffer[] = "VOICES"; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscHFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_BACK)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcVoicesH.left = TmPanel.rcTime.right + TMP_3L_SPACE; - TmPanel.rcVoicesH.right = TmPanel.rcVoicesH.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcVoicesH.left,TmPanel.rcVoicesH.top, - ETO_CLIPPED,&(TmPanel.rcVoicesH), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcVoicesH), FALSE); - TmPanel.VoicesHDone=TMP_DONE; - } - if(TmPanel.VoicesDone==TMP_PREPARE){ - char buffer[32]; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscFont; -// FIXME: Why does TmPanel.voices need? -// sprintf(buffer,"%03d/%03d", TmPanel.cur_voices, TmPanel.voices); - sprintf(buffer,"%03d/%03d", TmPanel.cur_voices, voices); - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcVoices.left = TmPanel.rcVoicesH.right + TMP_3L_SPACE; - TmPanel.rcVoices.right = TmPanel.rcVoices.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcVoices.left,TmPanel.rcVoices.top, - ETO_CLIPPED,&(TmPanel.rcVoices), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcVoices), FALSE); - TmPanel.VoicesDone=TMP_DONOT; - } - - if(TmPanel.MasterVolumeHDone==TMP_PREPARE){ - char buffer[] = "M.Vol"; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscHFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_BACK)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcMasterVolumeH.left = TmPanel.rcVoices.right + TMP_3L_SPACE; - TmPanel.rcMasterVolumeH.right = TmPanel.rcMasterVolumeH.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcMasterVolumeH.left,TmPanel.rcMasterVolumeH.top, - ETO_CLIPPED,&(TmPanel.rcMasterVolumeH), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcMasterVolumeH), FALSE); - TmPanel.MasterVolumeHDone=TMP_DONE; - } - if(TmPanel.MasterVolumeDone==TMP_PREPARE){ - char buffer[32]; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscFont; - sprintf(buffer,"%03d%%", TmPanel.master_volume); - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcMasterVolume.left = TmPanel.rcMasterVolumeH.right + TMP_3L_SPACE; - TmPanel.rcMasterVolume.right = TmPanel.rcMasterVolume.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcMasterVolume.left,TmPanel.rcMasterVolume.top, - ETO_CLIPPED,&(TmPanel.rcMasterVolume), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcMasterVolume), FALSE); - TmPanel.MasterVolumeDone=TMP_DONOT; - } - - -// Panel : 4th line - if(TmPanel.ListHDone==TMP_PREPARE){ - char buffer[] = "LIST"; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscHFont; - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_BACK)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcListH.left = TmPanel.rcMe.left + TMP_SPACE; - TmPanel.rcListH.right = TmPanel.rcListH.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcListH.left,TmPanel.rcListH.top, - ETO_CLIPPED,&(TmPanel.rcListH), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcListH), FALSE); - TmPanel.ListHDone=TMP_DONE; - } - if(TmPanel.ListDone==TMP_PREPARE){ - char buffer[32]; - SIZE size; - HGDIOBJ hgdiobj; - HFONT hfont = hMiscFont; - sprintf(buffer,"%04d/%04d", TmPanel.cur_pl_num, TmPanel.playlist_num); - SAFE_SET_NOT2_TYPE(hgdiobj,SelectObject(TmPanel.hmdc, hfont),NULL,(HGDIOBJ)GDI_ERROR,"SelectObject"); - SAFE_NOT_TYPE(SetTextColor(TmPanel.hmdc,TmCc(TMCC_FORE)),(COLORREF)CLR_INVALID,"SetTextColor"); - SAFE_NOT_TYPE(SetBkColor(TmPanel.hmdc, TmCc(TMCC_FORE_HALF)),(COLORREF)CLR_INVALID,"SetBkColor"); - SAFE_NOT_TYPE(SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP),(UINT)GDI_ERROR,"SetTextAlign"); - GetTextExtentPoint32(TmPanel.hmdc,buffer,strlen(buffer),&size); - TmPanel.rcList.left = TmPanel.rcListH.right + TMP_4L_SPACE; - TmPanel.rcList.right = TmPanel.rcList.left + size.cx; - ExtTextOut(TmPanel.hmdc,TmPanel.rcList.left,TmPanel.rcList.top, - ETO_CLIPPED,&(TmPanel.rcList), - buffer,strlen(buffer),NULL); - SelectObject(TmPanel.hmdc, hgdiobj); - InvalidateRect(hPanelWnd, &(TmPanel.rcList), FALSE); - TmPanel.ListDone=TMP_DONOT; - } - - TmPanel.hdc = BeginPaint(TmPanel.hwnd, &ps); - BitBlt(TmPanel.hdc, - TmPanel.rcMe.left,TmPanel.rcMe.top,TmPanel.rcMe.right,TmPanel.rcMe.bottom, - TmPanel.hmdc,0,0,SRCCOPY); - - if(TmPanelAllUpdate){ - InvalidateRect(hPanelWnd, NULL, FALSE); - TmPanelAllUpdate = 0; - } - EndPaint(TmPanel.hwnd, &ps); -} - -void TmPanelSet(void) -{ - if(!TmPanelStart) - return; - if(Panel==NULL) - return; - if(TmPanel.TitleDone==TMP_DONOT){ - if(cur_pl!=NULL){ - strncpy((char *)TmPanel.Title,(char *)cur_pl->title,TMP_TITLE_MAX); - TmPanel.Title[TMP_TITLE_MAX] = '\0'; - TmPanel.TitleDone = TMP_PREPARE; - } else { - TmPanel.Title[0] = '\0'; - TmPanel.TitleDone = TMP_PREPARE; -// TmPanel.TitleDone = TMP_DONOT; - } - } - if(TmPanel.FileDone==TMP_DONOT){ - if(cur_pl!=NULL){ - strncpy((char *)TmPanel.File,(char *)cur_pl->filename,TMP_FILE_MAX); - TmPanel.File[TMP_FILE_MAX] = '\0'; - TmPanel.FileDone = TMP_PREPARE; - } else { - TmPanel.File[0] = '\0'; - TmPanel.FileDone = TMP_PREPARE; -// TmPanel.FileDone = TMP_DONOT; - } - } - if(TmPanel.TimeHDone==TMP_DONOT) - TmPanel.TimeHDone = TMP_PREPARE; - if(TmPanel.TimeDone==TMP_DONOT){ - if(TmPanel.cur_time_s == Panel->cur_time_s -// && TmPanel.cur_time_ss == Panel->cur_time_ss - && TmPanel.cur_time_m == Panel->cur_time_m - && TmPanel.cur_time_h == Panel->cur_time_h - && TmPanel.total_time_h == Panel->total_time_h - && TmPanel.total_time_m == Panel->total_time_m - && TmPanel.total_time_s == Panel->total_time_s -// && TmPanel.total_time_ss == Panel->total_time_ss - ) - TmPanel.TimeDone = TMP_DONOT; - else { - TmPanel.cur_time_h = Panel->cur_time_h; - TmPanel.cur_time_m = Panel->cur_time_m; - TmPanel.cur_time_s = Panel->cur_time_s; - TmPanel.cur_time_ss = Panel->cur_time_ss; - TmPanel.total_time_h = Panel->total_time_h; - TmPanel.total_time_m = Panel->total_time_m; - TmPanel.total_time_s = Panel->total_time_s; - TmPanel.total_time_ss = Panel->total_time_ss; - RANGE(TmPanel.cur_time_h,0,99); - RANGE(TmPanel.total_time_h,0,99); - TmPanel.TimeDone = TMP_PREPARE; - } - } - if(TmPanel.VoicesHDone==TMP_DONOT) - TmPanel.VoicesHDone = TMP_PREPARE; - if(TmPanel.VoicesDone==TMP_DONOT){ - if(player_status != PLAYERSTATUS_PLAY){ - Panel->voices = st_current->voices; - } - if(TmPanel.cur_voices == Panel->cur_voices - && TmPanel.voices == Panel->voices) - TmPanel.VoicesDone = TMP_DONOT; - else { - TmPanel.cur_voices = Panel->cur_voices; - TmPanel.voices = Panel->voices; - TmPanel.VoicesDone = TMP_PREPARE; - } - } - if(TmPanel.MasterVolumeHDone==TMP_DONOT) - TmPanel.MasterVolumeHDone = TMP_PREPARE; - if(TmPanel.MasterVolumeDone==TMP_DONOT){ - if(player_status != PLAYERSTATUS_PLAY){ - Panel->master_volume = st_current->amplification; - MainWndScrollbarVolumeUpdate(); - } - if(TmPanel.master_volume == Panel->master_volume) - TmPanel.MasterVolumeDone = TMP_DONOT; - else { - TmPanel.master_volume = Panel->master_volume; - TmPanel.MasterVolumeDone = TMP_PREPARE; - } - } - if(TmPanel.ListHDone==TMP_DONOT) - TmPanel.ListHDone = TMP_PREPARE; - if(TmPanel.ListDone==TMP_DONOT){ - if(TmPanel.cur_pl_num == cur_pl_num && TmPanel.playlist_num == playlist_num) - TmPanel.ListDone = TMP_DONOT; - else { - TmPanel.cur_pl_num = cur_pl_num; - TmPanel.playlist_num = playlist_num; - TmPanel.ListDone = TMP_PREPARE; - } - } - TmPanelUpdate(); -} - - - - - - - - - - - -// ---------------------------------------------------------------------------- -// Progress Scrollbar - -int MainWndScrollbarProgressPos = 0; -int MainWndScrollbarProgressPosMin = 0; -int MainWndScrollbarProgressPosMax = 1000; -int MainWndScrollbarProgressNotUpdate = 0; -int MainWndScrollbarProgressApplyFlag = 0; - -HWND hMainWndScrollbarProgressWnd = 0; - -void MainWndScrollbarProgressReset(void) -{ - HWND hwnd = 0; - if(hMainWndScrollbarProgressWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_PROGRESS); - hMainWndScrollbarProgressWnd = hwnd; - if(hwnd==0) - return; - } else - hwnd = hMainWndScrollbarProgressWnd; - - EnableScrollBar(hwnd,SB_CTL,ESB_ENABLE_BOTH); - SetScrollRange(hwnd,SB_CTL, - MainWndScrollbarProgressPosMin,MainWndScrollbarProgressPosMax,TRUE); - MainWndScrollbarProgressPos = MainWndScrollbarProgressPosMin; - SetScrollPos(hwnd,SB_CTL,MainWndScrollbarProgressPosMin,TRUE); - MainWndScrollbarProgressNotUpdate = 0; - MainWndScrollbarProgressApplyFlag = 0; -} - -void MainWndScrollbarProgressInit(void) -{ - MainWndScrollbarProgressReset(); -} - -static int Time2Pos(int32 time) -{ - if(MainWndScrollbarProgressPosMax==MainWndScrollbarProgressPosMin) - return 0; - if(Panel->total_time<=0) - return 0; - return ((int32)(MainWndScrollbarProgressPosMax-MainWndScrollbarProgressPosMin)) - * time / Panel->total_time; -} - -static int32 Pos2Time(int pos) -{ - if(MainWndScrollbarProgressPosMax==MainWndScrollbarProgressPosMin) - return MainWndScrollbarProgressPosMin; - return (Panel->total_time)*((int32)pos) - /(MainWndScrollbarProgressPosMax-MainWndScrollbarProgressPosMin); -} - -void MainWndScrollbarProgressApply(int pos) -{ - int min,max; - HWND hwnd = 0; - int32 val; - if(hMainWndScrollbarProgressWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_PROGRESS); - hMainWndScrollbarProgressWnd = hwnd; - if(hwnd==0) - return; - MainWndScrollbarProgressReset(); - } else - hwnd = hMainWndScrollbarProgressWnd; - - if(!IsWindowEnabled(hwnd)) - return; - if(pos == GetScrollPos(hwnd,SB_CTL)) - return; - val = Pos2Time(pos); - - if(val/100 != Panel->cur_time/100){ - val *= (st_current->output_rate)/100; - PutCrbLoopBuffer(RC_JUMP,val); - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarProgressPos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - MainWndScrollbarProgressApplyFlag = 10; - PanelPartReset(); - return; - } -} - -void MainWndScrollbarProgressUpdate(void) -{ - int min,max,pos; - HWND hwnd = 0; - - if(hMainWndScrollbarProgressWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_PROGRESS); - hMainWndScrollbarProgressWnd = hwnd; - if(hwnd==0) - return; - MainWndScrollbarProgressReset(); - } else - hwnd = hMainWndScrollbarProgressWnd; - - if(player_status == PLAYERSTATUS_PLAY) - EnableWindow(hwnd,TRUE); - else { - MainWndScrollbarProgressReset(); - EnableWindow(hwnd,FALSE); - return; - } - if(!IsWindowEnabled(hwnd)) - return; - - if(MainWndScrollbarProgressNotUpdate) - return; - - pos = Time2Pos(Panel->cur_time); - if(MainWndScrollbarProgressPos == pos) - return; - else { - if(MainWndScrollbarProgressApplyFlag){ - MainWndScrollbarProgressApplyFlag--; - if(MainWndScrollbarProgressApplyFlag<0) - MainWndScrollbarProgressApplyFlag = 0; - return; - } - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarProgressPos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - } -} - - - - - - - - - - -// ---------------------------------------------------------------------------- -// Volume Scrollbar - -int MainWndScrollbarVolumePos = 0; -int MainWndScrollbarVolumePosMin = 0; -int MainWndScrollbarVolumePosMax = 200; -int MainWndScrollbarVolumeNotUpdate = 0; -int MainWndScrollbarVolumeApplyFlag = 0; - -HWND hMainWndScrollbarVolumeWnd = 0; - -void MainWndScrollbarVolumeReset(void) -{ - HWND hwnd = 0; - if(hMainWndScrollbarVolumeWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_VOLUME); - hMainWndScrollbarVolumeWnd = hwnd; - if(hwnd==0) - return; - } else - hwnd = hMainWndScrollbarVolumeWnd; - - EnableScrollBar(hwnd,SB_CTL,ESB_ENABLE_BOTH); - SetScrollRange(hwnd,SB_CTL, - MainWndScrollbarVolumePosMin,MainWndScrollbarVolumePosMax,TRUE); - MainWndScrollbarVolumePos = MainWndScrollbarVolumePosMin; - SetScrollPos(hwnd,SB_CTL,MainWndScrollbarVolumePosMin,TRUE); - MainWndScrollbarVolumeNotUpdate = 0; - MainWndScrollbarVolumeApplyFlag = 0; -} - -void MainWndScrollbarVolumeInit(void) -{ - MainWndScrollbarVolumeReset(); -} - -static int Volume2Pos(int vol) -{ - int pos = MainWndScrollbarVolumePosMax-vol; - RANGE(pos,MainWndScrollbarVolumePosMin,MainWndScrollbarVolumePosMax); - return pos; -} - - -static int32 Pos2Volume(int pos) -{ - int vol = MainWndScrollbarVolumePosMax-pos; - RANGE(vol,MainWndScrollbarVolumePosMin,MainWndScrollbarVolumePosMax); - return vol; -} - -void MainWndScrollbarVolumeApply(int pos) -{ - int min,max; - HWND hwnd = 0; - int32 val; - if(hMainWndScrollbarVolumeWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_VOLUME); - hMainWndScrollbarVolumeWnd = hwnd; - if(hwnd==0) - return; - MainWndScrollbarVolumeReset(); - } else - hwnd = hMainWndScrollbarVolumeWnd; - - if(!IsWindowEnabled(hwnd)) - return; - if(pos == GetScrollPos(hwnd,SB_CTL)) - return; - - val = Pos2Volume(pos); - if(player_status == PLAYERSTATUS_PLAY){ - if(val != Panel->master_volume){ - if(st_current->amplification != val) - st_current->amplification = val; - val -= Panel->master_volume; - PutCrbLoopBuffer(RC_CHANGE_VOLUME,val); - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarVolumePos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - MainWndScrollbarVolumeApplyFlag = 3; - return; - } - } else { - if(st_current->amplification != val){ - st_current->amplification = val; - ApplySettingTimidity(st_current); - } - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarVolumePos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - TmPanelSet(); - return; - } -} - -void MainWndScrollbarVolumeUpdate(void) -{ - int min,max,pos; - HWND hwnd = 0; - if(hMainWndScrollbarVolumeWnd==0){ - hwnd = GetDlgItem(hMainWnd,IDC_SCROLLBAR_VOLUME); - hMainWndScrollbarVolumeWnd = hwnd; - if(hwnd==0) - return; - MainWndScrollbarVolumeReset(); - } else - hwnd = hMainWndScrollbarVolumeWnd; - - if(!IsWindowEnabled(hwnd)) - return; - - if(player_status != PLAYERSTATUS_PLAY){ - pos = Volume2Pos(st_current->amplification); - if(pos != GetScrollPos(hwnd,SB_CTL)){ - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarVolumePos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - } - return; - } - - if(MainWndScrollbarVolumeNotUpdate) - return; - - pos = Volume2Pos(Panel->master_volume); - if(MainWndScrollbarVolumePos == pos) - return; - else { - if(MainWndScrollbarVolumeApplyFlag){ - MainWndScrollbarVolumeApplyFlag--; - if(MainWndScrollbarVolumeApplyFlag<0) - MainWndScrollbarVolumeApplyFlag = 0; - return; - } - GetScrollRange(hwnd,SB_CTL,&min,&max); - RANGE(pos,min,max); - MainWndScrollbarVolumePos = pos; - SetScrollPos(hwnd,SB_CTL,pos,TRUE); - } -} - - - - - - - -// ---------------------------------------------------------------------------- -// Misc. Controls - - - - - - - - - - - -// ---------------------------------------------------------------------------- - - - - - - - - - -// **************************************************************************** -// Version Window - -static void VersionWnd(HWND hParentWnd) -{ - char VersionText[2024]; - sprintf(VersionText, -"TiMidity-0.2i by Tuukka Toivonen ." NLS -"TiMidity Win32 version by Davide Moretti ." NLS -"TiMidity Windows 95 port by Nicolas Witczak." NLS -"TiMidity Win32 GUI by Daisuke Aoki ." NLS -"Win32GUI alpha version (Z1.W32G.0.02)" NLS -"TiMidity++ by Masanao Izumo ." NLS - ); - MessageBox(hParentWnd, VersionText, "Version", MB_OK); -} - -static void TiMidityWnd(HWND hParentWnd) -{ - char TiMidityText[2024]; - sprintf(TiMidityText, -" TiMidity++ version %s -- Experimental MIDI to WAVE converter" NLS -" Copyright (C) 1999 Masanao Izumo " NLS -" Copyright (C) 1995 Tuukka Toivonen " NLS -NLS -" Win32 version by Davide Moretti " NLS -" GUI by Daisuke Aoki ." NLS -" Modified by Masanao Izumo ." NLS -NLS -" This program is free software; you can redistribute it and/or modify" NLS -" it under the terms of the GNU General Public License as published by" NLS -" the Free Software Foundation; either version 2 of the License, or" NLS -" (at your option) any later version." NLS -NLS -" This program is distributed in the hope that it will be useful," NLS -" but WITHOUT ANY WARRANTY; without even the implied warranty of"NLS -" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" NLS -" GNU General Public License for more details." NLS -NLS -" You should have received a copy of the GNU General Public License" NLS -" along with this program; if not, write to the Free Software" NLS -" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." NLS -, -timidity_version - ); - MessageBox(hParentWnd, TiMidityText, "TiMidity", MB_OK); -} - - -// **************************************************************************** -// Debug Window -#ifdef W32GUI_DEBUG - -BOOL CALLBACK DebugWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitDebugEditWnd(HWND hParentWnd); - -void InitDebugWnd(HWND hParentWnd) -{ - hDebugWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_DEBUG),hParentWnd,DebugWndProc); - ShowWindow(hDebugWnd,SW_HIDE); - UpdateWindow(hDebugWnd); -} - - - -BOOL CALLBACK -DebugWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - RECT rc; - switch (uMess){ - case WM_INITDIALOG: - InitDebugEditWnd(hwnd); - if(DebugWndFlag) - CheckDlgButton(hwnd, IDC_CHECKBOX_DEBUG_WND_VALID, 1); - else - CheckDlgButton(hwnd, IDC_CHECKBOX_DEBUG_WND_VALID, 0); - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - break; - case IDCLEAR: - ClearDebugWnd(); - break; - case IDC_CHECKBOX_DEBUG_WND_VALID: - if(IsDlgButtonChecked(hwnd,IDC_CHECKBOX_DEBUG_WND_VALID)) - DebugWndFlag = 1; - else - DebugWndFlag = 0; - break; - default: - return FALSE; - } - case WM_SIZE: - GetClientRect(hDebugWnd, &rc); - MoveWindow(hDebugEditWnd, rc.left, rc.top,rc.right, rc.bottom - 30,TRUE); - return FALSE; - case WM_CLOSE: - ShowWindow(hDebugWnd, SW_HIDE); - break; - default: - return FALSE; - } - return FALSE; -} - -void InitDebugEditWnd(HWND hParentWnd) -{ - RECT rc; - GetClientRect(hParentWnd, &rc); - hDebugEditWnd = CreateWindowEx( - WS_EX_CLIENTEDGE|WS_EX_TOOLWINDOW|WS_EX_DLGMODALFRAME, - "EDIT","", - WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL - |ES_READONLY | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL , -// 0,0,rc.right, rc.bottom - 30,hParentWnd,NULL,hInst,NULL); - 0,0,100,100,hParentWnd,NULL,hInst,NULL); - SendMessage(hDebugEditWnd, EM_SETLIMITTEXT, (WPARAM)1024*64, 0); -// SendMessage(hDebugEditWnd, WM_PAINT, 0, 0); - GetClientRect(hParentWnd, &rc); - MoveWindow(hDebugEditWnd,rc.left,rc.top,rc.right,rc.bottom-30,TRUE); - ClearDebugWnd(); - ShowWindow(hDebugEditWnd,SW_SHOW); - UpdateWindow(hDebugEditWnd); -} - -void PutsDebugWnd(char *str) -{ - if(!IsWindow(hDebugEditWnd) || !DebugWndFlag) - return; - PutsEditCtlWnd(hDebugEditWnd,str); -} - -void PrintfDebugWnd(char *fmt, ...) -{ - va_list ap; - if(!IsWindow(hDebugEditWnd) || !DebugWndFlag) - return; - va_start(ap, fmt); - VprintfEditCtlWnd(hDebugEditWnd,fmt,ap); - va_end(ap); -} - -void ClearDebugWnd(void) -{ - if(!IsWindow(hDebugEditWnd)) - return; - ClearEditCtlWnd(hDebugEditWnd); -} - -#endif - - - - - -// *************************************************************************** -// Console Window - -BOOL CALLBACK ConsoleWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); - -void InitConsoleWnd(HWND hParentWnd) -{ - hConsoleWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_CONSOLE),hParentWnd,ConsoleWndProc); - ShowWindow(hConsoleWnd,SW_HIDE); - UpdateWindow(hConsoleWnd); -} - -int ConsoleWndMaxSize = 64 * 1024; - -void ConsoleWndAllUpdate(void); -void ConsoleWndVerbosityUpdate(void); -void ConsoleWndVerbosityApply(void); -void ConsoleWndValidUpdate(void); -void ConsoleWndValidApply(void); -void ConsoleWndVerbosityApplyIncDec(int num); - -BOOL CALLBACK -ConsoleWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - PutsConsoleWnd("Console Window\n"); - ConsoleWndAllUpdate(); - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateConsoleButton(); - break; - case IDCLEAR: - ClearConsoleWnd(); - break; - case IDC_CHECKBOX_VALID: - ConsoleWndValidApply(); - break; - case IDC_BUTTON_VERBOSITY: - ConsoleWndVerbosityApply(); - break; - case IDC_BUTTON_INC: - ConsoleWndVerbosityApplyIncDec(1); - break; - case IDC_BUTTON_DEC: - ConsoleWndVerbosityApplyIncDec(-1); - break; - default: - return FALSE; - } - case WM_SIZE: - ConsoleWndAllUpdate(); - return FALSE; - case WM_CLOSE: - ShowWindow(hConsoleWnd, SW_HIDE); - MainWndUpdateConsoleButton(); - break; - case WM_SETFOCUS: - HideCaret(hwnd); - break; - case WM_KILLFOCUS: - ShowCaret(hwnd); - break; - default: - return FALSE; - } - return FALSE; -} - -void PutsConsoleWnd(char *str) -{ - HWND hwnd; - if(!IsWindow(hConsoleWnd) || !ConsoleWndFlag) - return; - hwnd = GetDlgItem(hConsoleWnd,IDC_EDIT); - PutsEditCtlWnd(hwnd,str); -} - -void PrintfConsoleWnd(char *fmt, ...) -{ - HWND hwnd; - va_list ap; - if(!IsWindow(hConsoleWnd) || !ConsoleWndFlag) - return; - hwnd = GetDlgItem(hConsoleWnd,IDC_EDIT); - va_start(ap, fmt); - VprintfEditCtlWnd(hwnd,fmt,ap); - va_end(ap); -} - -void ClearConsoleWnd(void) -{ - HWND hwnd; - if(!IsWindow(hConsoleWnd)) - return; - hwnd = GetDlgItem(hConsoleWnd,IDC_EDIT); - ClearEditCtlWnd(hwnd); -} - -void ConsoleWndAllUpdate(void) -{ - ConsoleWndVerbosityUpdate(); - ConsoleWndValidUpdate(); - Edit_LimitText(GetDlgItem(hConsoleWnd,IDC_EDIT_VERBOSITY),3); - Edit_LimitText(GetDlgItem(hConsoleWnd,IDC_EDIT),ConsoleWndMaxSize); -} - -void ConsoleWndValidUpdate(void) -{ - if(ConsoleWndFlag) - CheckDlgButton(hConsoleWnd, IDC_CHECKBOX_VALID, 1); - else - CheckDlgButton(hConsoleWnd, IDC_CHECKBOX_VALID, 0); -} - -void ConsoleWndValidApply(void) -{ - if(IsDlgButtonChecked(hConsoleWnd,IDC_CHECKBOX_VALID)) - ConsoleWndFlag = 1; - else - ConsoleWndFlag = 0; -} - -void ConsoleWndVerbosityUpdate(void) -{ - SetDlgItemInt(hConsoleWnd,IDC_EDIT_VERBOSITY,(UINT)ctl->verbosity, TRUE); -} - -void ConsoleWndVerbosityApply(void) -{ - char buffer[64]; - HWND hwnd; - hwnd = GetDlgItem(hConsoleWnd,IDC_EDIT_VERBOSITY); - if(!IsWindow(hConsoleWnd)) return; - if(Edit_GetText(hwnd,buffer,60)<=0) return; - ctl->verbosity = atoi(buffer); - ConsoleWndVerbosityUpdate(); -} - -void ConsoleWndVerbosityApplyIncDec(int num) -{ - int verbosity = 0; - if(!IsWindow(hConsoleWnd)) return; - verbosity = ctl->verbosity; - if(num > 0) - verbosity++; - else if(num < 0) - verbosity--; - else - verbosity = 1; - ctl->verbosity = verbosity; - ConsoleWndVerbosityUpdate(); -} - -// **************************************************************************** -// List Window - -BOOL CALLBACK ListWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitListWnd(HWND hParentWnd) -{ - hListWnd = CreateDialog -// (hInst,MAKEINTRESOURCE(IDD_DIALOG_LIST),hParentWnd,ListWndProc); - (hInst,MAKEINTRESOURCE(IDD_DIALOG_SIMPLE_LIST),hParentWnd,ListWndProc); - ShowWindow(hListWnd,SW_HIDE); - UpdateWindow(hListWnd); - UpdateListWnd(); -} - -BOOL CALLBACK -ListWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - UpdateListWnd(); - return FALSE; - case WM_COMMAND: - switch (HIWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateListButton(); - break; - case LBN_DBLCLK: - { - if(LOWORD(wParam)==IDC_LISTBOX_PLAYLIST){ - HWND hListBox = (HWND)lParam; - int num = ListBox_GetCurSel(hListBox); - if(num>=0){ - SetCur_plNum(num); - PlayerOnPlayEx(RC_LOAD_FILE); - } - } - } - return FALSE; - default: - return FALSE; - } - return FALSE; - case WM_VKEYTOITEM: - { - UINT vkey = (UINT)LOWORD(wParam); - int nCaretPos = (int)HIWORD(wParam); - int num; - switch(vkey){ - case VK_RETURN: - num = nCaretPos; - if(num>=0){ - SetCur_plNum(num); - PlayerOnPlayEx(RC_LOAD_FILE); - } - return -2; - default: - break; - } - return -1; - } - case WM_SIZE: - return FALSE; - case WM_CLOSE: - ShowWindow(hListWnd, SW_HIDE); - MainWndUpdateListButton(); - break; - case WM_DROPFILES: - SendMessage(hMainWnd,WM_DROPFILES,wParam,lParam); - return FALSE; - default: - return FALSE; - } - return FALSE; -} - -volatile static int ResetListWndDoing = 0; -#if 0 /* not used */ -static void ResetListWnd(void) -{ - HWND hListBox = GetDlgItem(hListWnd, IDC_LISTBOX_PLAYLIST); - PLAYLIST *pl; - char local[1024]; - int top_index; - if(!hListBox) - return; - if(ResetListWndDoing) - return; - ResetListWndDoing = 1; - top_index = ListBox_GetTopIndex(hListBox); - ListBox_ResetContent(hListBox); - if(playlist!=NULL){ - PLAYLIST *current_playlist; - LockPlaylist(); - current_playlist = cur_pl; - for(pl=playlist;pl!=NULL;pl=pl->next){ - if(pl==current_playlist) - sprintf(local,"* %s (%s)",pl->title,pl->filename); - else - sprintf(local," %s (%s)",pl->title,pl->filename); - ListBox_AddString(hListBox,local); - } - UnLockPlaylist(); - } - ListBox_SetTopIndex(hListBox,top_index); - ListBox_SetCurSel(hListBox,cur_pl_num-1); - ResetListWndDoing = 0; -} -#endif - -volatile static int UpdateListWndDoing = 0; -void UpdateListWnd(void) -{ - HWND hListBox; - PLAYLIST *pl; - char local[1024],local2[1024]; - int top_index; - if(!hListBox) - return; - if(UpdateListWndDoing) - return; - UpdateListWndDoing = 1; - hListBox = GetDlgItem(hListWnd, IDC_LISTBOX_PLAYLIST); - top_index = ListBox_GetTopIndex(hListBox); -// ListBox_ResetContent(hListBox); - if(playlist!=NULL){ - PLAYLIST *current_playlist; - volatile char *p1,*p2; - int i = -1; - LockPlaylist(); - current_playlist = cur_pl; - for(pl=playlist;pl!=NULL;pl=pl->next){ - i++; - p1 = pl->title; - if(p1==NULL || p1[0] == '\0') - p1 = " -------- "; - p2 = pl->filename; - if(pl==current_playlist) - sprintf(local,"%04d*%s (%s)",i+1,p1,p2); - else - sprintf(local,"%04d %s (%s)",i+1,p1,p2); - ListBox_GetText(hListBox,i,local2); - if(strcmp(local,local2)){ - ListBox_DeleteString(hListBox,i); - ListBox_InsertString(hListBox,i,local); - } -// ListBox_AddString(hListBox,local); - } - UnLockPlaylist(); - } - ListBox_SetTopIndex(hListBox,top_index); - ListBox_SetCurSel(hListBox,cur_pl_num-1); - UpdateListWndDoing = 0; -} - - - - - - -// *************************************************************************** -// Tracer Window - -BOOL CALLBACK TracerWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitTracerWnd(HWND hParentWnd) -{ - hTracerWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_TRACER),hParentWnd,TracerWndProc); - ShowWindow(hTracerWnd,SW_HIDE); - UpdateWindow(hTracerWnd); -} - -BOOL CALLBACK -TracerWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateTracerButton(); - break; - default: - return FALSE; - } - case WM_SIZE: - return FALSE; - case WM_CLOSE: - ShowWindow(hTracerWnd, SW_HIDE); - MainWndUpdateTracerButton(); - break; - default: - return FALSE; - } - return FALSE; -} - - - - -// **************************************************************************** -// Wrd Window - -BOOL CALLBACK WrdWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitWrdWnd(HWND hParentWnd) -{ - hWrdWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_WRD),hParentWnd,WrdWndProc); - ShowWindow(hWrdWnd,SW_HIDE); - UpdateWindow(hWrdWnd); -} - -BOOL CALLBACK -WrdWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateWrdButton(); - break; - default: - return FALSE; - } - case WM_SIZE: - return FALSE; - case WM_CLOSE: - ShowWindow(hWrdWnd, SW_HIDE); - MainWndUpdateWrdButton(); - break; - default: - return FALSE; - } - return FALSE; -} - - - - -//**************************************************************************** -// Doc Window - -BOOL CALLBACK DocWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitDocEditWnd(HWND hParentWnd); - -void InitDocWnd(HWND hParentWnd) -{ - hDocWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_DOC),hParentWnd,DocWndProc); - ShowWindow(hDocWnd,SW_HIDE); - UpdateWindow(hDocWnd); -} - -BOOL CALLBACK -DocWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - PutsDocWnd("Doc Window\n"); - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateDocButton(); - break; - case IDCLEAR: - ClearDocWnd(); - break; - default: - return FALSE; - } - case WM_CLOSE: - ShowWindow(hDocWnd, SW_HIDE); - MainWndUpdateDocButton(); - break; - default: - return FALSE; - } - return FALSE; -} - -void PutsDocWnd(char *str) -{ - HWND hwnd; - if(!IsWindow(hDocWnd) || !DocWndFlag) - return; - hwnd = GetDlgItem(hDocWnd,IDC_EDIT); - PutsEditCtlWnd(hwnd,str); -} - -void PrintfDocWnd(char *fmt, ...) -{ - HWND hwnd; - va_list ap; - if(!IsWindow(hDocWnd) || !DocWndFlag) - return; - hwnd = GetDlgItem(hDocWnd,IDC_EDIT); - va_start(ap, fmt); - VprintfEditCtlWnd(hwnd,fmt,ap); - va_end(ap); -} - -void ClearDocWnd(void) -{ - HWND hwnd; - if(!IsWindow(hDocWnd)) - return; - hwnd = GetDlgItem(hDocWnd,IDC_EDIT); - ClearEditCtlWnd(hwnd); -} - -//**************************************************************************** -// SoundSpec Window - -BOOL CALLBACK SoundSpecWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); -void InitSoundSpecWnd(HWND hParentWnd) -{ - hSoundSpecWnd = CreateDialog - (hInst,MAKEINTRESOURCE(IDD_DIALOG_SOUNDSPEC),hParentWnd,SoundSpecWndProc); - ShowWindow(hSoundSpecWnd,SW_HIDE); - UpdateWindow(hSoundSpecWnd); -} - -BOOL CALLBACK -SoundSpecWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - switch (uMess){ - case WM_INITDIALOG: - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCLOSE: - ShowWindow(hwnd, SW_HIDE); - MainWndUpdateSoundSpecButton(); - break; - default: - return FALSE; - } - case WM_SIZE: - return FALSE; - case WM_CLOSE: - ShowWindow(hSoundSpecWnd, SW_HIDE); - MainWndUpdateSoundSpecButton(); - break; - default: - return FALSE; - } - return FALSE; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// **************************************************************************** -// Main Thread - -#ifdef W32ENABLE_OPTIONS -#define OPTCOMMANDS "A:aB:b:C:c:D:d:eE:Ffg:hI:i:jL:n:O:o:P:p:Q:R:rS:s:t:UW:w:x:" -extern int optind; -extern char *optarg; -extern int getopt(int, char **, char *); -extern int set_tim_opt(int c, char *optarg); -#endif /* W32ENABLE_OPTIONS */ - -void MainThread(void *arglist) -{ - int argc = *(((MAINTHREAD_ARGS *)arglist)->pArgc); - char **argv = *(((MAINTHREAD_ARGS *)arglist)->pArgv); - int err = 0; - int nfiles = argc; - char **files = argv; - char c; - - if((program_name=strrchr(argv[0], PATH_SEP))!=NULL) - program_name++; - else - program_name=argv[0]; - - timidity_start_initialize(); - timidity_init_player(); - -// commindline option -#ifdef W32ENABLE_OPTIONS - while((c = getopt(argc, argv, OPTCOMMANDS)) > 0) - if((err += set_tim_opt(c, optarg)) != 0) - break; -#endif /* W32ENABLE_OPTIONS */ - - if(read_config_file(ConfigFile,0)) - { - char str[256]; - - ctl->cmsg(CMSG_INFO, VERB_NOISY, - "Warning: Cannot read %s correctly", - ConfigFile); - snprintf(str, sizeof(str), - "Warning: Cannot read %s correctly", ConfigFile); - MessageBox(hMainWnd, str, "Error", MB_OK); - } - SaveSettingPlayer(sp_current); - SaveSettingTimidity(st_current); /* Initialize st_current */ - LoadIniFile(sp_current,st_current); - ApplySettingPlayer(sp_current); - ApplySettingTimidity(st_current); - SaveSettingPlayer(sp_default); - SaveSettingTimidity(st_default); - SaveIniFile(sp_current,st_current); - - w32g_init_ctl(); - - nfiles = argc - optind; - files = argv + optind; - if(ctl->flags & CTLF_LIST_RANDOM) - randomize_string_list(files, nfiles); - else if(ctl->flags & CTLF_LIST_SORT) - sort_pathname(files, nfiles); - PlayerPlaylistAddFiles(nfiles,files,1); - wait_thread_flag = 0; - Player_loop(1); - - done: -#if defined(__CYGWIN32__) || defined(__MINGW32__) - ExitThread(0); -#else - _endthread(); -#endif -} - - - - - - - - - - - - - - - - - - - - -// ************************************************************************** -// Misc Dialog - -void DlgMultiFileOpen - (char*** ppszFileList,int* icbCount,char *filter, char *dir) -{ -#define cbszFileName 16536 - OPENFILENAME ofn; - int iIndex; - char* pFileName ; - pFileName = (char*)calloc(cbszFileName, sizeof(char)) ; - pFileName[0] = '\0' ; - memset(&ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = 0; - ofn.hInstance = hInst ; - ofn.lpstrFilter = filter; - ofn.lpstrCustomFilter = 0; - ofn.nMaxCustFilter = 1 ; - ofn.nFilterIndex = 1 ; - ofn.lpstrFile = pFileName; - ofn.nMaxFile = cbszFileName; - ofn.lpstrFileTitle = 0; - ofn.nMaxFileTitle = 0; - if(dir[0] != '\0') - ofn.lpstrInitialDir = dir; - else - ofn.lpstrInitialDir = 0; - ofn.lpstrTitle = 0; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST - | OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_READONLY; - ofn.lpstrDefExt = 0; - ofn.lCustData = 0; - ofn.lpfnHook = 0; - ofn.lpTemplateName= 0; - - if(!GetOpenFileName(&ofn)) - return; - -// count files - for(iIndex=1 , (*icbCount)=-1 ;(pFileName[iIndex-1] != '\0') || (pFileName[iIndex] != '\0') ;iIndex++ ) - { - if(pFileName[iIndex] == '\0') - (*icbCount)++; - } - // extract file list - if( (*icbCount) > 0 ) - { - (*ppszFileList) = (char**)calloc(*icbCount, sizeof(char*) ); - for(iIndex=0;iIndex<(*icbCount);iIndex++) - { - while( ( *(ofn.lpstrFile++) )!= '\0') - { (void)0 ; } - (*ppszFileList)[iIndex] = (char*)calloc(strlen(ofn.lpstrFile) - + strlen(pFileName) + 2 , sizeof(char) ) ; - strcpy((*ppszFileList)[iIndex],pFileName); - strcat((*ppszFileList)[iIndex],"\\"); - strcat( (*ppszFileList)[iIndex] , ofn.lpstrFile ); - } - } - else - { - (*icbCount) = 1 ; - (*ppszFileList) = (char**)calloc(*icbCount,sizeof(char*)); - (*ppszFileList)[0] = (char*)calloc( strlen(pFileName) + 1 , sizeof(char) ); - strcpy((*ppszFileList)[0],pFileName); - } - free(pFileName); - return ; -} - -char MidiFileExtFilter[] = - "midi file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36\0" - "archive file\0*.lzh;*.zip;*.gz\0" - "all files\0*.*\0" - "\0\0"; - -void DlgMidiFileOpen(void) -{ - char **files = NULL; - int nfiles = 0, i; - PLAYLIST *cur_pl_old; - DlgMultiFileOpen(&files,&nfiles,MidiFileExtFilter,MidiFileOpenDir); - if(nfiles>0){ - cur_pl_old = cur_pl; - PlayerPlaylistAddFiles(nfiles,files,1); - for(i=0;iLotationBufferMAX-3){ - out[i] = '\0'; - break; - } - if(*in=='\n'){ - out[i] = 13; - out[i+1] = 10; - in++; - i += 2; - continue; - } - out[i] = *in; - in++; - i++; - } - if(IsWindow(hwnd)){ - Edit_SetSel(hwnd,0,-1); - Edit_SetSel(hwnd,-1,-1); - Edit_ReplaceSel(hwnd,out); - } -} - -void PrintfEditCtlWnd(HWND hwnd, char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - VprintfEditCtlWnd(hwnd,fmt,ap); - va_end(ap); -} - -#if 1 -void PutsEditCtlWnd(HWND hwnd, char *str) -{ - char *in = str; - int i; -#ifndef USE_LOTATION_BUFFER - char out[LotationBufferMAX]; -#else - char *out = GetLotationBuffer(); -#endif - i = 0; - for(;;){ - if(*in == '\0' || i>LotationBufferMAX-3){ - out[i] = '\0'; - break; - } - if(*in=='\n'){ - out[i] = 13; - out[i+1] = 10; - in++; - i += 2; - continue; - } - out[i] = *in; - in++; - i++; - } - if(IsWindow(hwnd)){ - Edit_SetSel(hwnd,0,-1); - Edit_SetSel(hwnd,-1,-1); - Edit_ReplaceSel(hwnd,out); - } -} -#else -void PutsEditCtlWnd(HWND hwnd, char *str) -{ - if(!IsWindow(hwnd)) - return; - PrintfEditCtlWnd(hwnd,"%s",str); -} -#endif - -void ClearEditCtlWnd(HWND hwnd) -{ - char pszVoid[]=""; - if(!IsWindow(hwnd)) - return; - Edit_SetText(hwnd,pszVoid); -} - -// ***************************************************************************** -// TiMidity settings - -static BOOL CALLBACK SettingWndProc(HWND hwnd, UINT uMess, - WPARAM wParam, LPARAM lParam); -static void OpenSettingWnd(HWND hParentWnd) -{ - static int setting_warning_displayed = 0; - - if(hSettingWnd == 0) - hSettingWnd = CreateDialog(hInst, - MAKEINTRESOURCE(IDD_DIALOG_SETTING), - hParentWnd,SettingWndProc); - ShowWindow(hSettingWnd,SW_SHOW); - UpdateWindow(hSoundSpecWnd); - SettingWndSetup(); -} - -#define IS_CHECKED(hwnd, id) (SendDlgItemMessage(hwnd, id, BM_GETCHECK, 0, 0) == BST_CHECKED) -#define SET_CHECKED(hwnd, id, test) \ - if(test) \ - SendDlgItemMessage(hwnd, id, BM_SETCHECK, BST_CHECKED, 0); \ - else \ - SendDlgItemMessage(hwnd, id, BM_SETCHECK, BST_UNCHECKED, 0) - -static void SettingWndSetup(void) -{ - char numstr[16]; - - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHORUS, opt_chorus_control); - - SendDlgItemMessage(hSettingWnd, IDC_CHECKBOX_CHORUS, - BM_SETSTYLE, - BS_AUTOCHECKBOX | BS_LEFT | BS_TOP | WS_TABSTOP | WS_DISABLED, - 0); - - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_REVERB, opt_reverb_control); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_DELAY_EFFECT, effect_lr_mode != -1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_FREE_INST, - free_instruments_afterwards); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_ANTIALIAS, antialiasing_allowed); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_MODWHEEL, opt_modulation_wheel); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_PORTAMENT, opt_portamento); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_NRPNVIB, opt_nrpn_vibrato); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHPRESS, opt_channel_pressure); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_OVOICE, opt_overlap_voice_allow); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_LOADINST_PLAYING, - opt_realtime_playing); - SET_CHECKED(hSettingWnd, IDC_RADIO_16BITS, play_mode->encoding & PE_16BIT); - SET_CHECKED(hSettingWnd, IDC_RADIO_8BITS, - !(play_mode->encoding & PE_16BIT)); - SET_CHECKED(hSettingWnd, IDC_RADIO_MONO, play_mode->encoding & PE_MONO); - SET_CHECKED(hSettingWnd, IDC_RADIO_STEREO, - !(play_mode->encoding & PE_MONO)); - - /* sample rate */ - sprintf(numstr, "%d", play_mode->rate); - SetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, numstr); - - - SetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, numstr); -// SendDlgItemMessage(hSettingWnd, IDC_EDIT_SAMPLE_RATE, -// EN_CHANGE, WS_DISABLED, 0); - -{static int i; -i = !i; -// SendDlgItemMessage(hSettingWnd, IDC_EDIT_SAMPLE_RATE, -// EM_SETREADONLY, i, 0); - -// SendDlgItemMessage(hSettingWnd, IDC_EDIT_SAMPLE_RATE, -// WM_ENABLE, 0, 0); -} - - - /* number of voices */ - sprintf(numstr, "%d", voices); - SetDlgItemText(hSettingWnd, IDC_EDIT_VOICES, numstr); - - /* Noise sharping */ - sprintf(numstr, "%d", noise_sharp_type); - SetDlgItemText(hSettingWnd, IDC_EDIT_NOISESHARPING, numstr); -} - -static void SettingWndApply(void) -{ - int is_checked, enc, rate, nv, ns, antialias; - char numstr[16]; - - if(player_status != PLAYERSTATUS_STOP) - { - ShowWindow(hSettingWnd, SW_HIDE); - MessageBox(hMainWnd, "Can't change parameter while playing", - "Warning", MB_OK); - return; - } - - opt_chorus_control = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_CHORUS); - opt_reverb_control = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_REVERB); - if(IS_CHECKED(hSettingWnd, IDC_CHECKBOX_DELAY_EFFECT)) - effect_lr_mode = 2; - else - effect_lr_mode = -1; - free_instruments_afterwards = IS_CHECKED(hSettingWnd, - IDC_CHECKBOX_FREE_INST); - antialias = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_ANTIALIAS); - opt_modulation_wheel = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_MODWHEEL); - opt_portamento = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_PORTAMENT); - opt_nrpn_vibrato = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_NRPNVIB); - opt_channel_pressure = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_CHPRESS); - opt_overlap_voice_allow = IS_CHECKED(hSettingWnd, IDC_CHECKBOX_OVOICE); - opt_realtime_playing = IS_CHECKED(hSettingWnd, - IDC_CHECKBOX_LOADINST_PLAYING); - - if(antialiasing_allowed != antialias) - { - antialiasing_allowed = antialias; - free_instruments(1); - } - - enc = play_mode->encoding; - rate = play_mode->rate; - nv = voices; - - /* 16 bit or 8 bit */ - is_checked = IS_CHECKED(hSettingWnd, IDC_RADIO_16BITS); - if(is_checked) - enc |= PE_16BIT; - else - enc &= ~PE_16BIT; - - /* stereo or mono */ - is_checked = IS_CHECKED(hSettingWnd, IDC_RADIO_MONO); - if(is_checked) - enc |= PE_MONO; - else - enc &= ~PE_MONO; - - GetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, numstr, sizeof(numstr)); - rate = atoi(numstr); - - GetDlgItemText(hSettingWnd, IDC_EDIT_NOISESHARPING, numstr, sizeof(numstr)); - ns = atoi(numstr); - - GetDlgItemText(hSettingWnd, IDC_EDIT_VOICES, numstr, sizeof(numstr)); - nv = atoi(numstr); - - if(play_mode->encoding != enc || play_mode->rate != rate) - target_play_mode = play_mode; - play_mode->encoding = enc; - play_mode->rate = rate; - voices = nv; - noise_sharp_type = ns; - SaveSettingTimidity(st_current); -} - -static void SettingWndDefault(void) -{ - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHORUS, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_REVERB, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_DELAY_EFFECT, 0); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_FREE_INST, 0); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_ANTIALIAS, 0); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_MODWHEEL, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_PORTAMENT, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_NRPNVIB, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_CHPRESS, 0); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_OVOICE, 1); - SET_CHECKED(hSettingWnd, IDC_CHECKBOX_LOADINST_PLAYING, 0); - SET_CHECKED(hSettingWnd, IDC_RADIO_16BITS, 1); - SET_CHECKED(hSettingWnd, IDC_RADIO_8BITS, 0); - SET_CHECKED(hSettingWnd, IDC_RADIO_STEREO, 1); - SET_CHECKED(hSettingWnd, IDC_RADIO_MONO, 0); - - SetDlgItemText(hSettingWnd, IDC_EDIT_SAMPLE_RATE, "33075"); - SetDlgItemText(hSettingWnd, IDC_EDIT_VOICES, "128"); - SetDlgItemText(hSettingWnd, IDC_EDIT_NOISESHARPING, "0"); -} - -static BOOL CALLBACK SettingWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) -{ - static int setting_warning_displayed = 0; - switch(uMess) - { - case WM_SHOWWINDOW: - if(wParam) - { - if(player_status != PLAYERSTATUS_STOP && - !setting_warning_displayed) - MessageBox(hMainWnd, "Don't change parameter while playing", - "Warning", MB_OK); - setting_warning_displayed = 1; - SettingWndSetup(); - } - else - setting_warning_displayed = 0; - break; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDCANCEL: - ShowWindow(hSettingWnd, SW_HIDE); - break; - case IDOK: - SettingWndApply(); - ShowWindow(hSettingWnd, SW_HIDE); - break; - case IDDEFAULT: - SettingWndDefault(); - break; - } - break; - - case WM_CLOSE: - ShowWindow(hSettingWnd, SW_HIDE); - break; - } - return 0; -} - -// **************************************************************************** -// Misc funciton. - -#if 0 /* not used */ -static char *get_filename(char *src, char *dest) -{ - char *p = src; - char *start = NULL; - int quot_flag = 0; - if(p == NULL) - return NULL; - for(;;){ - if(*p != ' ' && *p != '\0' && start == NULL) - start = p; - if(*p == '\'' || *p == '\"'){ - if(quot_flag){ - if(p - start != 0) - strncpy(dest, start, p - start); - dest[p-start] = '\0'; - p++; - return p; - } else { - quot_flag = !quot_flag; - p++; - start = p; - continue; - } - } - if(*p == '\0' || (*p == ' ' && !quot_flag)){ - if(start == NULL) - return NULL; - if(p - start != 0) - strncpy(dest, start, p - start); - dest[p-start] = '\0'; - if(*p != '\0') - p++; - return p; - } - p++; - } -} - -static void CmdLineToArgv(LPSTR lpCmdLine, int *pArgc, CHAR ***pArgv) -{ - LPSTR p = lpCmdLine , buffer, lpsRes; - int i, max = -1, inc = 16; - int buffer_size; - - buffer_size = strlen(lpCmdLine) + 1024; - buffer = safe_malloc(sizeof(CHAR) * buffer_size + 1); - strcpy(buffer, lpCmdLine); - - for(i=0;;i++) - { - if(i > max){ - max += inc; - *pArgv = (CHAR **)safe_realloc(*pArgv, sizeof(CHAR *) * (max + 1)); - } - if(i==0){ - GetModuleFileName(NULL,buffer,buffer_size); - lpsRes = p; - } else - lpsRes = get_filename(p,buffer); - if(lpsRes != NULL){ - (*pArgv)[i] = (CHAR *)safe_malloc(sizeof(CHAR) * strlen(buffer) + 1); - strcpy((*pArgv)[i],buffer); - p = lpsRes; - } else { - *pArgc = i; - free(buffer); - return; - } - } -} -#endif diff -ruN TiMidity++-2.2.0/interface/w32g_main.h TiMidity++-2.3.0/interface/w32g_main.h --- TiMidity++-2.2.0/interface/w32g_main.h Wed Mar 24 01:59:48 1999 +++ TiMidity++-2.3.0/interface/w32g_main.h Thu Jan 1 09:00:00 1970 @@ -1,139 +0,0 @@ -#ifndef ___W32G_MAIN_H_ -#define ___W32G_MAIN_H_ - -extern HWND hStartWnd; -extern HWND hMainWnd; -extern HWND hDebugWnd; -extern HWND hConsoleWnd; -extern HWND hTraceWnd; -extern HWND hDocWnd; -extern HWND hSoundSpecWnd; -extern HWND hListWnd; -extern HWND hWrdWnd; - -extern HINSTANCE hInst; - -extern void InitStartWnd(int nCmdShow); -extern void InitMainWnd(HWND hParentWnd); -extern void UpdateListWnd(void); - -// flags -extern int InitMinimizeFlag; -extern int DebugWndStartFlag; -extern int ConsoleWndStartFlag; -extern int ListWndStartFlag; -extern int TracerWndStartFlag; -extern int DocWndStartFlag; -extern int WrdWndStartFlag; -extern int DebugWndFlag; -extern int ConsoleWndFlag; -extern int ListWndFlag; -extern int TracerWndFlag; -extern int DocWndFlag; -extern int WrdWndFlag; -extern int SoundSpecWndFlag; - -extern int SubWindowMax; - -extern char *IniFile; -extern char *ConfigFile; -extern char *PlaylistFile; -extern char *PlaylistHistoryFile; -extern char *MidiFileOpenDir; -extern char *ConfigFileOpenDir; -extern char *PlaylistFileOpenDir; - -extern int ProcessPriority; -extern int PlayerThreadPriority; -extern int MidiPlayerThreadPriority; -extern int MainThreadPriority; -extern int TracerThreadPriority; -extern int WrdThreadPriority; - -extern int WrdGraphicFlag; -extern int TraceGraphicFlag; -extern int DocMaxSize; -extern char *DocFileExt; - - -// Main Window -extern int MainWndScrollbarProgressNotUpdate; -extern void MainWndScrollbarProgressUpdate(void); -extern void MainWndScrollbarProgressReset(void); -extern void MainWndScrollbarProgressInit(void); -extern void MainWndScrollbarProgressApply(int pos); -extern HWND hMainWndScrollbarProgressWnd; - -extern int MainWndScrollbarVolumeNotUpdate; -extern void MainWndScrollbarVolumeUpdate(void); -extern void MainWndScrollbarVolumeReset(void); -extern void MainWndScrollbarVolumeInit(void); -extern void MainWndScrollbarVolumeApply(int pos); -extern HWND hMainWndScrollbarVolumeWnd; - -// Canvas Window -#define TMCM_SLEEP 0 -#define TMCM_CHANNEL 1 -#define TMCM_32CHANNEL 2 -#define TMCM_FREQUENCY 3 -#define TMCM_TRACER 4 -extern int TmCanvasMode; -extern void TmCanvasUpdate(void); -extern void TmCanvasFullReset(void); -extern void TmCanvasReset(void); -extern void TmCanvasPartReset(void); -extern void TmCanvasSet(void); -extern int TmPanelMode; -extern void TmPanelFullReset(void); -extern void TmPanelReset(void); -extern void TmPanelPartReset(void); -extern void TmPanelUpdate(void); -extern void TmPanelSet(void); - -// Debug Window -#ifdef WIN32GUI_DEBUG -extern void InitDebugWnd(HWND hParentWnd); -extern void PutsDebugWnd(char *str); -extern void PrintfDebugWnd(char *fmt, ...); -extern void ClearDebugWnd(void); -#endif - -// Console Window -extern void InitConsoleWnd(HWND hParentWnd); -extern void PutsConsoleWnd(char *str); -extern void PrintfConsoleWnd(char *fmt, ...); -extern void ClearConsoleWnd(void); - -// Tracer Window -extern void InitTracerWnd(HWND hParentWnd); - -// List Window -extern void InitListWnd(HWND hParentWnd); - -// Doc Window -extern void InitDocWnd(HWND hParentWnd); -extern void PutsDocWnd(char *str); -extern void PrintfDocWnd(char *fmt, ...); -extern void ClearDocWnd(void); - -// Wrd Window -extern void InitWrdWnd(HWND hParentWnd); - -// SoundSpec Window -extern void InitSoundSpecWnd(HWND hParentWnd); - -// Misc Window - -#define WM_TM_CANVAS_UPDATE (WM_USER + 101) - -// Edit Ctl -extern void PutsEditCtlWnd(HWND hwnd, char *str); -extern void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList); -extern void PrintfEditCtlWnd(HWND hwnd, char *fmt, ...); -extern void ClearEditCtlWnd(HWND hwnd); - -// misc util. - -extern void DlgMidiFileOpen(void); - -#endif /* ___W32G_MAIN_H_ */ diff -ruN TiMidity++-2.2.0/interface/w32g_panel.c TiMidity++-2.3.0/interface/w32g_panel.c --- TiMidity++-2.2.0/interface/w32g_panel.c Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.3.0/interface/w32g_panel.c Sun Aug 1 01:29:20 1999 @@ -0,0 +1,489 @@ +/* + TiMidity++ -- MIDI to WAVE converter and player + Copyright (C) 1999 Masanao Izumo + Copyright (C) 1995 Tuukka Toivonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + w32g_i.c: by Daisuke Aoki + Masanao Izumo +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ +#include +#include +#include +#include "timidity.h" +#include "common.h" +#include "w32g.h" +#include "w32g_res.h" + +#define PanelWndClassName "TiMidity Panel" + +#define TM_PANEL_XMAX 350 +#define TM_PANEL_YMAX 100 + +#define TMP_DONOT 1 +#define TMP_PREPARE 2 +#define TMP_DONE 3 + +#define TMP_SPACE 2 +#define TMP_TITLE_CHAR_SIZE 12 +#define TMP_FILE_CHAR_SIZE 10 +#define TMP_MISCH_CHAR_SIZE 9 +#define TMP_MISCW_CHAR_SIZE 7 +#define TMP_MISC_CHAR_SIZE 12 +#define TMP_3L_CSIZE TMP_MISC_CHAR_SIZE +#define TMP_3L_CSSIZE TMP_MISCH_CHAR_SIZE +#define TMP_3L_SPACE 1 +#define TMP_4L_CSIZE TMP_MISC_CHAR_SIZE +#define TMP_4L_CSSIZE TMP_MISCH_CHAR_SIZE +#define TMP_4L_SPACE 1 + +static HFONT hTitleFont = NULL; +static HFONT hFileFont = NULL; +static HFONT hMiscHFont = NULL; +static HFONT hMiscFont = NULL; + +extern char *PlayerFont; + +#define TMP_FONT_SIZE 12 +#define TMP_FONTSMALL_SIZE 10 +static struct { + HWND hwnd; + HDC hdc; + HDC hmdc; + + RECT rcMe; + RECT rcTitleH; + RECT rcTitle; + RECT rcFileH; + RECT rcFile; + RECT rcTimeH; + RECT rcTime; + RECT rcVoicesH; + RECT rcVoices; + RECT rcMasterVolume; + RECT rcMasterVolumeH; + RECT rcListH; + RECT rcList; + + int TimeDone; + int VoicesDone; + int MasterVolumeDone; + int ListDone; + + int cur_time; + int total_time; + int cur_voices; + int master_volume; +} TmPanel; + +static int tm_refresh_flag = 0; + +static LRESULT CALLBACK PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam); +static void TmPanelInit(HWND hwnd); +static void TmPanelEnd(HWND hwnd); +static void TmPanelInitFont(void); +static void TmPanelClear(void); +static void TmPanelFullReset(void); +static void TmPanelRect(RECT *rc, int color); +static void TmPanelRepaint(HWND hwnd); +static void TmPanelUpdate(void); + +void w32g_init_panel(HWND hwnd) +{ + WNDCLASS wndclass; + HWND hPanelWnd; + + memset(&TmPanel, 0, sizeof(TmPanel)); + TmPanelInitFont(); + + wndclass.style = CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = PanelWndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor(0,IDC_ARROW); + wndclass.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR + 1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = PanelWndClassName; + RegisterClass(&wndclass); + hPanelWnd = CreateWindowEx(0, PanelWndClassName, 0, WS_CHILD, + CW_USEDEFAULT, 0, TM_PANEL_XMAX, TM_PANEL_YMAX, + GetDlgItem(hwnd, IDC_RECT_PANEL), 0 ,hInst, 0); + ShowWindow(hPanelWnd,SW_SHOW); + UpdateWindow(hPanelWnd); +} + +static LRESULT CALLBACK PanelWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam) +{ + switch (uMess) + { + case WM_CREATE: + TmPanelInit(hwnd); + break; + case WM_DESTROY: + TmPanelEnd(hwnd); + break; + + case WM_PAINT: + TmPanelRepaint(hwnd); + break; + default: + return DefWindowProc(hwnd,uMess,wParam,lParam) ; + } + return 0L; +} + +static int TmPanelTextLength(HFONT hfont, char *text) +{ + SIZE size; + SelectObject(TmPanel.hmdc, hfont); + SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); + GetTextExtentPoint32(TmPanel.hmdc, text, strlen(text), &size); + return size.cx; +} + +static void TmPanelInit(HWND hwnd) +{ + int i, top, bottom; + RECT rc; + HBITMAP hbitmap; + HWND hParentWnd; + + TmPanel.hwnd = hwnd; + hParentWnd = GetParent(TmPanel.hwnd); + GetClientRect(hParentWnd, &rc); + MoveWindow(TmPanel.hwnd, 0, 0, rc.right-rc.left, rc.bottom-rc.top, FALSE); + TmPanel.hdc = GetDC(TmPanel.hwnd); + hbitmap = CreateCompatibleBitmap(TmPanel.hdc, + TM_PANEL_XMAX, TM_PANEL_YMAX); + TmPanel.hmdc = CreateCompatibleDC(TmPanel.hdc); + SelectObject(TmPanel.hmdc, hbitmap); + GetClientRect(TmPanel.hwnd, &rc); + TmPanel.rcMe = rc; + TmPanel.rcTitle.left = TmPanel.rcMe.left+TMP_SPACE; + TmPanel.rcTitle.top = TmPanel.rcMe.top+TMP_SPACE; + TmPanel.rcTitle.right = TmPanel.rcMe.right-TMP_SPACE; + TmPanel.rcTitle.bottom = TmPanel.rcTitle.top+TMP_TITLE_CHAR_SIZE+TMP_SPACE; + TmPanel.rcFile.left = TmPanel.rcMe.left+TMP_SPACE; + TmPanel.rcFile.top = TmPanel.rcTitle.bottom+TMP_SPACE; + TmPanel.rcFile.right = TmPanel.rcMe.right-TMP_SPACE; + TmPanel.rcFile.bottom = TmPanel.rcFile.top+TMP_FILE_CHAR_SIZE+TMP_SPACE; + top = TmPanel.rcFile.bottom+TMP_SPACE; + bottom = top + TMP_3L_CSIZE; + i = (TMP_3L_CSIZE - TMP_3L_CSSIZE)/2; + TmPanel.rcTimeH.left = TmPanel.rcMe.left + TMP_SPACE; + TmPanel.rcTimeH.top = top + i; + TmPanel.rcTimeH.right = TmPanel.rcTimeH.left + TmPanelTextLength(hMiscHFont, "TIME"); + TmPanel.rcTimeH.bottom = bottom - i; + TmPanel.rcTime.left = TmPanel.rcTimeH.right + 3; + TmPanel.rcTime.top = top; + TmPanel.rcTime.right = TmPanel.rcTime.left + TmPanelTextLength(hMiscFont, "00:00:00/00:00:00"); + TmPanel.rcTime.bottom = bottom; + TmPanel.rcVoicesH.left = TmPanel.rcTime.right + 4; + TmPanel.rcVoicesH.top = top + i; + TmPanel.rcVoicesH.right = TmPanel.rcVoicesH.left + TmPanelTextLength(hMiscHFont, "VOICES"); + TmPanel.rcVoicesH.bottom = bottom - i; + TmPanel.rcVoices.left = TmPanel.rcVoicesH.right + TMP_3L_SPACE; + TmPanel.rcVoices.top = top; + TmPanel.rcVoices.right = TmPanel.rcVoices.left + TmPanelTextLength(hMiscFont, "000/000"); + TmPanel.rcVoices.bottom = bottom; + TmPanel.rcMasterVolumeH.left = TmPanel.rcVoices.right + 4; + TmPanel.rcMasterVolumeH.top = top + i; + TmPanel.rcMasterVolumeH.right = TmPanel.rcMasterVolumeH.left + TMP_MISCW_CHAR_SIZE*4; + TmPanel.rcMasterVolumeH.bottom = bottom - i; + TmPanel.rcMasterVolume.left = TmPanel.rcMasterVolumeH.right + 3; + TmPanel.rcMasterVolume.top = top; + TmPanel.rcMasterVolume.right = TmPanel.rcMasterVolume.left + TmPanelTextLength(hMiscFont, "000%"); + TmPanel.rcMasterVolume.bottom = bottom; + top = TmPanel.rcTime.bottom + TMP_SPACE; + bottom = top + TMP_4L_CSIZE; + i = (TMP_4L_CSIZE - TMP_4L_CSSIZE)/2; + TmPanel.rcListH.left = TmPanel.rcMe.left + TMP_SPACE; + TmPanel.rcListH.top = top + i; + TmPanel.rcListH.right = TmPanel.rcListH.left + TmPanelTextLength(hMiscHFont, "LIST"); + TmPanel.rcListH.bottom = bottom - i; + TmPanel.rcList.left = TmPanel.rcListH.right + 3; + TmPanel.rcList.top = top; + TmPanel.rcList.right = TmPanel.rcList.left + TmPanelTextLength(hMiscFont, "0000/0000"); + TmPanel.rcList.bottom = bottom; + TmPanelFullReset(); + TmPanelUpdate(); +} + +static void TmPanelEnd(HWND hwnd) +{ + ReleaseDC(TmPanel.hwnd, TmPanel.hdc); + TmPanel.hdc = 0; +} + +static void TmPanelFullReset(void) +{ + TmPanelClear(); + TmPanel.TimeDone = TMP_DONOT; + TmPanel.VoicesDone = TMP_DONOT; + TmPanel.MasterVolumeDone = TMP_DONOT; + TmPanelRect(&TmPanel.rcTitle, TMCC_FORE_HALF); + TmPanelRect(&TmPanel.rcFile, TMCC_FORE_HALF); + TmPanel.cur_time = -1; + TmPanel.total_time = -1; + TmPanel.cur_voices = -1; + TmPanel.master_volume = -1; +} + +// Font Setting +static void TmPanelInitFont(void) +{ + if(hTitleFont != NULL) + DeleteObject(hTitleFont); + hTitleFont = CreateFont(TMP_TITLE_CHAR_SIZE, 0, 0, 0, FW_DONTCARE, + FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, + PlayerFont); + if(hFileFont != NULL) + DeleteObject(hFileFont); + hFileFont = CreateFont(TMP_FILE_CHAR_SIZE, 0, 0, 0, FW_DONTCARE, + FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, + PlayerFont); + if(hMiscHFont != NULL) + DeleteObject(hMiscHFont); + hMiscHFont = CreateFont(TMP_MISCH_CHAR_SIZE, 0, 0, 0, FW_BOLD, FALSE, + FALSE,FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_DONTCARE, PlayerFont); + if(hMiscFont != NULL) + DeleteObject(hMiscFont); + hMiscFont = CreateFont(TMP_MISC_CHAR_SIZE, 0, 0, 0, FW_BOLD, FALSE, FALSE, + FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_DONTCARE, PlayerFont); +} + +static void TmPanelClear(void) +{ + TmPanelRect(&TmPanel.rcMe, TMCC_BACK); +} + +static void TmPanelRepaint(HWND hwnd) +{ + HDC hdc; + PAINTSTRUCT ps; + + hdc = BeginPaint(TmPanel.hwnd, &ps); + BitBltRect(hdc, TmPanel.hmdc, &ps.rcPaint); + EndPaint(TmPanel.hwnd, &ps); +} + +static void TmPanelText(RECT *r, HFONT hfont, int fg, int bg, + char *buffer, BOOL bitblt) +{ + HGDIOBJ hgdiobj; + + if(!TmPanel.hdc) + return; + + hgdiobj = SelectObject(TmPanel.hmdc, hfont); + SetTextColor(TmPanel.hmdc, TmCc(fg)); + SetBkColor(TmPanel.hmdc, TmCc(bg)); + SetTextAlign(TmPanel.hmdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); + ExtTextOut(TmPanel.hmdc, r->left, r->top, ETO_CLIPPED, r, + buffer, strlen(buffer), NULL); + if(bitblt) + BitBltRect(TmPanel.hdc, TmPanel.hmdc, r); +} + +static void TmPanelUpdate(void) +{ + char buffer[32]; + extern int voices; + + if(TmPanel.VoicesDone == TMP_PREPARE) + { + sprintf(buffer,"%03d/%03d", TmPanel.cur_voices, voices); + TmPanelText(&TmPanel.rcVoices, hMiscFont, TMCC_FORE, TMCC_FORE_HALF, + buffer, TRUE); + TmPanel.VoicesDone = TMP_DONE; + } + + if(TmPanel.TimeDone == TMP_PREPARE) + { + int ch, cm, cs; + int th, tm, ts; + int t; + + t = TmPanel.cur_time; + ch = t / 60 / 60; + t %= 60*60; + cm = t / 60; + t %= 60; + cs = t; + + t = TmPanel.total_time; + th = t / 60 / 60; + t %= 60*60; + tm = t / 60; + t %= 60; + ts = t; + + sprintf(buffer,"%02d:%02d:%02d/%02d:%02d:%02d", + ch, cm, cs, th, tm, ts); + TmPanelText(&TmPanel.rcTime, hMiscFont, TMCC_FORE, TMCC_FORE_HALF, + buffer, TRUE); + TmPanel.TimeDone = TMP_DONE; + } + + if(TmPanel.MasterVolumeDone == TMP_PREPARE) + { + sprintf(buffer, "%03d%%", TmPanel.master_volume); + TmPanelText(&TmPanel.rcMasterVolume, hMiscFont, + TMCC_FORE, TMCC_FORE_HALF, buffer, TRUE); + TmPanel.MasterVolumeDone = TMP_DONE; + } + + if(TmPanel.ListDone == TMP_PREPARE) + { + int playlist_selected, playlist_nfiles; + w32g_get_playlist_index(&playlist_selected, &playlist_nfiles, NULL); + if(playlist_nfiles == 0) + strcpy(buffer,"0000/0000"); + else + sprintf(buffer,"%04d/%04d", + playlist_selected + 1, playlist_nfiles); + TmPanelText(&TmPanel.rcList, hMiscFont, TMCC_FORE, TMCC_FORE_HALF, + buffer, TRUE); + TmPanel.ListDone = TMP_DONE; + } +} + +static void TmPanelRect(RECT *rc, int color) +{ + TmFillRect(TmPanel.hmdc, rc, color); +} + +void TmPanelRefresh(void) +{ + if(!TmPanel.hdc) + return; + if(tm_refresh_flag) + { + TmPanelUpdate(); + tm_refresh_flag = 0; + } +} + +void TmPanelStartToLoad(char *filename) +{ + char *title; + extern char *get_midi_title(char *); + extern int amplification; + + title = get_midi_title(filename); + TmPanelFullReset(); + /* Title */ + if(title) + TmPanelText(&TmPanel.rcTitle, hTitleFont, TMCC_FORE, TMCC_FORE_HALF, + title, FALSE); + + /* File name */ + TmPanelText(&TmPanel.rcFile, hFileFont, TMCC_FORE, TMCC_FORE_HALF, + filename, FALSE); + + /* + * Labels + */ + + /* "TIME" */ + TmPanelText(&TmPanel.rcTimeH, hMiscHFont, TMCC_FORE, TMCC_BACK, + "TIME", FALSE); + + /* "VOICES" */ + TmPanelText(&TmPanel.rcVoicesH, hMiscHFont, TMCC_FORE, TMCC_BACK, + "VOICES", FALSE); + + /* "M.Vol" */ + TmPanelText(&TmPanel.rcMasterVolumeH, hMiscHFont, + TMCC_FORE, TMCC_BACK, + "M.Vol", FALSE); + + /* "LIST" */ + TmPanelText(&TmPanel.rcListH, hMiscHFont, TMCC_FORE, TMCC_BACK, + "LIST", FALSE); + + BitBltRect(TmPanel.hdc, TmPanel.hmdc, &TmPanel.rcMe); + + TmPanel.cur_voices = 0; + TmPanel.master_volume = amplification; + TmPanel.VoicesDone = TMP_PREPARE; + TmPanel.MasterVolumeDone = TMP_PREPARE; + TmPanel.ListDone = TMP_PREPARE; + TmPanelRefresh(); + tm_refresh_flag = 0; +} + +void TmPanelStartToPlay(int total_sec) +{ + TmPanel.cur_time = 0; + TmPanel.total_time = total_sec; + TmPanel.TimeDone = TMP_PREPARE; + tm_refresh_flag = 1; +} + +void TmPanelSetVoices(int v) +{ + if(TmPanel.cur_voices != v) + { + TmPanel.cur_voices = v; + TmPanel.VoicesDone = TMP_PREPARE; + tm_refresh_flag = 1; + } +} + +void TmPanelSetTime(int sec) +{ + if(TmPanel.cur_time != sec) + { + TmPanel.cur_time = sec; + TmPanel.TimeDone = TMP_PREPARE; + tm_refresh_flag = 1; + } +} + +void TmPanelSetMasterVol(int v) +{ + if(TmPanel.master_volume != v) + { + TmPanel.master_volume = v; + TmPanel.MasterVolumeDone = TMP_PREPARE; + tm_refresh_flag = 1; + if(!w32g_play_active) + TmPanelRefresh(); + } +} + +void TmPanelUpdateList(void) +{ + TmPanel.ListDone = TMP_PREPARE; + tm_refresh_flag = 1; + if(!w32g_play_active) + TmPanelRefresh(); +} diff -ruN TiMidity++-2.2.0/interface/w32g_playlist.c TiMidity++-2.3.0/interface/w32g_playlist.c --- TiMidity++-2.2.0/interface/w32g_playlist.c Thu Jan 1 09:00:00 1970 +++ TiMidity++-2.3.0/interface/w32g_playlist.c Sun Aug 1 01:25:46 1999 @@ -0,0 +1,297 @@ +/* + + TiMidity -- Experimental MIDI to WAVE converter + Copyright (C) 1999 Masanao Izumo + Copyright (C) 1995 Tuukka Toivonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ +#include +#include +#include +#include +#include +#include "timidity.h" +#include "common.h" +#include "instrum.h" +#include "playmidi.h" +#include "readmidi.h" +#include "controls.h" +#include "w32g.h" +#include "w32g_res.h" + +// playlist +typedef struct _PlayListEntry { + char *filename; // malloc + char *title; // shared with midi_file_info + struct midi_file_info *info; +} PlayListEntry; +static struct { + int nfiles; + int selected; /* 0..nfiles-1 */ + int allocated; /* number of PlayListEntry is allocated */ + PlayListEntry *list; +} playlist = {0, 0, 0, NULL}; + +static HWND playlist_box(void) +{ + extern HWND hListWnd; + if(!hListWnd) + return 0; + return GetDlgItem(hListWnd, IDC_LISTBOX_PLAYLIST); +} + +static void w32g_set_playlist(PlayListEntry *entry, char *filename) +{ + entry->filename = safe_strdup(filename); + entry->title = get_midi_title(filename); + entry->info = get_midi_file_info(filename, 1); +} + +static void w32g_add_playlist1(char *filename) +{ + if(playlist.allocated == 0) + { + playlist.allocated = 32; + playlist.list = (PlayListEntry *)safe_malloc(playlist.allocated * + sizeof(PlayListEntry)); + } + else if(playlist.nfiles == playlist.allocated) + { + playlist.allocated *= 2; + playlist.list = (PlayListEntry *)safe_realloc(playlist.list, + playlist.allocated * + sizeof(PlayListEntry)); + } + w32g_set_playlist(&playlist.list[playlist.nfiles++], filename); +} + +void w32g_add_playlist(int nfiles, char **files, int expand_flag) +{ + char **new_files; + int i, new_nfiles; + + if(nfiles == 0) + return; + new_nfiles = nfiles; + if(!expand_flag) + new_files = files; + else + { + new_files = expand_file_archives(files, &new_nfiles); + if(new_nfiles == 0) + return; + } + + for(i = 0; i < new_nfiles; i++) + w32g_add_playlist1(new_files[i]); + + if(new_files != files) + { + free(new_files[0]); + free(new_files); + } + + w32g_update_playlist(); +} + +int w32g_next_playlist(void) +{ + while(playlist.selected + 1 < playlist.nfiles) + { + playlist.selected++; + if(playlist.list[playlist.selected].info->file_type != IS_ERROR_FILE) + { + w32g_update_playlist(); + return 1; + } + } + return 0; +} + +int w32g_prev_playlist(void) +{ + while(playlist.selected > 0) + { + playlist.selected--; + if(playlist.list[playlist.selected].info->file_type != IS_ERROR_FILE) + { + w32g_update_playlist(); + return 1; + } + } + return 0; +} + +void w32g_first_playlist(void) +{ + playlist.selected = 0; + while(playlist.selected < playlist.nfiles && + playlist.list[playlist.selected].info->file_type == IS_ERROR_FILE) + playlist.selected++; + if(playlist.selected == playlist.nfiles) + playlist.selected = 0; + w32g_update_playlist(); +} + +int w32g_goto_playlist(int num) +{ + if(0 <= num && num < playlist.nfiles) + { + playlist.selected = num; + while(playlist.selected < playlist.nfiles && + playlist.list[playlist.selected].info->file_type == IS_ERROR_FILE) + playlist.selected++; + if(playlist.selected == playlist.nfiles) + playlist.selected = num; + w32g_update_playlist(); + return 1; + } + return 0; +} + +int w32g_isempty_playlist(void) +{ + return playlist.nfiles == 0; +} + +char *w32g_curr_playlist(void) +{ + if(!playlist.nfiles) + return NULL; + return playlist.list[playlist.selected].filename; +} + +void w32g_update_playlist(void) +{ + int i, top_index, cur; + HWND hListBox; + + hListBox = playlist_box(); + if(!hListBox) + return; + + top_index = ListBox_GetTopIndex(hListBox); + if(top_index != 0) + ListBox_SetTopIndex(hListBox, 0); + + cur = ListBox_GetCurSel(hListBox); + for(i = 0; i < playlist.nfiles; i++) + { + char *filename, *title, *item1, *item2; + int maxlen, item2_len; + + filename = playlist.list[i].filename; + title = playlist.list[i].title; + if(title == NULL || title[0] == '\0') + { + if(playlist.list[i].info->file_type == IS_ERROR_FILE) + title = " --SKIP-- "; + else + title = " -------- "; + } + maxlen = strlen(filename) + strlen(title) + 32; + item1 = (char *)new_segment(&tmpbuffer, maxlen); + if(i == playlist.selected) + snprintf(item1, maxlen, "==>%04d %s (%s)", i + 1, title, filename); + else + snprintf(item1, maxlen, " %04d %s (%s)", i + 1, title, filename); + item2_len = ListBox_GetTextLen(hListBox, i); + item2 = (char *)new_segment(&tmpbuffer, item2_len + 1); + ListBox_GetText(hListBox, i, item2); + if(strcmp(item1, item2) != 0) + { + ListBox_DeleteString(hListBox, i); + ListBox_InsertString(hListBox, i, item1); + } + reuse_mblock(&tmpbuffer); + } + + if(cur < 0) + cur = 0; + else if(cur >= playlist.nfiles - 1) + cur = playlist.nfiles - 1; + ListBox_SetCurSel(hListBox, cur); +} + +void w32g_get_playlist_index(int *selected, int *nfiles, int *cursel) +{ + if(selected != NULL) + *selected = playlist.selected; + if(nfiles != NULL) + *nfiles = playlist.nfiles; + if(cursel != NULL) + { + HWND hListBox; + hListBox = playlist_box(); + if(hListBox) + *cursel = ListBox_GetCurSel(hListBox); + else + *cursel = 0; + } +} + +void w32g_delete_playlist(int pos) +{ + int i; + HWND hListBox; + + hListBox = playlist_box(); + if(!hListBox) + return; + + ListBox_DeleteString(hListBox, pos); + free(playlist.list[pos].filename); + playlist.nfiles--; + for(i = pos; i < playlist.nfiles; i++) + playlist.list[i] = playlist.list[i + 1]; + if(pos < playlist.selected || pos == playlist.nfiles) + { + playlist.selected--; + if(playlist.selected < 0) + playlist.selected = 0; + } + w32g_update_playlist(); + if(playlist.nfiles > 0) + { + if(pos == playlist.nfiles) + pos--; + ListBox_SetCurSel(hListBox, pos); + } +} + +int w32g_valid_playlist(void) +{ + int i, n; + + n = 0; + for(i = 0; i < playlist.nfiles; i++) + if(playlist.list[i].info->file_type != IS_ERROR_FILE) + n++; + return n; +} + +void w32g_setcur_playlist(void) +{ + HWND hListBox; + hListBox = playlist_box(); + if(!hListBox) + return; + ListBox_SetCurSel(hListBox, playlist.selected); +} diff -ruN TiMidity++-2.2.0/interface/w32g_res.h TiMidity++-2.3.0/interface/w32g_res.h --- TiMidity++-2.2.0/interface/w32g_res.h Wed Mar 24 01:59:50 1999 +++ TiMidity++-2.3.0/interface/w32g_res.h Fri Jul 30 19:22:38 1999 @@ -1,285 +1,181 @@ -#define IDC_STATIC -1 +#define IDC_STATIC -1 #define IDD_DIALOG_SIMPLE_LIST 2001 -#define IDC_LISTBOX2 101 -#define IDB_BITMAP_SLEEP 2001 -#define IDM_MENU_MAIN 1301 -#define IDC_SYSTABCONTROL_CHANNELS 1001 -#define IDC_GROUPBOX_CHANNELS 1002 -#define IDC_CHECKBOX_QUIET_CHANNEL 1003 -#define IDC_CHECKBOX_DRUMCHANNEL_MASK 1004 -#define IDC_CHECKBOX_DRUMCHANNELS 1005 -#define IDC_BUTTON_REVERSE 1006 -#define IDC_BUTTON14 1007 -#define IDC_BUTTON13 1008 -#define IDC_CHECKBOX102 1009 -#define IDC_GROUPBOX6 1010 -#define IDC_CHECKBOX101 1011 -#define IDC_CHECKBOX100 1012 -#define IDC_CHECKBOX33 1013 -#define IDC_CHECKBOX32 1014 -#define IDC_CHECKBOX31 1015 -#define IDC_CHECKBOX30 1016 -#define IDC_CHECKBOX29 1017 -#define IDC_CHECKBOX28 1018 -#define IDC_CHECKBOX27 1019 -#define IDC_CHECKBOX26 1020 -#define IDC_CHECKBOX25 1021 -#define IDC_CHECKBOX24 1022 -#define IDC_CHECKBOX23 1023 -#define IDC_CHECKBOX22 1024 -#define IDC_CHECKBOX21 1025 -#define IDC_CHECKBOX20 1026 -#define IDC_CHECKBOX19 1027 -#define IDC_CHECKBOX18 1028 -#define IDC_CHECKBOX17 1029 -#define IDC_CHECKBOX16 1030 -#define IDC_CHECKBOX15 1031 -#define IDC_CHECKBOX14 1032 -#define IDC_CHECKBOX13 1033 -#define IDC_CHECKBOX12 1034 -#define IDC_CHECKBOX9 1035 -#define IDC_CHECKBOX5 1036 -#define IDC_CHECKBOX4 1037 -#define IDC_CHECKBOX3 1038 -#define IDC_CHECKBOX1 1039 -#define IDC_CHECKBOX_MAIN 1040 -#define IDC_CHECKBOX10 1041 -#define IDC_CHECKBOX7 1042 - -#define CM_HELPHI1 1043 - -#define IDM_MHTIMIDITY 1044 - -#define IDGNU 1045 -#define IDTIMIDITY 1046 -#define IDSAVE 1047 - -#define VERSIONINFO_TIMIDITY 1048 - -#define IDC_TEXT_VERSION 1049 -#define IDC_BUTTON12 1050 -#define IDC_CHECKBOX99 1051 -#define IDC_CHECKBOX98 1052 -#define IDC_CHECKBOX97 1053 -#define IDC_CHECKBOX96 1054 -#define IDC_CHECKBOX95 1055 -#define IDC_CHECKBOX94 1056 -#define IDC_CHECKBOX93 1057 -#define IDC_CHECKBOX92 1058 -#define IDC_CHECKBOX91 1059 -#define IDC_CHECKBOX90 1060 -#define IDC_CHECKBOX89 1061 -#define IDC_CHECKBOX88 1062 -#define IDC_CHECKBOX87 1063 -#define IDC_CHECKBOX86 1064 -#define IDC_CHECKBOX85 1065 -#define IDC_CHECKBOX84 1066 -#define IDC_CHECKBOX83 1067 -#define IDC_CHECKBOX82 1068 -#define IDC_CHECKBOX81 1069 -#define IDC_CHECKBOX80 1070 -#define IDC_CHECKBOX79 1071 -#define IDC_CHECKBOX78 1072 -#define IDC_CHECKBOX77 1073 -#define IDC_CHECKBOX76 1074 -#define IDC_CHECKBOX75 1075 -#define IDC_CHECKBOX74 1076 -#define IDC_CHECKBOX73 1077 -#define IDC_CHECKBOX72 1078 -#define IDC_CHECKBOX71 1079 -#define IDC_CHECKBOX70 1080 -#define IDC_CHECKBOX69 1081 -#define IDC_CHECKBOX68 1082 -#define IDC_CHECKBOX67 1083 -#define IDC_CHECKBOX66 1084 -#define IDC_CHECKBOX65 1085 -#define IDC_CHECKBOX64 1086 -#define IDC_CHECKBOX63 1087 -#define IDC_CHECKBOX62 1088 -#define IDC_CHECKBOX61 1089 -#define IDC_CHECKBOX60 1090 -#define IDC_CHECKBOX59 1091 -#define IDC_CHECKBOX58 1092 -#define IDC_CHECKBOX57 1093 -#define IDC_CHECKBOX56 1094 -#define IDC_CHECKBOX55 1095 -#define IDC_CHECKBOX54 1096 -#define IDC_CHECKBOX53 1097 -#define IDC_CHECKBOX52 1098 -#define IDC_CHECKBOX51 1099 -#define IDC_CHECKBOX50 1100 -#define IDC_CHECKBOX49 1101 -#define IDC_CHECKBOX48 1102 -#define IDC_CHECKBOX47 1103 -#define IDC_CHECKBOX46 1104 -#define IDC_CHECKBOX45 1105 -#define IDC_CHECKBOX44 1106 -#define IDC_CHECKBOX43 1107 -#define IDC_CHECKBOX42 1108 -#define IDC_CHECKBOX41 1109 -#define IDC_CHECKBOX40 1110 -#define IDC_CHECKBOX39 1111 -#define IDC_CHECKBOX38 1112 -#define IDC_CHECKBOX37 1113 -#define IDC_CHECKBOX36 1114 -#define IDC_GROUPBOX4 1115 -#define IDC_GROUPBOX3 1116 -#define IDC_CHECKBOX35 1117 -#define IDC_CHECKBOX34 1118 -#define IDC_GROUPBOX5 1119 -#define IDC_CHECKBOX11 1120 -#define IDC_RADIOBUTTON12 1121 -#define IDC_RADIOBUTTON10 1122 -#define IDC_RADIOBUTTON8 1123 -#define IDC_RADIOBUTTON6 1124 -#define IDC_RADIOBUTTON11 1125 -#define IDC_RADIOBUTTON9 1126 -#define IDC_RADIOBUTTON7 1127 -#define IDC_RADIOBUTTON5 1128 -#define IDC_GROUPBOX2 1129 -#define IDC_CHECKBOX8 1130 -#define IDC_RADIOBUTTON4 1131 -#define IDC_RADIOBUTTON3 1132 -#define IDC_RADIOBUTTON2 1133 -#define IDC_RADIOBUTTON1 1134 -#define IDC_GROUPBOX1 1135 -#define IDC_SYSTABCONTROL1 1136 -#define IDDEFAULT 1137 -#define IDC_BUTTON2 1138 -#define IDC_BUTTON1 1139 -#define IDC_EDIT2 1140 -#define IDC_EDIT4 1141 -#define IDC_BUTTON11 1142 -#define IDC_BUTTON10 1143 -#define IDC_BUTTON9 1144 -#define IDC_BUTTON8 1145 -#define IDC_BUTTON7 1146 -#define IDC_BUTTON6 1147 -#define IDC_BUTTON_APPLY 1148 -#define IDC_BUTTON5 1149 -#define IDC_BUTTON4 1150 -#define IDC_EDIT3 1151 -#define IDC_LISTBOX1 1152 -#define IDC_BUTTON3 1153 -#define IDC_CHECKBOX2 1154 -#define IDC_EDIT1 1155 - - -#define IDD_DIALOG_MAIN 1156 -#define IDC_BUTTON16 101 -#define IDD_DIALOG_DEBUG 1157 -#define IDD_DIALOG_CONSOLE 1158 -#define IDD_DIALOG_LIST 1159 -#define IDD_DIALOG_TRACER 1160 -#define IDD_DIALOG_DOC 1161 -#define IDD_DIALOG_SETTING 1162 - - +#define IDB_BITMAP_SLEEP 2002 +#define IDM_MENU_MAIN 2003 +#define IDC_SYSTABCONTROL_CHANNELS 1001 +#define IDC_GROUPBOX_CHANNELS 1002 +#define IDC_CHECKBOX_QUIET_CHANNEL 1003 +#define IDC_CHECKBOX_DRUMCHANNEL_MASK 1004 +#define IDC_CHECKBOX_DRUMCHANNELS 1005 +#define IDC_BUTTON_REVERSE 1006 +// available 1007..1009 +#define IDC_CHECKBOX_CH_BASE 1010 +#define IDC_CHECKBOX_CH1 1010 +#define IDC_CHECKBOX_CH2 1011 +#define IDC_CHECKBOX_CH3 1012 +#define IDC_CHECKBOX_CH4 1013 +#define IDC_CHECKBOX_CH5 1014 +#define IDC_CHECKBOX_CH6 1015 +#define IDC_CHECKBOX_CH7 1016 +#define IDC_CHECKBOX_CH8 1017 +#define IDC_CHECKBOX_CH9 1018 +#define IDC_CHECKBOX_CH10 1019 +#define IDC_CHECKBOX_CH11 1020 +#define IDC_CHECKBOX_CH12 1021 +#define IDC_CHECKBOX_CH13 1022 +#define IDC_CHECKBOX_CH14 1023 +#define IDC_CHECKBOX_CH15 1024 +#define IDC_CHECKBOX_CH16 1025 +#define IDC_CHECKBOX_CH17 1026 +#define IDC_CHECKBOX_CH18 1027 +#define IDC_CHECKBOX_CH19 1028 +#define IDC_CHECKBOX_CH20 1029 +#define IDC_CHECKBOX_CH21 1030 +#define IDC_CHECKBOX_CH22 1031 +#define IDC_CHECKBOX_CH23 1032 +#define IDC_CHECKBOX_CH24 1033 +#define IDC_CHECKBOX_CH25 1034 +#define IDC_CHECKBOX_CH26 1035 +#define IDC_CHECKBOX_CH27 1036 +#define IDC_CHECKBOX_CH28 1037 +#define IDC_CHECKBOX_CH29 1038 +#define IDC_CHECKBOX_CH30 1039 +#define IDC_CHECKBOX_CH31 1040 +#define IDC_CHECKBOX_CH32 1041 +// available 1042 +#define IDM_MHTIMIDITY 1043 +#define IDDEFAULT 1044 +#define IDGNU 1045 +#define IDTIMIDITY 1046 +#define IDSAVE 1047 + +#define VERSIONINFO_TIMIDITY 1048 + +#define IDC_TEXT_VERSION 1049 + +// available 1050..1147 + +#define IDC_EDIT_PLAYLIST_LABEL 1148 +#define IDC_BUTTON_APPLY 1149 +#define IDC_BUTTON_FILE 1150 +// available 1051..1155 +#define IDD_DIALOG_MAIN 1156 +#define IDD_DIALOG_DEBUG 1157 +#define IDD_DIALOG_CONSOLE 1158 +#define IDD_DIALOG_LIST 1159 +#define IDD_DIALOG_TRACER 1160 +#define IDD_DIALOG_DOC 1161 +#define IDD_DIALOG_SETTING 1162 // Main Wnd -#define IDC_TOOLBARWINDOW_SUBWND 1163 -#define IDC_TOOLBARWINDOW_MAIN 1164 +#define IDC_TOOLBARWINDOW_SUBWND 1163 +#define IDC_TOOLBARWINDOW_MAIN 1164 -#define IDC_RECT_PANEL 1165 -#define IDC_RECT_CANVAS 1166 +#define IDC_RECT_PANEL 1165 +#define IDC_RECT_CANVAS 1166 -#define IDC_MSCTLS_UPDOWN1 1167 -#define IDC_BUTTON_DEC 1168 -#define IDC_BUTTON_INC 1169 -#define IDC_BUTTON15 1170 -#define IDC_EDIT_VERBOSITY 1171 -#define IDC_BUTTON_VERBOSITY 1172 -#define IDC_EDIT 1173 -#define IDC_EDIT5 1174 -#define IDD_DIALOG_WRD 1175 -#define IDD_DIALOG_SOUNDSPEC 1176 - -#define IDFLUSH 1177 -#define IDCLEAR 1178 - -#define IDC_BUTTON_PREV 1179 -#define IDC_BUTTON_NEXT 1180 -#define IDC_BUTTON_FORWARD 1181 -#define IDC_BUTTON_PLAY 1182 -#define IDC_BUTTON_BACK 1183 -#define IDC_BUTTON_STOP 1184 -#define IDC_CHECKBOX_PAUSE 1185 -#define IDC_BUTTON_SAVE 1186 -#define IDC_BUTTON_UNDO 1187 - -#define IDC_CHECKBOX_DEFAULT 1188 -#define IDC_CHECKBOX_VALID 1189 -#define IDC_CHECKBOX_DEBUG_WND 1190 -#define IDC_CHECKBOX_DEBUG_WND_VALID 1191 -#define IDC_CHECKBOX_SOUNDSPEC 1192 -#define IDC_CHECKBOX_CONFIG 1193 - -#define IDC_EDIT_FILENAME 1194 -#define IDC_EDIT_PLAYLISTFILE 1195 -#define IDC_EDIT_VEBOSITY 1196 - -#define IDC_LISTBOX_PLAYLIST 1197 - -#define IDM_MFOPENFILE 1198 -#define IDM_MFOPENDIR 1199 -#define IDM_MFLOADPLAYLIST 1200 -#define IDM_MFSAVEPLAYLISTAS 1201 -#define IDM_MFEXIT 1202 -#define IDM_MCLOADINIFILE 1203 -#define IDM_MCSAVEINIFILE 1204 -#define IDM_MWPLAYLIST 1205 -#define IDM_MWTRACER 1206 -#define IDM_MWDOCUMENT 1207 -#define IDM_MWWRDTRACER 1208 -#define IDM_MWSOUNDSPEC 1209 -#define IDM_MWCONSOLE 1210 -#define IDM_MWDEBUG 1211 -#define IDM_MHTOPIC 1212 -#define IDM_MHHELP 1213 -#define IDM_MHVERSION 1214 - -#define IDC_SCROLLBAR_PROGRESS 1215 -#define IDC_SCROLLBAR_VOLUME 1216 - -#define IDI_ICON_TIMIDITY 1217 -#define IDI_ICON_STOP 1218 - -#define IDB_BITMAP_MAIN_BUTTON 1219 -#define IDB_BITMAP_SUBWND_BUTTON 1220 - -#define IDC_CHECK_DOC 1221 -#define IDC_CHECK_WRD 1222 -#define IDC_CHECK_CONFIG 1223 -#define IDC_CHECK_TRACER 1224 -#define IDC_CHECK_LIST 1225 -#define IDC_CHECK_SOUNDSPEC 1226 -#define IDC_CHECK_CONSOLE 1227 - -#define IDC_BTN_DOC 1228 -#define IDC_BTN_WRD 1229 -#define IDC_BTN_CONFIG 1230 -#define IDC_BTN_TRACER 1231 -#define IDC_BTN_LIST 1232 -#define IDC_BTN_SOUNDSPEC 1233 - - -#define IDM_SETTING 1234 -#define IDC_CHECKBOX_CHORUS 1235 -#define IDC_CHECKBOX_REVERB 1236 +#define IDC_MSCTLS_UPDOWN1 1167 +#define IDC_BUTTON_DEC 1168 +#define IDC_BUTTON_INC 1169 +// available 1170 +#define IDC_EDIT_VERBOSITY 1171 +#define IDC_BUTTON_VERBOSITY 1172 +#define IDC_EDIT_TERMINAL 1173 +#define IDC_EDIT_DOC 1174 +#define IDD_DIALOG_WRD 1175 +#define IDD_DIALOG_SOUNDSPEC 1176 + +#define IDFLUSH 1177 +#define IDCLEAR 1178 + +#define IDC_BUTTON_PREV 1179 +#define IDC_BUTTON_NEXT 1180 +#define IDC_BUTTON_FORWARD 1181 +#define IDC_BUTTON_PLAY 1182 +#define IDC_BUTTON_BACK 1183 +#define IDC_BUTTON_STOP 1184 +#define IDC_CHECKBOX_PAUSE 1185 +#define IDC_BUTTON_SAVE 1186 +#define IDC_BUTTON_UNDO 1187 + +#define IDC_CHECKBOX_DEFAULT 1188 +#define IDC_CHECKBOX_VALID 1189 +#define IDC_CHECKBOX_DEBUG_WND 1190 +#define IDC_CHECKBOX_DEBUG_WND_VALID 1191 +#define IDC_CHECKBOX_SOUNDSPEC 1192 +#define IDC_CHECKBOX_CONFIG 1193 + +#define IDC_EDIT_FILENAME 1194 +#define IDC_EDIT_PLAYLISTFILE 1195 +#define IDC_EDIT_VEBOSITY 1196 + +#define IDC_LISTBOX_PLAYLIST 1197 + +#define IDM_MFOPENFILE 1198 +#define IDM_MFOPENDIR 1199 +#define IDM_MFLOADPLAYLIST 1200 +#define IDM_MFSAVEPLAYLISTAS 1201 +#define IDM_MFEXIT 1202 +#define IDM_MCLOADINIFILE 1203 +#define IDM_MCSAVEINIFILE 1204 +#define IDM_MWPLAYLIST 1205 +#define IDM_MWTRACER 1206 +#define IDM_MWDOCUMENT 1207 +#define IDM_MWWRDTRACER 1208 +#define IDM_MWSOUNDSPEC 1209 +#define IDM_MWCONSOLE 1210 +#define IDM_MWDEBUG 1211 +#define IDM_MHTOPIC 1212 +#define IDM_MHHELP 1213 +#define IDM_MHVERSION 1214 + +#define IDC_SCROLLBAR_PROGRESS 1215 +#define IDC_SCROLLBAR_VOLUME 1216 + +#define IDI_ICON_TIMIDITY 1217 +#define IDI_ICON_STOP 1218 + +#define IDB_BITMAP_MAIN_BUTTON 1219 +#define IDB_BITMAP_SUBWND_BUTTON 1220 + +#define IDC_CHECK_DOC 1221 +#define IDC_CHECK_WRD 1222 +#define IDC_CHECK_CONFIG 1223 +#define IDC_CHECK_TRACER 1224 +#define IDC_CHECK_LIST 1225 +#define IDC_CHECK_SOUNDSPEC 1226 +#define IDC_CHECK_CONSOLE 1227 + +#define IDC_BTN_DOC 1228 +#define IDC_BTN_WRD 1229 +#define IDC_BTN_CONFIG 1230 +#define IDC_BTN_TRACER 1231 +#define IDC_BTN_LIST 1232 +#define IDC_BTN_SOUNDSPEC 1233 + + +#define IDM_SETTING 1234 +#define IDC_CHECKBOX_CHORUS 1235 +#define IDC_CHECKBOX_REVERB 1236 #define IDC_CHECKBOX_DELAY_EFFECT 1237 -#define IDC_CHECKBOX_FREE_INST 1238 -#define IDC_CHECKBOX_ANTIALIAS 1239 -#define IDC_EDIT_VOICES 1240 -#define IDC_RADIO_16BITS 1241 -#define IDC_RADIO_8BITS 1242 -#define IDC_RADIO_STEREO 1243 -#define IDC_RADIO_MONO 1244 -#define IDC_EDIT_SAMPLE_RATE 1245 -#define IDC_EDIT_NOISESHARPING 1246 -#define IDC_CHECKBOX_MODWHEEL 1247 -#define IDC_CHECKBOX_PORTAMENT 1248 -#define IDC_CHECKBOX_NRPNVIB 1249 -#define IDC_CHECKBOX_CHPRESS 1250 -#define IDC_CHECKBOX_OVOICE 1251 +#define IDC_CHECKBOX_FREE_INST 1238 +#define IDC_CHECKBOX_ANTIALIAS 1239 +#define IDC_EDIT_VOICES 1240 +#define IDC_RADIO_16BITS 1241 +#define IDC_RADIO_8BITS 1242 +#define IDC_RADIO_STEREO 1243 +#define IDC_RADIO_MONO 1244 +#define IDC_EDIT_SAMPLE_RATE 1245 +#define IDC_EDIT_NOISESHARPING 1246 +#define IDC_CHECKBOX_MODWHEEL 1247 +#define IDC_CHECKBOX_PORTAMENT 1248 +#define IDC_CHECKBOX_NRPNVIB 1249 +#define IDC_CHECKBOX_CHPRESS 1250 +#define IDC_CHECKBOX_OVOICE 1251 #define IDC_CHECKBOX_LOADINST_PLAYING 1252 +#define IDC_COMBO_OUTPUT_MODE 1253 +#define IDC_EDIT_OUTPUT_FILE 1254 +#define IDC_BUTTON_REF 1255 +#define IDC_RADIO_ULAW 1256 +#define IDC_RADIO_ALAW 1257 diff -ruN TiMidity++-2.2.0/interface/w32g_res.rc TiMidity++-2.3.0/interface/w32g_res.rc --- TiMidity++-2.2.0/interface/w32g_res.rc Wed Mar 24 01:59:51 1999 +++ TiMidity++-2.3.0/interface/w32g_res.rc Sun Aug 1 03:24:26 1999 @@ -14,14 +14,14 @@ EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_NOPARENTNOTIFY | WS_EX_ACCEPTFILES | WS_EX_APPWINDOW | WS_EX_LEFTSCROLLBAR STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX //CLASS "" -CAPTION "TiMidity Win32GUI" +CAPTION "TiMidity Windows32 GUI" MENU IDM_MENU_MAIN FONT 8, "MS Sans Serif", 400, 0 LANGUAGE LANG_NEUTRAL , SUBLANG_NEUTRAL { -CONTROL "ToolBarMain", IDC_TOOLBARWINDOW_MAIN, "ToolbarWindow32", TBSTYLE_GROUP | CCS_NOPARENTALIGN | CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 2, 46, 112, 17 +CONTROL "ToolBarMain", IDC_TOOLBARWINDOW_MAIN, "ToolbarWindow32", TBSTYLE_GROUP | CCS_NOPARENTALIGN | CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 2, 46, 112, 16 CONTROL "ToolBarSubWnd", IDC_TOOLBARWINDOW_SUBWND, "ToolbarWindow32", TBSTYLE_GROUP | CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 112, 46, 80, 16, 0 - CONTROL "ScrollBar_Pregress", IDC_SCROLLBAR_PROGRESS, "scrollbar", SBS_HORZ | WS_CHILD | WS_VISIBLE | WS_DISABLED, 190, 48, 100, 12, 0 + CONTROL "ScrollBar_Pregress", IDC_SCROLLBAR_PROGRESS, "scrollbar", SBS_HORZ | WS_CHILD | WS_VISIBLE | WS_DISABLED, 192, 48, 98, 12, 0 CONTROL "ScrollBar_Volume", IDC_SCROLLBAR_VOLUME, "scrollbar", SBS_VERT | WS_CHILD | WS_VISIBLE, 292, 0, 12, 60, 0 CONTROL "PANEL", IDC_RECT_PANEL, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 0, 0, 220, 44, WS_EX_STATICEDGE CONTROL "CANVAS", IDC_RECT_CANVAS, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 220, 0, 68, 44, WS_EX_STATICEDGE @@ -57,30 +57,29 @@ POPUP "Window(&W)" { - MENUITEM "play List(&L)", IDM_MWPLAYLIST + MENUITEM "Play list(&L)", IDM_MWPLAYLIST MENUITEM "Tracer(&T)", IDM_MWTRACER MENUITEM "Document(&D)", IDM_MWDOCUMENT MENUITEM "Wrd tracer(&W)", IDM_MWWRDTRACER - MENUITEM "sound Spectogram(&S)", IDM_MWSOUNDSPEC + MENUITEM "Sound spectogram(&S)", IDM_MWSOUNDSPEC MENUITEM "Console(&C)", IDM_MWCONSOLE - MENUITEM SEPARATOR - MENUITEM "deBug(&B)", IDM_MWDEBUG } +// MENUITEM "deBug(&B)", IDM_MWDEBUG POPUP "Help(&H)" { - MENUITEM "Topic(&T)", IDM_MHTOPIC - MENUITEM "Help(&H)", IDM_MHHELP - MENUITEM SEPARATOR - MENUITEM "TiMidity(&T)", IDM_MHTIMIDITY MENUITEM "Version(&V)", IDM_MHVERSION } +// MENUITEM "Topic(&T)", IDM_MHTOPIC +// MENUITEM "Help(&H)", IDM_MHHELP +// MENUITEM SEPARATOR +// MENUITEM "TiMidity(&T)", IDM_MHTIMIDITY } IDD_DIALOG_DEBUG DIALOGEX 0, 0, 240, 180 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Debug Window (TiMidity Win32GUI)" +CAPTION "Debug Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "C L E A R", IDCLEAR, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 136, 164, 96, 16 @@ -89,24 +88,24 @@ } IDD_DIALOG_CONSOLE DIALOGEX 0, 0, 240, 180 -STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Console Window (TiMidity Win32GUI)" +STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER +CAPTION "Console Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "C L E A R", IDCLEAR, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 140, 164, 96, 16 CONTROL "", IDC_EDIT_VERBOSITY, "edit", ES_LEFT | ES_OEMCONVERT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 44, 164, 16, 16, 0 - CONTROL "VALID", IDC_CHECKBOX_VALID, "button", BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 92, 164, 32, 16, 0 CONTROL "Frame_Verbosity", -1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 4, 164, 80, 16, 0 - CONTROL "", IDC_EDIT, "edit", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 0, 0, 240, 160, WS_EX_STATICEDGE + CONTROL "", IDC_EDIT_TERMINAL, "edit", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 0, 0, 240, 160, WS_EX_STATICEDGE CONTROL "VERBOSITY", IDC_BUTTON_VERBOSITY, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 164, 40, 16, WS_EX_CLIENTEDGE CONTROL "<<", IDC_BUTTON_DEC, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 164, 12, 16 CONTROL ">>", IDC_BUTTON_INC, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 72, 164, 12, 16 + CONTROL "VALID", IDC_CHECKBOX_VALID, "button", BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 92, 164, 32, 16, 0 CONTROL "Frame_Valid", -1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 88, 164, 40, 16, 0 } IDD_DIALOG_DOC DIALOGEX 0, 0, 240, 180 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Document Window (TiMidity Win32GUI)" +CAPTION "Document Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "VALID", IDC_CHECKBOX_DEBUG_WND_VALID, "button", BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 8, 164, 36, 16, 0 @@ -114,13 +113,13 @@ CONTROL "", IDC_EDIT_FILENAME, "edit", ES_CENTER | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 56, 164, 128, 16, 0 CONTROL "<<", IDC_BUTTON_PREV, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 192, 164, 20, 16, 0 CONTROL ">>", IDC_BUTTON_NEXT, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 164, 20, 16, 0 - CONTROL "", IDC_EDIT, "edit", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 0, 0, 236, 160, 0 + CONTROL "", IDC_EDIT_DOC, "edit", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 0, 0, 236, 160, 0 } IDD_DIALOG_WRD DIALOGEX 0, 0, 320, 220 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Wrd Tracer Window (TiMidity Win32GUI)" +CAPTION "Wrd Tracer Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "FLUSH", IDFLUSH, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 256, 200, 60, 16 @@ -131,7 +130,7 @@ IDD_DIALOG_LIST DIALOGEX 0, 0, 240, 180 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Playlist Window (TiMidity Win32GUI)" +CAPTION "Playlist Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "CLEAR", IDCLEAR, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 192, 0, 24, 12 @@ -139,7 +138,7 @@ CONTROL "SAVE", IDC_BUTTON_SAVE, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 128, 0, 20, 12, 0 CONTROL "PLAYLIST", IDC_LISTBOX_PLAYLIST, "listbox", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 0, 16, 240, 132, 0 CONTROL "", IDC_EDIT_PLAYLISTFILE, "edit", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 32, 0, 76, 12, 0 - CONTROL "FILE", IDC_BUTTON4, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 108, 0, 20, 12, 0 + CONTROL "FILE", IDC_BUTTON_FILE, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 108, 0, 20, 12, 0 CONTROL "Default", IDC_CHECKBOX_DEFAULT, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 0, 32, 12, 0 CONTROL "APPLY", IDC_BUTTON_APPLY, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 0, 24, 12, 0 CONTROL "PLAY", IDC_BUTTON_PLAY, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE, 64, 164, 16, 16, 0 @@ -149,14 +148,14 @@ CONTROL "BACK", IDC_BUTTON_BACK, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 48, 164, 16, 16, 0 CONTROL "FORWARD", IDC_BUTTON_FORWARD, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE, 80, 164, 16, 16, 0 CONTROL "PAUSE", IDC_CHECKBOX_PAUSE, "button", BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 16, 164, 16, 16, 0 - CONTROL "", IDC_EDIT4, "edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 116, 164, 124, 16, 0 + CONTROL "", IDC_EDIT_PLAYLIST_LABEL, "edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 116, 164, 124, 16, 0 CONTROL "Frame1", -1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 0, 148, 240, 16, 0 } IDD_DIALOG_SOUNDSPEC DIALOGEX 0, 0, 240, 180 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Sound Spec Window (TiMidity Win32GUI)" +CAPTION "Sound Spec Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "C L E A R", IDCLEAR, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 136, 164, 96, 16 @@ -166,7 +165,7 @@ IDD_DIALOG_TRACER DIALOGEX 0, 0, 320, 220 STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "Tracer Window (TiMidity Win32GUI)" +CAPTION "Tracer Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { CONTROL "FLUSH", IDFLUSH, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 256, 200, 60, 16 @@ -175,10 +174,9 @@ } -IDD_DIALOG_SETTING DIALOGEX 0, 0, 354, 175 -STYLE DS_SYSMODAL | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUP | - WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP +IDD_DIALOG_SETTING DIALOGEX 0, 0, 355, 199 +EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_NOPARENTNOTIFY | WS_EX_ACCEPTFILES | WS_EX_APPWINDOW | WS_EX_LEFTSCROLLBAR +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX CAPTION "TiMidity Setting" FONT 9, "Times New Roman" { @@ -194,42 +192,52 @@ CONTROL "L&&R Delay Rotate Effect",IDC_CHECKBOX_DELAY_EFFECT, "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_TOP | WS_TABSTOP, 16,64,91,10 - LTEXT "Noise Sharping Level",IDC_STATIC,16,82,59,8,NOT WS_GROUP + LTEXT "Noise Sharping Level",IDC_STATIC,16,82,59,8,NOT + WS_GROUP EDITTEXT IDC_EDIT_NOISESHARPING,80,80,24,12,ES_NUMBER CONTROL "Enable Modulation Wheel",IDC_CHECKBOX_MODWHEEL,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,128,16,87,10 - CONTROL "Enable Portament",IDC_CHECKBOX_PORTAMENT,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,128,32,65,10 + CONTROL "Enable Portament",IDC_CHECKBOX_PORTAMENT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,128,32,65,10 CONTROL "Enable NRPN Vibrato",IDC_CHECKBOX_NRPNVIB,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,128,48,77,10 CONTROL "Enable GM Channel pressure",IDC_CHECKBOX_CHPRESS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,128,64,97,10 - CONTROL "Enable Overlapped same voice",IDC_CHECKBOX_OVOICE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,128,80,100,10 + CONTROL "Enable Overlapped same voice",IDC_CHECKBOX_OVOICE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,128,80,100,10 CONTROL "Unload Instruments each MIDI",IDC_CHECKBOX_FREE_INST, "Button",BS_AUTOCHECKBOX | BS_LEFT | BS_TOP | WS_TABSTOP, 240,16,103,10 CONTROL "Antialiasing instrument",IDC_CHECKBOX_ANTIALIAS,"Button", BS_AUTOCHECKBOX | BS_LEFT | BS_TOP | WS_TABSTOP,240,32, 80,10 - CONTROL "Load Instruments while playing",IDC_CHECKBOX_LOADINST_PLAYING,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,240,48,103,10 - GROUPBOX "Output Encoding",IDC_STATIC,8,104,336,40 - GROUPBOX "Precision",IDC_STATIC,32,112,78,24 + CONTROL "Load Instruments while playing", + IDC_CHECKBOX_LOADINST_PLAYING,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,240,48,103,10 + GROUPBOX "Output",IDC_STATIC,8,104,336,64 + COMBOBOX IDC_COMBO_OUTPUT_MODE,16,116,80,40,CBS_DROPDOWNLIST | + CBS_SORT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_EDIT_OUTPUT_FILE,104,116,184,12 + PUSHBUTTON "Reference",IDC_BUTTON_REF,288,114,40,16 + GROUPBOX "Encoding",IDC_STATIC,16,136,160,24 CONTROL "16 bits",IDC_RADIO_16BITS,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,39,120,35,10 + WS_GROUP | WS_TABSTOP,23,144,35,10 CONTROL "8 bits",IDC_RADIO_8BITS,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,78,120,31,10 - GROUPBOX "Channels",IDC_STATIC,144,112,82,24 + WS_TABSTOP,60,144,31,10 + CONTROL "U-Law",IDC_RADIO_ULAW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,97,144,35,10 + CONTROL "A-Law",IDC_RADIO_ALAW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,134,144,35,10 + GROUPBOX "Channels",IDC_STATIC,181,136,82,24 CONTROL "Stereo",IDC_RADIO_STEREO,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,151,120,33,10 + WS_GROUP | WS_TABSTOP,188,144,33,10 CONTROL "Mono",IDC_RADIO_MONO,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,191,120,33,10 - LTEXT "Sample rate",IDC_STATIC,256,122,33,8,NOT WS_GROUP - EDITTEXT IDC_EDIT_SAMPLE_RATE,290,120,29,12,ES_NUMBER - PUSHBUTTON "OK",IDOK,89,152,48,16,BS_CENTER - PUSHBUTTON "Default",IDDEFAULT,153,152,48,16 - PUSHBUTTON "Cancel",IDCANCEL,217,152,48,16,BS_CENTER + WS_TABSTOP,228,144,33,10 + LTEXT "Sample rate",IDC_STATIC,271,146,33,8,NOT WS_GROUP + EDITTEXT IDC_EDIT_SAMPLE_RATE,305,144,29,12,ES_NUMBER + PUSHBUTTON "OK",IDOK,88,176,48,16,BS_CENTER + PUSHBUTTON "Default",IDDEFAULT,151,176,48,16 + PUSHBUTTON "Cancel",IDCANCEL,216,176,48,16,BS_CENTER } IDD_DIALOG_ST_CHANNELS DIALOGEX 0, 0, 240, 180 @@ -243,38 +251,38 @@ CONTROL "CANCEL", IDCANCEL, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 152, 168, 40, 12 CONTROL "DEFAULT", IDDEFAULT, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 168, 44, 12 CONTROL "TabControl_CHANNELS", IDC_SYSTABCONTROL_CHANNELS, "SysTabControl32", WS_CHILD | WS_VISIBLE, 0, 0, 240, 164 - CONTROL "Ch32", IDC_CHECKBOX1, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 28, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX3, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 28, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX4, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 36, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX5, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 36, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX9, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 44, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX12, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 44, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX8, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 52, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX13, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 52, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX14, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 60, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX15, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 60, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX16, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 68, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX17, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 68, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX18, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 76, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX19, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 76, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX20, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 84, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX21, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 84, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX11, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 92, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX2, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 92, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX22, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 100, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX23, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 100, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX24, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 108, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX25, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 108, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX26, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 116, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX27, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 116, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX28, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 124, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX29, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 124, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX30, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 132, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX31, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 132, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX32, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 140, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX33, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 140, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX100, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 148, 36, 8, 0 - CONTROL "Ch32", IDC_CHECKBOX101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 148, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH1, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 28, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH2, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 36, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH3, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 44, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH4, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 52, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH5, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 60, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH6, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 68, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH7, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 76, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH8, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 84, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH9, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 92, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH10, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 100, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH11, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 108, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH12, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 116, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH13, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 124, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH14, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 132, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH15, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 140, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH16, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 148, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH17, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 28, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH18, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 36, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH19, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 44, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH20, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 52, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH21, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 60, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH22, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 68, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH23, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 76, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH24, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 84, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH25, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 92, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH26, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 100, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH27, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 108, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH28, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 116, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH29, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 124, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH30, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 132, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH31, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 140, 36, 8, 0 + CONTROL "Ch32", IDC_CHECKBOX_CH32, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 68, 148, 36, 8, 0 CONTROL "drumchannels", IDC_CHECKBOX_DRUMCHANNELS, "button", BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 164, 92, 64, 16, 0 CONTROL "drumchannel_mask", IDC_CHECKBOX_DRUMCHANNEL_MASK, "button", BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 164, 116, 64, 16, 0 CONTROL "quiet_channel", IDC_CHECKBOX_QUIET_CHANNEL, "button", BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 164, 140, 64, 16, 0 @@ -286,11 +294,11 @@ IDB_BITMAP_SUBWND_BUTTON BITMAP "w32g_subbtn.bmp" IDB_BITMAP_SLEEP BITMAP "w32g_sleep.bmp" -IDD_DIALOG_SIMPLE_LIST DIALOGEX 0, 0, 240, 180 -EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_ACCEPTFILES -STYLE DS_MODALFRAME | DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU -CAPTION "List Window (TiMidity Win32GUI)" +IDD_DIALOG_SIMPLE_LIST DIALOGEX 0, 0, 280, 160 +EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE +STYLE DS_3DLOOK | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "List Window (TiMidity Windows32 GUI)" FONT 9, "‚l‚r ‚o–¾’©", 400, 0 { - CONTROL "ListBoxPlaylist", IDC_LISTBOX_PLAYLIST, "listbox", LBS_NOTIFY | LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 0, 0, 240, 180 + CONTROL "ListBoxPlaylist", IDC_LISTBOX_PLAYLIST, "listbox", LBS_NOTIFY | LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | LBS_NOINTEGRALHEIGHT, 0,0,280,160 } diff -ruN TiMidity++-2.2.0/interface/w32g_utl.c TiMidity++-2.3.0/interface/w32g_utl.c --- TiMidity++-2.2.0/interface/w32g_utl.c Wed Mar 24 01:59:52 1999 +++ TiMidity++-2.3.0/interface/w32g_utl.c Sat Jul 31 23:20:28 1999 @@ -1,6 +1,6 @@ /* - - TiMidity -- Experimental MIDI to WAVE converter + TiMidity -- MIDI to WAVE converter and player + Copyright (C) 1999 Masanao Izumo Copyright (C) 1995 Tuukka Toivonen This program is free software; you can redistribute it and/or modify @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. w32g_utl.c: written by Daisuke Aoki + Masanao Izumo */ @@ -34,7 +35,6 @@ #endif #include #include -//#include #include "timidity.h" #include "common.h" @@ -43,301 +43,27 @@ #include "readmidi.h" #include "output.h" #include "controls.h" -#include "tables.h" -#include "miditrace.h" -#include "reverb.h" +#include "recache.h" #ifdef SUPPORT_SOUNDSPEC #include "soundspec.h" #endif /* SUPPORT_SOUNDSPEC */ -#include "recache.h" -#include "arc.h" -#include "strtab.h" #include "wrd.h" -#include "mid.defs" - #include "w32g.h" -//#include -#include "w32g_main.h" -// #include "w32g_res.h" -#include "w32g_utl.h" -#include "w32g_c.h" +#if defined(__CYGWIN32__) || defined(__MINGW32__) +#include +#endif +extern int opt_default_mid; extern int effect_lr_mode; extern int effect_lr_delay_msec; - - -//***************************************************************************/ -// Play list utility - -PLAYLIST * -new_playlist(void) -{ - PLAYLIST *playlist = (PLAYLIST *)safe_malloc(sizeof(PLAYLIST)); - playlist->prev = NULL; - playlist->next = NULL; - playlist->filename[0] = '\0'; - playlist->title[0] = '\0'; - playlist->opt = 0; - return playlist; -} - -PLAYLIST * -del_playlist(PLAYLIST *playlist) -{ - PLAYLIST *ret; - if(!playlist) - return NULL; - if(playlist->prev && playlist->next){ - (playlist->prev)->next = (playlist->next)->prev; - ret = playlist->prev; - } else if(playlist->prev && !playlist->next){ - (playlist->prev)->next = NULL; - ret = playlist->prev; - } else if(!playlist->prev && playlist->next){ - (playlist->next)->prev = NULL; - ret = playlist->next; - } else - ret = NULL; - free((void *)playlist); - return ret; -} - -void -del_all_playlist(PLAYLIST *playlist) -{ - PLAYLIST *res; - while((res = del_playlist(playlist))!=NULL) - playlist = res; -} - -PLAYLIST * -first_playlist(PLAYLIST *playlist) -{ - if(!playlist) - return NULL; - while(playlist->prev) - playlist = playlist->prev; - return playlist; -} - -PLAYLIST * -last_playlist(PLAYLIST *playlist) -{ - if(!playlist) - return NULL; - while(playlist->next) - playlist = playlist->next; - return playlist; -} - -PLAYLIST * -insert_playlist(PLAYLIST *playlist, PLAYLIST *prev, PLAYLIST *next) -{ - PLAYLIST *first, *last; - if(playlist==NULL) - return NULL; - first = first_playlist(playlist); - last = last_playlist(playlist); - first->prev = prev; - last->next = next; - if(prev) - prev->next = first; - if(next) - next->prev = last; - return playlist; -} - -/* insert p1 into p2 */ -void -prev_insert_playlist(PLAYLIST *p1, PLAYLIST *p2) -{ - PLAYLIST *p3; - if(p2) - p3 = p2->prev; - else - p3 = NULL; - insert_playlist(p1,p3,p2); -} - -void -next_insert_playlist(PLAYLIST *p1, PLAYLIST *p2) -{ - PLAYLIST *p3; - if(p2) - p3 = p2->next; - else - p3 = NULL; - insert_playlist(p1,p2,p3); -} - -void -first_insert_playlist(PLAYLIST *p1, PLAYLIST *p2) -{ - PLAYLIST *p = first_playlist(p2); - insert_playlist(p1,NULL,p); -} - -void -last_insert_playlist(PLAYLIST *p1, PLAYLIST *p2) -{ - PLAYLIST *p = last_playlist(p2); - insert_playlist(p1,p,NULL); -} - -PLAYLIST * -last_insert_playlist_filename(PLAYLIST *playlist, char *filename) -{ - PLAYLIST *p = new_playlist(); - strncpy((char *)p->filename,filename,PLAYLIST_DATAMAX-1); - p->filename[PLAYLIST_DATAMAX] = '\0'; - last_insert_playlist(p,playlist); - return p; -} - -PLAYLIST * -first_insert_playlist_filename(PLAYLIST *playlist, char *filename) -{ - PLAYLIST *p = new_playlist(); - strncpy((char *)p->filename,filename,PLAYLIST_DATAMAX-1); - p->filename[PLAYLIST_DATAMAX] = '\0'; - first_insert_playlist(p,playlist); - return p; -} - -PLAYLIST * -dup_a_playlist_merely(PLAYLIST *playlist) -{ - PLAYLIST *p = new_playlist(); - memcpy((void *)p,(void *)playlist,sizeof(PLAYLIST)); - return p; -} - -PLAYLIST * -dup_a_playlist(PLAYLIST *playlist) -{ - PLAYLIST *p = dup_a_playlist(playlist); - p->prev = NULL; - p->next = NULL; - return p; -} - -PLAYLIST * -dup_playlist(PLAYLIST *playlist) -{ - PLAYLIST *src = first_playlist(playlist); - PLAYLIST *new = NULL, *ret = NULL, *p; - while(src){ - p = dup_a_playlist(src); - last_insert_playlist(new,p); - new = p; - if(!ret) - ret = new; - src = src->next; - } - return ret; -} - -void -reverse_playlist(PLAYLIST *playlist) -{ - PLAYLIST *p = first_playlist(playlist); - PLAYLIST *next = p; - while(next){ - next = p->next; - p->next = p->prev; - p->prev = next; - } -} - -int -num_before_playlist(PLAYLIST *pl) -{ - PLAYLIST *p = pl; - int i = 0; - while(p!=NULL){ - p=p->prev; - i++; - } - return i; -} - -int -num_after_playlist(PLAYLIST *pl) -{ - PLAYLIST *p = pl; - int i = 0; - while(p!=NULL){ - p=p->next; - i++; - } - return i; -} - -int -num_with_playlist(PLAYLIST *pl) -{ - PLAYLIST *p = first_playlist(pl); - return num_after_playlist(p); -} - - - - - - - - - -// ************************************************************************** -// misc utility - -int -isinteger(char *str) -{ - int digit_flag; - while(*str == ' ' && *str == '\t') - str++; - if(*str == '+' && *str == '-') - str++; - while(isdigit(*str)){ - digit_flag = 1; - str++; - } - while(*str == ' ' && *str == '\t') - str++; - if(*str || !digit_flag) - return 0; - return 1; -} - -#define LotationBufferNumMAX 256 -int LotationBufferNum = 0; -char LotationBuffer[LotationBufferNumMAX][LotationBufferMAX]; -char * -GetLotationBuffer(void) -{ - char *buffer = LotationBuffer[LotationBufferNum]; - if(LotationBufferNumPlaylistFileOpenDir,MAXPATH + 31); PlaylistFileOpenDir[MAXPATH + 31] = '\0'; - ProcessPriority = sp->ProcessPriority; PlayerThreadPriority = sp->PlayerThreadPriority; - MidiPlayerThreadPriority = sp->MidiPlayerThreadPriority; - MainThreadPriority = sp->MainThreadPriority; - TracerThreadPriority = sp->TracerThreadPriority; - WrdThreadPriority = sp->WrdThreadPriority; - WrdGraphicFlag = SetFlag(sp->WrdGraphicFlag); + GUIThreadPriority = sp->GUIThreadPriority; TraceGraphicFlag = SetFlag(sp->TraceGraphicFlag); // fonts ... SystemFontSize = sp->SystemFontSize; @@ -626,12 +338,8 @@ (sp->ConfigFileOpenDir)[MAXPATH + 31] = '\0'; strncpy(sp->PlaylistFileOpenDir,PlaylistFileOpenDir,MAXPATH + 31); (sp->PlaylistFileOpenDir)[MAXPATH + 31] = '\0'; - sp->ProcessPriority = ProcessPriority; sp->PlayerThreadPriority = PlayerThreadPriority; - sp->MidiPlayerThreadPriority = MidiPlayerThreadPriority; - sp->MainThreadPriority = MainThreadPriority; - sp->TracerThreadPriority = TracerThreadPriority; - sp->WrdThreadPriority = WrdThreadPriority; + sp->GUIThreadPriority = GUIThreadPriority; sp->WrdGraphicFlag = SetFlag(WrdGraphicFlag); sp->TraceGraphicFlag = SetFlag(TraceGraphicFlag); // fonts ... @@ -660,224 +368,202 @@ extern int set_ctl(char *cp); extern int set_wrd(char *w); -#ifdef PRESENCE_HACK -extern int presence_balance; -extern double presence_delay_msec; -#ifndef atof -extern double atof(const char *); -#endif -#endif /* PRESENCE_HACK */ - #if defined(__W32__) && defined(SMFCONV) extern int opt_rcpcv_dll; #endif /* SMFCONV */ - -extern int noise_sharp_type; extern char *wrdt_open_opts; -/* FIXME */ -//char *S_wrdt_open_opts[64]; -char S_wrdt_open_opts[64]; -void -ApplySettingTimidity(SETTING_TIMIDITY *st) +static int is_device_output_ID(int id) { - int i; - char buffer[256]; - free_instruments_afterwards = st->free_instruments_afterwards; - - effect_lr_mode = st->effect_lr_mode; - effect_lr_delay_msec = st->effect_lr_delay_msec; - quietchannels = st->quietchannels; - drumchannels = st->drumchannels; - drumchannel_mask = st->drumchannel_mask; - default_drumchannels = st->default_drumchannels; - default_drumchannel_mask = st->default_drumchannel_mask; - sprintf(buffer,"%c",st->play_mode_id_character); - set_play_mode(buffer); - play_mode->encoding = st->play_mode_encoding; - strncpy(OutputName,st->OutputName,MAXPATH + 31); - OutputName[MAXPATH + 31] = '\0'; - if(OutputName[0]=='\0') - play_mode->name = NULL; - else - play_mode->name = OutputName; -// st->output_rate = SetValue -// (st->output_rate,MIN_OUTPUT_RATE,MAX_OUTPUT_RATE); - if(st->output_rate != 0) - play_mode->rate = st->output_rate; - else if(play_mode->rate == 0) - play_mode->rate = DEFAULT_RATE; - -#if 0 /* FIXME */ - if (st->buffer_fragments != -1) - play_mode->extra_param[0]=SetValue(st->buffer_fragments, 3, 1000); -#endif - - antialiasing_allowed = SetFlag(st->antialiasing_allowed); - fast_decay = SetFlag(st->fast_decay); - adjust_panning_immediately = - SetFlag(st->adjust_panning_immediately); - for(i = 0; i < MAX_CHANNELS; i++) - default_program[i] = (st->default_program)[i]; - amplification = SetValue - (st->amplification, 0, MAX_AMPLIFICATION); - if(!st->control_ratio){ - control_ratio = play_mode->rate / CONTROLS_PER_SECOND; - control_ratio = SetValue(control_ratio, 1, MAX_CONTROL_RATIO); - } else - control_ratio = SetValue(st->control_ratio, 1, MAX_CONTROL_RATIO); - voices = SetValue(st->voices, 1, MAX_VOICES); + return id == 'd' || id == 'n' || id == 'e'; +} - /* FIXME */ -// modify_release = SetValue(st->modify_release, 0, MRELS - 1); +void +ApplySettingTiMidity(SETTING_TIMIDITY *st) +{ + int i; + char buffer[INI_MAXLEN]; + /* Player must be stopped. + * DANGER to apply settings while playing. + */ + amplification = SetValue(st->amplification, 0, MAX_AMPLIFICATION); + antialiasing_allowed = SetFlag(st->antialiasing_allowed); + if(st->buffer_fragments == -1) + opt_buffer_fragments = -1; + else + opt_buffer_fragments = SetValue(st->buffer_fragments, 3, 1000); + default_drumchannels = st->default_drumchannels; + default_drumchannel_mask = st->default_drumchannel_mask; + opt_modulation_wheel = SetFlag(st->opt_modulation_wheel); + opt_portamento = SetFlag(st->opt_portamento); + opt_nrpn_vibrato = SetFlag(st->opt_nrpn_vibrato); + opt_channel_pressure = SetFlag(st->opt_channel_pressure); + opt_trace_text_meta_event = SetFlag(st->opt_trace_text_meta_event); + opt_overlap_voice_allow = SetFlag(st->opt_overlap_voice_allow); + opt_default_mid = st->opt_default_mid; + default_tonebank = st->default_tonebank; + special_tonebank = st->special_tonebank; + effect_lr_mode = st->effect_lr_mode; + effect_lr_delay_msec = st->effect_lr_delay_msec; + opt_reverb_control = st->opt_reverb_control; + opt_chorus_control = st->opt_reverb_control; + noise_sharp_type = st->noise_sharp_type; + opt_evil_mode = st->opt_evil_mode; + adjust_panning_immediately = SetFlag(st->adjust_panning_immediately); + fast_decay = SetFlag(st->fast_decay); #ifdef SUPPORT_SOUNDSPEC - view_soundspec_flag = SetFlag(st->view_soundspec_flag); - spectrigram_update_sec = st->spectrigram_update_sec; + view_soundspec_flag = SetFlag(st->view_soundspec_flag); + spectrigram_update_sec = st->spectrigram_update_sec; #endif - allocate_cache_size = st->allocate_cache_size; -// FIXME -//st->ctl_id_character='w'; - sprintf(buffer,"%c",st->ctl_id_character); - set_ctl(buffer); - ctl->verbosity = st->ctl_verbosity; - ctl->id_character = st->ctl_id_character; - ctl->trace_playing = SetFlag(st->ctl_trace_playing); - trace_nodelay(!ctl->trace_playing); - // strncpy(output_text_code,st->output_text_code,MAXPATH + 63); - // output_text_code[63] = '\0'; - opt_modulation_wheel = SetFlag(st->opt_modulation_wheel); - opt_portamento = SetFlag(st->opt_portamento); - opt_nrpn_vibrato = SetFlag(st->opt_nrpn_vibrato); - opt_reverb_control = st->opt_reverb_control; - opt_chorus_control = st->opt_reverb_control; - // for(i=0;iopt_chorus_control2)[i]; - opt_channel_pressure = SetFlag(st->opt_channel_pressure); - opt_trace_text_meta_event = SetFlag(st->opt_trace_text_meta_event); - opt_overlap_voice_allow = SetFlag(st->opt_overlap_voice_allow); - opt_default_mid = st->opt_default_mid; - if(strcmp((char *)st->opt_default_mid_str, "gs") == 0 - || strcmp((char *)st->opt_default_mid_str, "GS") == 0) - opt_default_mid = 0x41; - else if(strcmp((char *)st->opt_default_mid_str, "xg") == 0 - || strcmp((char *)st->opt_default_mid_str, "XG") == 0) - opt_default_mid = 0x43; - else if(strcmp((char *)st->opt_default_mid_str, "gm") == 0 - || strcmp((char *)st->opt_default_mid_str, "GM") == 0) - opt_default_mid = 0x7e; - default_tonebank = st->default_tonebank; - special_tonebank = st->special_tonebank; - opt_realtime_playing = SetFlag(st->opt_realtime_playing); + for(i = 0; i < MAX_CHANNELS; i++) + default_program[i] = st->default_program[i]; + set_ctl(st->opt_ctl); + opt_realtime_playing = SetFlag(st->opt_realtime_playing); + reduce_voice_threshold = st->reduce_voice_threshold; + set_play_mode(st->opt_playmode); + strncpy(OutputName,st->OutputName,MAXPATH); + if(OutputName[0] && !is_device_output_ID(play_mode->id_character)) + play_mode->name = OutputName; + opt_output_rate = st->output_rate; + if(st->output_rate) + play_mode->rate = SetValue(st->output_rate, + MIN_OUTPUT_RATE, MAX_OUTPUT_RATE); + else if(play_mode->rate == 0) + play_mode->rate = DEFAULT_RATE; + voices = SetValue(st->voices, 1, MAX_VOICES); + quietchannels = st->quietchannels; + if(opt_aq_max_buff) + free(opt_aq_max_buff); + if(opt_aq_fill_buff) + free(opt_aq_fill_buff); + strcpy(buffer, st->opt_qsize); + opt_aq_max_buff = buffer; + opt_aq_fill_buff = strchr(opt_aq_max_buff, '/'); + *opt_aq_fill_buff++ = '\0'; + opt_aq_max_buff = safe_strdup(opt_aq_max_buff); + opt_aq_fill_buff = safe_strdup(opt_aq_fill_buff); + modify_release = SetValue(st->modify_release, 0, MAX_MREL); + allocate_cache_size = st->allocate_cache_size; + if(output_text_code) + free(output_text_code); + output_text_code = safe_strdup(st->output_text_code); + free_instruments_afterwards = st->free_instruments_afterwards; + set_wrd(st->opt_wrd); #if defined(__W32__) && defined(SMFCONV) - opt_rcpcv_dll = st->opt_rcpcv_dll; + opt_rcpcv_dll = st->opt_rcpcv_dll; #endif /* SMFCONV */ - sprintf(buffer,"%c%s",st->wrdt_id,st->wrdt_open_opts); - set_wrd(buffer); - strncpy(S_wrdt_open_opts,st->wrdt_open_opts,63); - S_wrdt_open_opts[63] = '\0'; - noise_sharp_type = st->noise_sharp_type; -#if 0 - for(i=0;i<4;i++) - ns_tap[i] = (st->ns_tap)[i]; -#endif + + + opt_control_ratio = st->control_ratio; + if(opt_control_ratio) + control_ratio = SetValue(opt_control_ratio, 1, MAX_CONTROL_RATIO); + else + { + control_ratio = play_mode->rate / CONTROLS_PER_SECOND; + control_ratio = SetValue(control_ratio, 1, MAX_CONTROL_RATIO); + } } void -SaveSettingTimidity(SETTING_TIMIDITY *st) +SaveSettingTiMidity(SETTING_TIMIDITY *st) { - int i; - st->free_instruments_afterwards = free_instruments_afterwards; - st->quietchannels = quietchannels; - st->effect_lr_mode = effect_lr_mode; - st->effect_lr_delay_msec = effect_lr_delay_msec; - st->drumchannels = drumchannels; - st->drumchannel_mask = drumchannel_mask; - st->default_drumchannels = drumchannels; - st->default_drumchannel_mask = drumchannel_mask; - st->play_mode_encoding = play_mode->encoding; - st->play_mode_id_character = play_mode->id_character; - strncpy(st->OutputName,OutputName,MAXPATH + 31); - st->OutputName[MAXPATH + 31] = '\0'; - st->output_rate = SetValue - (play_mode->rate,MIN_OUTPUT_RATE,MAX_OUTPUT_RATE); - - /* FIXME */ -#if defined(AU_LINUX) || defined(AU_W32) || defined(AU_BSDI) - st->buffer_fragments = play_mode->extra_param[0]; -#endif - - st->antialiasing_allowed = SetFlag(antialiasing_allowed); - st->fast_decay = SetFlag(fast_decay); - st->adjust_panning_immediately = - SetFlag(adjust_panning_immediately); - for(i = 0; i < MAX_CHANNELS; i++) - (st->default_program)[i] = default_program[i]; - st->amplification = SetValue - (amplification, 0, MAX_AMPLIFICATION); - if(!control_ratio){ - st->control_ratio = play_mode->rate / CONTROLS_PER_SECOND; - st->control_ratio = SetValue(st->control_ratio, 1, MAX_CONTROL_RATIO); - } else - st->control_ratio = SetValue(control_ratio, 1, MAX_CONTROL_RATIO); - st->voices = SetValue(voices, 1, MAX_VOICES); - - /* FIXME */ -// st->modify_release = SetValue(modify_release, 0, MRELS - 1); - + int i, j; + st->amplification = SetValue(amplification, 0, MAX_AMPLIFICATION); + st->antialiasing_allowed = SetFlag(antialiasing_allowed); + st->buffer_fragments = opt_buffer_fragments; + st->control_ratio = SetValue(opt_control_ratio, 0, MAX_CONTROL_RATIO); + st->default_drumchannels = default_drumchannels; + st->default_drumchannel_mask = default_drumchannel_mask; + st->opt_modulation_wheel = SetFlag(opt_modulation_wheel); + st->opt_portamento = SetFlag(opt_portamento); + st->opt_nrpn_vibrato = SetFlag(opt_nrpn_vibrato); + st->opt_channel_pressure = SetFlag(opt_channel_pressure); + st->opt_trace_text_meta_event = SetFlag(opt_trace_text_meta_event); + st->opt_overlap_voice_allow = SetFlag(opt_overlap_voice_allow); + st->opt_default_mid = opt_default_mid; + st->default_tonebank = default_tonebank; + st->special_tonebank = special_tonebank; + st->effect_lr_mode = effect_lr_mode; + st->effect_lr_delay_msec = effect_lr_delay_msec; + st->opt_reverb_control = opt_reverb_control; + st->opt_chorus_control = opt_reverb_control; + st->noise_sharp_type = noise_sharp_type; + st->opt_evil_mode = SetFlag(opt_evil_mode); + st->adjust_panning_immediately = SetFlag(adjust_panning_immediately); + st->fast_decay = SetFlag(fast_decay); #ifdef SUPPORT_SOUNDSPEC - st->view_soundspec_flag = SetFlag(view_soundspec_flag); - st->spectrigram_update_sec = spectrigram_update_sec; -#endif - st->allocate_cache_size = allocate_cache_size; - st->ctl_id_character = ctl->id_character; -#if 0 -// FIXME -//st->ctl_id_character = 'w'; - sprintf(buffer,"%c",st->ctl_id_character); - set_ctl(buffer); + st->view_soundspec_flag = SetFlag(view_soundspec_flag); + st->spectrigram_update_sec = spectrigram_update_sec; #endif - st->ctl_verbosity = ctl->verbosity; - st->ctl_id_character = ctl->id_character; - st->ctl_trace_playing = SetFlag(ctl->trace_playing); - strncpy(st->output_text_code,output_text_code,MAXPATH + 63); - (st->output_text_code)[63] = '\0'; - st->opt_modulation_wheel = SetFlag(opt_modulation_wheel); - st->opt_portamento = SetFlag(opt_portamento); - st->opt_nrpn_vibrato = SetFlag(opt_nrpn_vibrato); - st->opt_reverb_control = opt_reverb_control; - st->opt_chorus_control = opt_reverb_control; - // for(i=0;iopt_chorus_control2)[i] = opt_chorus_control2[i]; - st->opt_channel_pressure = SetFlag(opt_channel_pressure); - st->opt_trace_text_meta_event = SetFlag(opt_trace_text_meta_event); - st->opt_overlap_voice_allow = SetFlag(opt_overlap_voice_allow); - st->opt_default_mid = opt_default_mid; - if(opt_default_mid == 0x41) - strcpy((char *)st->opt_default_mid_str,"gs"); - else if(opt_default_mid == 0x439) - strcpy((char *)st->opt_default_mid_str,"xg"); - else if(opt_default_mid == 0x7e) - strcpy((char *)st->opt_default_mid_str,"gm"); - else - strcpy((char *)st->opt_default_mid_str,""); - st->default_tonebank = default_tonebank; - st->special_tonebank = special_tonebank; - st->opt_realtime_playing = SetFlag(opt_realtime_playing); + for(i = 0; i < MAX_CHANNELS; i++) + { + if(def_instr_name[0]) + st->default_program[i] = SPECIAL_PROGRAM; + else + st->default_program[i] = default_program[i]; + } + j = 0; + st->opt_ctl[j++] = ctl->id_character; + for(i = 1; i < ctl->verbosity; i++) + st->opt_ctl[j++] = 'v'; + for(i = 1; i > ctl->verbosity; i--) + st->opt_ctl[j++] = 'q'; + if(ctl->trace_playing) + st->opt_ctl[j++] = 't'; + if(ctl->flags & CTLF_LIST_LOOP) + st->opt_ctl[j++] = 'l'; + if(ctl->flags & CTLF_LIST_RANDOM) + st->opt_ctl[j++] = 'r'; + if(ctl->flags & CTLF_LIST_SORT) + st->opt_ctl[j++] = 's'; + if(ctl->flags & CTLF_AUTOSTART) + st->opt_ctl[j++] = 'a'; + if(ctl->flags & CTLF_AUTOEXIT) + st->opt_ctl[j++] = 'x'; + st->opt_ctl[j] = '\0'; + st->opt_realtime_playing = SetFlag(opt_realtime_playing); + st->reduce_voice_threshold = reduce_voice_threshold; + j = 0; + st->opt_playmode[j++] = play_mode->id_character; + st->opt_playmode[j++] = ((play_mode->encoding & PE_MONO) ? 'M' : 'S'); + st->opt_playmode[j++] = ((play_mode->encoding & PE_SIGNED) ? 's' : 'u'); + st->opt_playmode[j++] = ((play_mode->encoding & PE_16BIT) ? '1' : '8'); + if(play_mode->encoding & PE_ULAW) + st->opt_playmode[j++] = 'U'; + else if(play_mode->encoding & PE_ALAW) + st->opt_playmode[j++] = 'A'; + else + st->opt_playmode[j++] = 'l'; + if(play_mode->encoding & PE_BYTESWAP) + st->opt_playmode[j++] = 'x'; + st->opt_playmode[j] = '\0'; + strncpy(st->OutputName,OutputName,sizeof(st->OutputName)); + st->voices = SetValue(voices, 1, MAX_VOICES); + st->quietchannels = quietchannels; + snprintf(st->opt_qsize,sizeof(st->opt_qsize),"%s/%s", + opt_aq_max_buff,opt_aq_fill_buff); + st->modify_release = SetValue(modify_release, 0, MAX_MREL); + st->allocate_cache_size = allocate_cache_size; + st->output_rate = opt_output_rate; + if(st->output_rate == 0) + { + st->output_rate = play_mode->rate; + if(st->output_rate == 0) + st->output_rate = DEFAULT_RATE; + } + st->output_rate = SetValue(st->output_rate,MIN_OUTPUT_RATE,MAX_OUTPUT_RATE); + strncpy(st->output_text_code,output_text_code,sizeof(st->output_text_code)); + st->free_instruments_afterwards = free_instruments_afterwards; + st->opt_wrd[0] = wrdt->id; + if(wrdt_open_opts) + strncpy(st->opt_wrd + 1, wrdt_open_opts, sizeof(st->opt_wrd) - 1); + else + st->opt_wrd[1] = '\0'; #if defined(__W32__) && defined(SMFCONV) - st->opt_rcpcv_dll = opt_rcpcv_dll; + st->opt_rcpcv_dll = opt_rcpcv_dll; #endif /* SMFCONV */ - st->wrdt_id = wrdt->id; - // strncpy(st->wrdt_open_opts,wrdt_open_opts,60); - // (st->wrdt_open_opts)[60] = '\0'; - strncpy(st->wrdt_open_opts,S_wrdt_open_opts,60); - (st->wrdt_open_opts)[60] = '\0'; - st->noise_sharp_type = noise_sharp_type; -#if 0 - for(i=0;i<4;i++) - (st->ns_tap)[i] = ns_tap[i]; -#endif } @@ -888,49 +574,6 @@ //****************************************************************************/ // ini & config -/* - - CHAR INI_free_instruments_afterwards = "free_instruments_afterwards"; - CHAR INI_config_file = "config_file"; - CHAR INI_channel_flag = "channel_flag"; - CHAR INI_presence_balance = "presence_balance"; - CHAR INI_options = "options"; - CHAR INI_ = ""; - CHAR INI_ = ""; - CHAR INI_ = ""; - CHAR INI_ = ""; - CHAR INI_ = ""; - CHAR INI_ = ""; - CHAR INI_ = ""; - int load_inifile(void){ - DWORD dwRes; - CHAR buffer[INI_MAXLEN]; - if(IniGetKeyLong(INI_free_instruments_afterwards,dwRes)) - if(dwRes) - free_instruments_afterwards = 1; - else - free_instruments_afterwards = 0; - if(IniGetKeyString(INI_config_file,buffer)) - strcpy(config_file, buffer); - if(IniGetKeyLong(INI_channel_flag,dwRes)) - set_channel_flag(&quietchannels, dwRes, "Quiet channel"); - if(IniGetKeyString(INI_config_file,buffer)) - strcpy(config_file, buffer); - if(IniGetKeyLong(INI_presence_balance,dwRes)) - if(dwRes >= -1 && dwRes <= 2) - presence_balance = dwRes; - if(IniGetKeyLong(INI_,dwRes)) - if(IniGetKeyLong(INI_,dwRes)) - if(IniGetKeyLong(INI_,dwRes)) - if(IniGetKeyLong(INI_,dwRes)) - if(IniGetKeyLong(INI_,dwRes)) - if(IniGetKeyString(INI_,buffer)) - if(IniGetKeyString(INI_,buffer)) - if(IniGetKeyString(INI_,buffer)) - if(IniGetKeyString(INI_,buffer)) - if(IniGetKeyString(INI_,buffer)) - */ - static char S_IniFile[MAXPATH + 32]; static char S_ConfigFile[MAXPATH + 32]; static char S_PlaylistFile[MAXPATH + 32]; @@ -972,152 +615,209 @@ SETTING_PLAYER *sp_default, *sp_current, *sp_temp; SETTING_TIMIDITY *st_default, *st_current, *st_temp; -extern int read_config_file(char *name, int self); - -void -w32g_initialize(void) +void w32g_initialize(void) { - char buffer[MAXPATH + 1024]; - char *p; + char buffer[MAXPATH + 1024]; + char *p; + + hInst = GetModuleHandle(0); - IniFile = S_IniFile; - ConfigFile = S_ConfigFile; - PlaylistFile = S_PlaylistFile; - PlaylistHistoryFile = S_PlaylistHistoryFile; - MidiFileOpenDir = S_MidiFileOpenDir; - ConfigFileOpenDir = S_ConfigFileOpenDir; - PlaylistFileOpenDir = S_PlaylistFileOpenDir; - DocFileExt = S_DocFileExt; - OutputName = S_OutputName; + IniFile = S_IniFile; + ConfigFile = S_ConfigFile; + PlaylistFile = S_PlaylistFile; + PlaylistHistoryFile = S_PlaylistHistoryFile; + MidiFileOpenDir = S_MidiFileOpenDir; + ConfigFileOpenDir = S_ConfigFileOpenDir; + PlaylistFileOpenDir = S_PlaylistFileOpenDir; + DocFileExt = S_DocFileExt; + OutputName = S_OutputName; - IniFile[0] = '\0'; - ConfigFile[0] = '\0'; - PlaylistFile[0] = '\0'; - PlaylistHistoryFile[0] = '\0'; - MidiFileOpenDir[0] = '\0'; - ConfigFileOpenDir[0] = '\0'; - PlaylistFileOpenDir[0] = '\0'; - OutputName[0] = '\0'; - strcpy(DocFileExt,DEFAULT_DOCFILEEXT); - S_wrdt_open_opts[0] = '\0'; - strcpy(SystemFont,"‚l‚r –¾’©"); - strcpy(PlayerFont,"‚l‚r –¾’©"); - strcpy(WrdFont,"‚l‚r –¾’©"); - strcpy(DocFont,"‚l‚r –¾’©"); - strcpy(ListFont,"‚l‚r –¾’©"); - strcpy(TracerFont,"‚l‚r –¾’©"); - - if(GetModuleFileName(hInst, buffer, MAXPATH)){ - if((p=strrchr(buffer,'\\'))!=NULL){ - p++; - *p = '\0'; - } else { - buffer[0] = '.'; - buffer[1] = '\\'; - buffer[2] = '\0'; - } - } else { - buffer[0] = '.'; - buffer[1] = '\\'; - buffer[2] = '\0'; - } - strncpy(IniFile,buffer,MAXPATH); - IniFile[MAXPATH] = '\0'; - strcat(IniFile,"timpp32g.ini"); - -// strncpy(ConfigFile,buffer,MAXPATH); -// ConfigFile[MAXPATH] = '\0'; -// strcat(ConfigFile,"timidity.cfg"); + IniFile[0] = '\0'; + ConfigFile[0] = '\0'; + PlaylistFile[0] = '\0'; + PlaylistHistoryFile[0] = '\0'; + MidiFileOpenDir[0] = '\0'; + ConfigFileOpenDir[0] = '\0'; + PlaylistFileOpenDir[0] = '\0'; + OutputName[0] = '\0'; + strcpy(DocFileExt,DEFAULT_DOCFILEEXT); + strcpy(SystemFont,"‚l‚r –¾’©"); + strcpy(PlayerFont,"‚l‚r –¾’©"); + strcpy(WrdFont,"‚l‚r –¾’©"); + strcpy(DocFont,"‚l‚r –¾’©"); + strcpy(ListFont,"‚l‚r –¾’©"); + strcpy(TracerFont,"‚l‚r –¾’©"); - strcpy(ConfigFile, "\\WINDOWS\\TIMIDITY.CFG"); + if(GetModuleFileName(hInst, buffer, MAXPATH)) + { + if((p = strrchr(buffer, '\\')) != NULL) + { + p++; + *p = '\0'; + } + else + { + buffer[0] = '.'; + buffer[1] = '\\'; + buffer[2] = '\0'; + } + } + else + { + buffer[0] = '.'; + buffer[1] = '\\'; + buffer[2] = '\0'; + } + strncpy(IniFile, buffer, MAXPATH); + IniFile[MAXPATH] = '\0'; + strcat(IniFile,"timpp32g.ini"); -// printf("## IniFile: \"%s\"\n", IniFile); -// printf("## ConfigFile: \"%s\"\n", ConfigFile); + strcpy(ConfigFile, W32G_TIMIDITY_CFG); - st_default = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); - sp_default = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); - st_current = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); - sp_current = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); - st_temp = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); - sp_temp = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); + st_default = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); + sp_default = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); + st_current = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); + sp_current = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); + st_temp = (SETTING_TIMIDITY *)safe_malloc(sizeof(SETTING_TIMIDITY)); + sp_temp = (SETTING_PLAYER *)safe_malloc(sizeof(SETTING_PLAYER)); + + SaveSettingPlayer(sp_current); + SaveSettingTiMidity(st_current); + if(IniVersionCheck()) + { + LoadIniFile(sp_current, st_current); + ApplySettingPlayer(sp_current); + ApplySettingTiMidity(st_current); + w32g_has_ini_file = 1; + } + else + { + sprintf(buffer, +"Ini file is not found, or old format is found.\n" +"Do you initialize ini file?\n\n" +"Ini file path: %s", + IniFile); + + if(MessageBox(0, buffer, "TiMidity Notice", MB_YESNO) == IDYES) + { + SaveIniFile(sp_current, st_current); + w32g_has_ini_file = 1; + } + else + w32g_has_ini_file = 0; + } + + memcpy(sp_default, sp_current, sizeof(SETTING_PLAYER)); + memcpy(st_default, st_current, sizeof(SETTING_TIMIDITY)); + } -extern int set_wrd(char *w); -extern char *wrdt_open_opts; -extern CRITICAL_SECTION critSect; -extern char *def_instr_name; +int IniVersionCheck(void) +{ + char version[INI_MAXLEN]; + if(IniGetKeyStringN(INI_SEC_PLAYER,"IniVersion",version,sizeof(version)) == 0 && + strcmp(version, IniVersion) == 0) + return 1; // UnChanged + return 0; +} +void BitBltRect(HDC dst, HDC src, RECT *rc) +{ + BitBlt(dst, rc->left, rc->top, + rc->right - rc->left, rc->bottom - rc->top, + src, rc->left, rc->top, SRCCOPY); +} -static int InitializeCriticalSectionDone = 0; +/* + * TmColor + */ +TmColors tm_colors[TMCC_SIZE]; -void -w32g_init_ctl(void) +static COLORREF WeakHalfColor(COLORREF fc, COLORREF bc) { - int need_stdin = 0, need_stdout = 0; - ctl->open(need_stdin, need_stdout); - if(wrdt->open(wrdt_open_opts)){ -#ifdef W32GUI_DEBUG - PrintfDebugWnd - ("Couldn't open WRD Tracer: %s (`%c')" NLS,wrdt->name, wrdt->id); -#endif /* W32GUI_DEBUG */ - set_wrd("-"); - wrdt->open(wrdt_open_opts); - } - - /* - if(!control_ratio){ - control_ratio = play_mode->rate / CONTROLS_PER_SECOND; - if(control_ratio < 1) - control_ratio = 1; - else if (control_ratio > MAX_CONTROL_RATIO) - control_ratio = MAX_CONTROL_RATIO; - } - */ + return fc*1/3 + bc*2/3; +} + +static COLORREF HalfColor(COLORREF fc, COLORREF bc) +{ + return fc*1/6 + bc*5/6; +} + +void TmInitColor(void) +{ + int i; - init_load_soundfont(); - if(allocate_cache_size > 0) - resamp_cache_reset(); - - if(def_instr_name && *def_instr_name) - set_default_instrument(def_instr_name); - - // SetConsoleCtrlHandler (handler, TRUE); - InitializeCriticalSection (&critSect); - InitializeCriticalSectionDone = 1; + tm_colors[TMCC_BLACK].color = TMCCC_BLACK; + tm_colors[TMCC_WHITE].color = TMCCC_WHITE; + tm_colors[TMCC_RED].color = TMCCC_RED; + tm_colors[TMCC_BACK].color = TMCCC_BACK; + tm_colors[TMCC_LOW].color = TMCCC_LOW; + tm_colors[TMCC_MIDDLE].color= TMCCC_MIDDLE; + tm_colors[TMCC_HIGH].color = TMCCC_HIGH; - trace_nodelay(!ctl->trace_playing); + tm_colors[TMCC_FORE_HALF].color = HalfColor(TMCCC_FORE,TMCCC_BACK); + tm_colors[TMCC_FORE_WEAKHALF].color = WeakHalfColor(TMCCC_FORE,TMCCC_BACK); + tm_colors[TMCC_LOW_HALF].color = HalfColor(TMCCC_LOW,TMCCC_BACK); + tm_colors[TMCC_MIDDLE_HALF].color = HalfColor(TMCCC_MIDDLE,TMCCC_BACK); + tm_colors[TMCC_HIGH_HALF].color = HalfColor(TMCCC_HIGH,TMCCC_BACK); + + for(i = 0; i < TMCC_SIZE; i++) + { + tm_colors[i].pen = CreatePen(PS_SOLID, 1, tm_colors[i].color); + tm_colors[i].brush = CreateSolidBrush(tm_colors[i].color); + } } -void -w32g_reset_ctl(void) +void TmFreeColor(void) { - int need_stdin = 0, need_stdout = 0; - - play_mode->close_output(); - ctl->close(); - wrdt->close(); - - ctl->open(need_stdin, need_stdout); - if(wrdt->open(wrdt_open_opts)){ -#ifdef W32GUI_DEBUG - PrintfDebugWnd - ("Couldn't open WRD Tracer: %s (`%c')" NLS, wrdt->name, wrdt->id); -#endif /* W32GUI_DEBUG */ - set_wrd("-"); - wrdt->open(wrdt_open_opts); - } + int i; + for(i = 0; i < TMCC_SIZE; i++) + { + if(tm_colors[i].pen != NULL) + { + DeleteObject(tm_colors[i].pen); + DeleteObject(tm_colors[i].brush); + tm_colors[i].pen = NULL; + } + } } -void -w32g_finish_ctl(void) +void TmFillRect(HDC hdc, RECT *rc, int color) { - play_mode->close_output(); - ctl->close(); - wrdt->close(); -#if defined(__W32__) - if(InitializeCriticalSectionDone){ - DeleteCriticalSection (&critSect); - InitializeCriticalSectionDone = 0; - } + HPEN hPen = tm_colors[color].pen; + HBRUSH hBrush = tm_colors[color].brush; + HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; + + hgdiobj_hpen = SelectObject(hdc, hPen); + hgdiobj_hbrush = SelectObject(hdc, hBrush); + Rectangle(hdc, rc->left, rc->top, rc->right, rc->bottom); + SelectObject(hdc, hgdiobj_hpen); + SelectObject(hdc, hgdiobj_hbrush); +} + +int is_directory(char *path) +{ +#if defined(__CYGWIN32__) || defined(__MINGW32__) + struct stat st; + if(stat(path, &st) != -1) + return S_ISDIR(st.st_mode); #endif + return GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY; +} + +int directory_form(char *buffer) +{ + int len; + + len = strlen(buffer); + + if(buffer[len - 1] == PATH_SEP) + len--; +#if defined(__CYGWIN32__) || defined(__MINGW32__) + else if(buffer[len - 1] == '/') + len--; +#endif + buffer[len++] = PATH_SEP; + buffer[len] = '\0'; + return 1; } diff -ruN TiMidity++-2.2.0/interface/w32g_utl.h TiMidity++-2.3.0/interface/w32g_utl.h --- TiMidity++-2.2.0/interface/w32g_utl.h Wed Mar 24 01:59:53 1999 +++ TiMidity++-2.3.0/interface/w32g_utl.h Sat Jul 31 15:14:42 1999 @@ -1,26 +1,8 @@ #ifndef ___W32G_UTL_H_ #define ___W32G_UTL_H_ -// playlist -#define PLAYLIST_DATAMAX 512 -typedef volatile struct PLAYLIST_ { - volatile struct PLAYLIST_ *prev; - volatile struct PLAYLIST_ *next; - volatile char filename[PLAYLIST_DATAMAX+1]; - volatile char title[PLAYLIST_DATAMAX+1]; - volatile int opt; -} PLAYLIST; - -#define prev_playlist(x) ((x)->prev) -#define next_playlist(x) ((x)->next) -#define proceed_playlist(x) { (x) = (x)->next; } -#define back_playlist(x) { (x) = (x)->prev; } - -// misc tools -#define LotationBufferMAX 1024 - - // ini & config +#define IniVersion "2.0" typedef struct SETTING_PLAYER_ { // Main Window int InitMinimizeFlag; @@ -50,12 +32,8 @@ char ConfigFileOpenDir[MAXPATH + 32]; char PlaylistFileOpenDir[MAXPATH + 32]; // Thread Priority - int ProcessPriority; int PlayerThreadPriority; - int MidiPlayerThreadPriority; - int MainThreadPriority; - int TracerThreadPriority; - int WrdThreadPriority; + int GUIThreadPriority; // Font char SystemFont[256]; char PlayerFont[256]; @@ -78,167 +56,74 @@ } SETTING_PLAYER; typedef struct SETTING_TIMIDITY_ { - int free_instruments_afterwards; // U : 0 or 1 - // L : pathlist - // c : configfile - ChannelBitMask quietchannels; // Q : set_channel_flag() - int effect_lr_mode; // b : 0,1,2,-1 - int effect_lr_delay_msec; // > 0 - - ChannelBitMask drumchannels; // D : set_channel_flag() - ChannelBitMask drumchannel_mask; - ChannelBitMask default_drumchannels; // D : set_channel_flag() - ChannelBitMask default_drumchannel_mask; - // d : dynamic lib - // O : set_play_mode() - char play_mode_id_character; - int play_mode_encoding; - // PE_ULAW, PE_ALAW, PE_16BIT, PE_MONO, PE_SIGNED, PE_BYTESWAP - // case 'U': /* uLaw */ - // pmp->encoding |= PE_ULAW; - // pmp->encoding &= ~(PE_ALAW|PE_16BIT); - // break; - // case 'A': /* aLaw */ - // pmp->encoding |= PE_ALAW; - // pmp->encoding &= ~(PE_ULAW|PE_16BIT); - // break; - // case 'l': /* linear */ - // pmp->encoding &= ~(PE_ULAW|PE_ALAW); - // break; - // case '1': /* 1 for 16-bit */ - // pmp->encoding |= PE_16BIT; - // pmp->encoding &= ~(PE_ULAW|PE_ALAW); - // break; - // case '8': pmp->encoding &= ~PE_16BIT; break; - // case 'M': pmp->encoding |= PE_MONO; break; - // case 'S': pmp->encoding &= ~PE_MONO; break; /* stereo */ - // case 's': pmp->encoding |= PE_SIGNED; break; - // case 'u': pmp->encoding &= ~PE_SIGNED; break; - // case 'x': pmp->encoding ^= PE_BYTESWAP; break; /* toggle */ - //--------------------------------- - // 8-bit sample width - // 16-bit sample width - // 8-bit sample & U-Law encoding - // 8-bit sample & A-Law encoding - // 8-bit sample & linear encoding - // 16-bit sample & linear encoding - //--------------------------------- - // `8' 8-bit sample width - // `1' 16-bit sample width - //--------------------------------- - // `U' U-Law encoding - // `A' A-Law encoding - // `l' linear encoding - //--------------------------------- - // `M' monophonic - // `S' stereo - //--------------------------------- - // `s' signed output - // `u' unsigned output - // `x' byte-swapped output - //--------------------------------- - char pmp_id_character; // id_character - // -Od Win32 audio driver - // -Ow RIFF WAVE file - // -Or raw waveform data - // -Ou Sun audio file - // -Oa AIFF file - // pmp->id_character, pmp->id_name - char OutputName[MAXPATH + 32]; // o : string - int antialiasing_allowed; // a : 0,1 - int fast_decay; // f : 0,1 - int adjust_panning_immediately; // F : 0,1 - int output_rate; // s : -// if x < 100 then x = x * 1000.0 + 0.5 -// set_value(&opt_output_rate, x , MIN_OUTPUT_RATE,MAX_OUTPUT_RATE, -// "Resampling frequency"); -// P : set overriding instrument - int default_program[MAX_CHANNELS]; -// I : set_default_prog() - int32 amplification; // A : -// set_value(&lification, x , 0, MAX_AMPLIFICATION, -// "Amplification"); - int32 control_ratio; // C : -// set_value(&control_ratio, atoi(optarg), 1, MAX_CONTROL_RATIO, -// "Control ratio"); - int voices; // p : -// set_value(&tmpi32, atoi(optarg), 1, MAX_VOICES, "Polyphony"); - int32 modify_release; // R : -// set_value(&modify_release, tmpi32, 0, MRELS - 1, "Modify Release"); -// modify_release++; - int view_soundspec_flag; // g : 0,1 - double spectrogram_update_sec; -// atof(x) - int32 allocate_cache_size; // S : - char allocate_chace_size_string[64]; -// ???[kK] -> x * 1024.0 -// ???[M] -> x * 1024.0 * 1024.0 - int ctl_verbosity; // cmp->verbosity - char ctl_id_character; // cmp->id_character - int ctl_trace_playing; // cmp->trace_playing -// i : set_ctl() - int buffer_fragments; // B : -// set_value(&tmpi32, x, 0, 1000, "Buffer fragments"); -// must be >=3 - char output_text_code[64]; // t : must be "noconv" or "sjis" -// E : set_extensin_modes() - int opt_modulation_wheel; // w/W : - int opt_portamento; // p/P - int opt_nrpn_vibrato; // v/V - int opt_reverb_control; // r/R - int opt_chorus_control; // c/C - int opt_chorus_control2[MAX_CHANNELS]; -// case 'c': -// if('0' <= *(flag + 1) && *(flag + 1) <= '9') -// { -// opt_chorus_control = (atoi(flag + 1) & 0x7f); -// while('0' <= *(flag + 1) && *(flag + 1) <= '9') -// flag++; -// } -// else -// opt_chorus_control = 1; -// break; - int opt_channel_pressure; // s/S - int opt_trace_text_meta_event; // t/T - int opt_overlap_voice_allow; // o/O - int opt_default_mid; // mXX + // Parameter from command line options. - /* FIXME?? int[]?? */ -#if 1 - int opt_default_mid_str[64]; -#else - char opt_default_mid_str[64]; + int32 amplification; // A + int antialiasing_allowed; // a + int buffer_fragments; // B + int32 control_ratio; // C + // c (ignore) + ChannelBitMask default_drumchannels, default_drumchannel_mask; // D + // d (ignore) + + // E... + int opt_modulation_wheel; // E w/W + int opt_portamento; // E p/P + int opt_nrpn_vibrato; // E v/V + int opt_channel_pressure; // E s/S + int opt_trace_text_meta_event; // E t/T + int opt_overlap_voice_allow;// E o/O + int opt_default_mid; // E mXX + int default_tonebank; // E b + int special_tonebank; // E B + int effect_lr_mode; // E Fdelay + int effect_lr_delay_msec; // E Fdelay + int opt_reverb_control; // E Freverb + int opt_chorus_control; // E Fchorus + int noise_sharp_type; // E Fns + + int opt_evil_mode; // e + int adjust_panning_immediately; // F + int fast_decay; // f +#ifdef SUPPORT_SOUNDSPEC + int view_soundspec_flag; // g + double spectrogram_update_sec; // g #endif - -// if(strcmp(flag + 1, "gs") == 0 || -// strcmp(flag + 1, "GS") == 0) -// val = 0x41; -// else if(strcmp(flag + 1, "xg") == 0 || -// strcmp(flag + 1, "XG") == 0) -// val = 0x43; -// else if(strcmp(flag + 1, "gm") == 0 || -// strcmp(flag + 1, "GM") == 0) -// val = 0x7e; - int default_tonebank; // b - int special_tonebank; // B : -1 or XX - int opt_realtime_playing; // j : 0,1 - // w : set_win_modes() - int opt_rcpcv_dll; - // W : set_wrd() must be '-' or 'W' - char wrdt_id; - char wrdt_open_opts[64]; - // h : help - int noise_sharp_type; // n : 0,1,2,3,4 + // h (ignore) + int default_program[MAX_CHANNELS]; // I + char opt_ctl[16]; // i + int opt_realtime_playing; // j + int reduce_voice_threshold; // k + // L (ignore) + char opt_playmode[16]; // O + char OutputName[MAXPATH + 32]; // o : string + // P (ignore) + int voices; // p + ChannelBitMask quietchannels; // Q + char opt_qsize[16]; // q + int32 modify_release; // R + int32 allocate_cache_size; // S + int output_rate; // s + char output_text_code[16]; // t + int free_instruments_afterwards; // U + char opt_wrd[16]; // W +#if defined(__W32__) && defined(SMFCONV) + int opt_rcpcv_dll; // wr, wR +#endif + // x (ignore) + // Z (ignore) } SETTING_TIMIDITY; extern char *OutputName; -void LoadIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st); -void SaveIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st); +extern void LoadIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st); +extern void SaveIniFile(SETTING_PLAYER *sp, SETTING_TIMIDITY *st); extern SETTING_PLAYER *sp_default, *sp_current, *sp_temp; extern SETTING_TIMIDITY *st_default, *st_current, *st_temp; - +extern CHAR *INI_INVALID; +extern CHAR *INI_SEC_PLAYER; +extern CHAR *INI_SEC_TIMIDITY; extern char *SystemFont; extern char *PlayerFont; extern char *WrdFont; @@ -258,58 +143,35 @@ extern int ListFontSize; extern int TracerFontSize; - -/* Auto-generated by hh2h.rb script from this line. */ - -PLAYLIST * new_playlist(void); -PLAYLIST * del_playlist(PLAYLIST *playlist); -void del_all_playlist(PLAYLIST *playlist); -PLAYLIST * first_playlist(PLAYLIST *playlist); -PLAYLIST * last_playlist(PLAYLIST *playlist); -PLAYLIST * insert_playlist(PLAYLIST *playlist, PLAYLIST *prev, PLAYLIST *next); -void prev_insert_playlist(PLAYLIST *p1, PLAYLIST *p2); -void next_insert_playlist(PLAYLIST *p1, PLAYLIST *p2); -void first_insert_playlist(PLAYLIST *p1, PLAYLIST *p2); -void last_insert_playlist(PLAYLIST *p1, PLAYLIST *p2); -PLAYLIST * last_insert_playlist_filename(PLAYLIST *playlist, char *filename); -PLAYLIST * first_insert_playlist_filename(PLAYLIST *playlist, char *filename); -PLAYLIST * dup_a_playlist_merely(PLAYLIST *playlist); -PLAYLIST * dup_a_playlist(PLAYLIST *playlist); -PLAYLIST * dup_playlist(PLAYLIST *playlist); -void reverse_playlist(PLAYLIST *playlist); -int num_before_playlist(PLAYLIST *pl); -int num_after_playlist(PLAYLIST *pl); -int num_with_playlist(PLAYLIST *pl); -int isinteger(char *str); -char * GetLotationBuffer(void); -int IniGetKeyInt32(char *section, char *key,int32 *n); -int IniGetKeyInt32Array(char *section, char *key, int32 *n, int arraysize); -int IniGetKeyInt(char *section, char *key, int *n); -int IniGetKeyChar(char *section, char *key, char *c); -int IniGetKeyIntArray(char *section, char *key, int *n, int arraysize); -int IniGetKeyString(char *section, char *key,char *str); -int IniGetKeyStringN(char *section, char *key,char *str, int size); -int IniGetKeyFloat(char *section, char *key, FLOAT_T *n); -int IniPutKeyInt32(char *section, char *key,int32 *n); -int IniPutKeyInt32Array(char *section, char *key, int32 *n, int arraysize); -int IniPutKeyInt(char *section, char *key, int *n); -int IniPutKeyChar(char *section, char *key, char *c); -int IniPutKeyIntArray(char *section, char *key, int *n, int arraysize); -int IniPutKeyString(char *section, char *key, char *str); -int IniPutKeyStringN(char *section, char *key, char *str, int size); -int IniPutKeyFloat(char *section, char *key, FLOAT_T n); -int SetFlag(int flag); -long SetValue(int32 value, int32 min, int32 max); -void ApplySettingPlayer(SETTING_PLAYER *sp); -void SaveSettingPlayer(SETTING_PLAYER *sp); -void ApplySettingTimidity(SETTING_TIMIDITY *st); -void SaveSettingTimidity(SETTING_TIMIDITY *st); -void w32g_initialize(void); -void w32g_init_ctl(void); -void w32g_reset_ctl(void); -void w32g_finish_ctl(void); - -/* Auto-generated by hh2h.rb script to this line. */ - +extern int IniGetKeyInt32(char *section, char *key,int32 *n); +extern int IniGetKeyInt32Array(char *section, char *key, int32 *n, int arraysize); +extern int IniGetKeyInt(char *section, char *key, int *n); +extern int IniGetKeyChar(char *section, char *key, char *c); +extern int IniGetKeyIntArray(char *section, char *key, int *n, int arraysize); +extern int IniGetKeyString(char *section, char *key,char *str); +extern int IniGetKeyStringN(char *section, char *key,char *str, int size); +extern int IniGetKeyFloat(char *section, char *key, FLOAT_T *n); +extern int IniPutKeyInt32(char *section, char *key,int32 *n); +extern int IniPutKeyInt32Array(char *section, char *key, int32 *n, int arraysize); +extern int IniPutKeyInt(char *section, char *key, int *n); +extern int IniPutKeyChar(char *section, char *key, char *c); +extern int IniPutKeyIntArray(char *section, char *key, int *n, int arraysize); +extern int IniPutKeyString(char *section, char *key, char *str); +extern int IniPutKeyStringN(char *section, char *key, char *str, int size); +extern int IniPutKeyFloat(char *section, char *key, FLOAT_T n); +extern void ApplySettingPlayer(SETTING_PLAYER *sp); +extern void SaveSettingPlayer(SETTING_PLAYER *sp); +extern void ApplySettingTiMidity(SETTING_TIMIDITY *st); +extern void SaveSettingTiMidity(SETTING_TIMIDITY *st); +extern int IniVersionCheck(void); +extern void BitBltRect(HDC dst, HDC src, RECT *rc); +extern TmColors tm_colors[ /* TMCC_SIZE */ ]; +#define TmCc(c) (tm_colors[c].color) +extern void TmInitColor(void); +extern void TmFreeColor(void); +extern void TmFillRect(HDC hdc, RECT *rc, int color); +extern void w32g_initialize(void); +extern int is_directory(char *path); +extern int directory_form(char *path_in_out); #endif /* ___W32G_UTL_H_ */ diff -ruN TiMidity++-2.2.0/timidity/Makefile.in TiMidity++-2.3.0/timidity/Makefile.in --- TiMidity++-2.2.0/timidity/Makefile.in Mon Jul 19 13:12:01 1999 +++ TiMidity++-2.3.0/timidity/Makefile.in Sun Aug 1 03:45:04 1999 @@ -283,8 +283,6 @@ ../utils/strtab.h controls.o: controls.c ../config.h ../interface.h timidity.h \ ../utils/support.h controls.h -dl_dlopen.o: dl_dlopen.c ../config.h timidity.h ../utils/support.h \ - dlutils.h effect.o: effect.c ../config.h timidity.h ../utils/support.h instrum.h \ playmidi.h output.h reverb.h filter.o: filter.c ../config.h timidity.h ../utils/support.h common.h \ diff -ruN TiMidity++-2.2.0/timidity/aiff_a.c TiMidity++-2.3.0/timidity/aiff_a.c --- TiMidity++-2.2.0/timidity/aiff_a.c Mon Mar 1 21:14:18 1999 +++ TiMidity++-2.3.0/timidity/aiff_a.c Fri Jul 30 23:04:16 1999 @@ -326,6 +326,11 @@ static int acntl(int request, void *arg) { + switch(request) + { + case PM_REQ_DISCARD: + return 0; + } return -1; } diff -ruN TiMidity++-2.2.0/timidity/aq.c TiMidity++-2.3.0/timidity/aq.c --- TiMidity++-2.2.0/timidity/aq.c Sat Jul 17 17:47:12 1999 +++ TiMidity++-2.3.0/timidity/aq.c Sat Jul 31 13:40:08 1999 @@ -132,7 +132,16 @@ bucket_size, (int)(bucket_time * 1000 + 0.5)); } else + { device_qsize = 0; + if(base_buckets) + { + free(base_buckets[0].data); + free(base_buckets); + base_buckets = NULL; + } + nbuckets = 0; + } init_effect(); aq_add_count = 0; @@ -302,31 +311,31 @@ if(!ctl->trace_playing) { - while(head) /* Flush remain buckets. */ - if(aq_fill_one() == -1) - return -1; - return aq_output_data(buff, nbytes); - } - - trace_loop(); - - while(1) - { - i = add_play_bucket(buff, nbytes); - if(i < nbytes) + while((i = add_play_bucket(buff, nbytes)) < nbytes) { buff += i; nbytes -= i; - aq_wait_ticks(); - trace_loop(); - if(aq_fill_nonblocking() == -1) + if(aq_fill_one() == -1) return -1; aq_fill_buffer_flag = 0; - continue; } - break; + return 0; } + trace_loop(); + while((i = add_play_bucket(buff, nbytes)) < nbytes) + { + /* Software buffer is full. + * Write one bucket to audio device. + */ + buff += i; + nbytes -= i; + aq_wait_ticks(); + trace_loop(); + if(aq_fill_nonblocking() == -1) + return -1; + aq_fill_buffer_flag = 0; + } return 0; } @@ -379,7 +388,6 @@ return 0; nfills = (aq_fillable() * Bps) / bucket_size; - for(i = 0; i < nfills; i++) { if(head == NULL || head->len != bucket_size) diff -ruN TiMidity++-2.2.0/timidity/au_a.c TiMidity++-2.3.0/timidity/au_a.c --- TiMidity++-2.2.0/timidity/au_a.c Mon Mar 1 21:27:24 1999 +++ TiMidity++-2.3.0/timidity/au_a.c Fri Jul 30 23:04:08 1999 @@ -274,5 +274,10 @@ static int acntl(int request, void *arg) { + switch(request) + { + case PM_REQ_DISCARD: + return 0; + } return -1; } diff -ruN TiMidity++-2.2.0/timidity/common.c TiMidity++-2.3.0/timidity/common.c --- TiMidity++-2.2.0/timidity/common.c Sun Jul 18 02:06:15 1999 +++ TiMidity++-2.3.0/timidity/common.c Sun Aug 1 00:36:00 1999 @@ -62,7 +62,7 @@ char *program_name, current_filename[1024]; MBlockList tmpbuffer; ArchiveFileList *archive_file_list = NULL; -char *output_text_code = OUTPUT_TEXT_CODE; +char *output_text_code = NULL; #ifdef DEFAULT_PATH /* The paths in this list will be tried whenever we're reading a file */ @@ -147,7 +147,7 @@ tf->tmpname = NULL; len = strlen(name); - if(decompress && len >= 3 && strcmp(name + len - 3, ".gz") == 0) + if(decompress && len >= 3 && strcasecmp(name + len - 3, ".gz") == 0) { int method; diff -ruN TiMidity++-2.2.0/timidity/controls.c TiMidity++-2.3.0/timidity/controls.c --- TiMidity++-2.2.0/timidity/controls.c Thu Apr 1 03:15:18 1999 +++ TiMidity++-2.3.0/timidity/controls.c Mon Jul 26 01:41:44 1999 @@ -29,9 +29,17 @@ #include "timidity.h" #include "controls.h" -#ifndef __MACOS__ -# define DEFAULT_CONTROL_MODE &dumb_control_mode -#endif /* __MACOS__ */ +#if defined(__MACOS__) +extern ControlMode mac_control_mode; +#define DEFAULT_CONTROL_MODE &mac_control_mode +#elif defined(IA_W32GUI) +extern ControlMode w32gui_control_mode; +#define DEFAULT_CONTROL_MODE &w32gui_control_mode +#else +extern ControlMode dumb_control_mode; +#define DEFAULT_CONTROL_MODE &dumb_control_mode +#endif + #ifdef IA_PLUGIN extern ControlMode plugin_control_mode; @@ -123,20 +131,6 @@ # define DEFAULT_CONTROL_MODE &plugin_control_mode # endif #endif - -#ifdef __MACOS__ - extern ControlMode mac_control_mode; - #ifndef DEFAULT_CONTROL_MODE - #define DEFAULT_CONTROL_MODE &mac_control_mode - #endif -#endif - -#ifdef IA_W32GUI - extern ControlMode w32gui_control_mode; -# ifndef DEFAULT_CONTROL_MODE -# define DEFAULT_CONTROL_MODE &w32gui_control_mode -# endif -#endif /* IA_W32GUI */ #ifdef IA_SERVER extern ControlMode server_control_mode; diff -ruN TiMidity++-2.2.0/timidity/controls.h TiMidity++-2.3.0/timidity/controls.h --- TiMidity++-2.2.0/timidity/controls.h Sat Mar 27 02:12:39 1999 +++ TiMidity++-2.3.0/timidity/controls.h Sat Jul 31 00:13:32 1999 @@ -25,7 +25,7 @@ #define RC_IS_SKIP_FILE(rc) ((rc) == RC_QUIT || (rc) == RC_LOAD_FILE || \ (rc) == RC_NEXT || (rc) == RC_REALLY_PREVIOUS || \ - (rc) == RC_ERROR) + (rc) == RC_ERROR || (rc) == RC_STOP) /* Return values for ControlMode.read */ #define RC_ERROR -1 @@ -60,6 +60,7 @@ #define RC_TOGGLE_CTL_SPEANA 27 #define RC_CHANGE_RATE 28 #define RC_OUTPUT_CHANGED 29 +#define RC_STOP 30 /* Stop to play */ #define CMSG_INFO 0 #define CMSG_WARNING 1 @@ -99,7 +100,8 @@ CTLE_LYRIC, /* v1:lyric-ID */ CTLE_REFRESH, CTLE_RESET, - CTLE_SPEANA /* v1:double[] v2:len */ + CTLE_SPEANA, /* v1:double[] v2:len */ + CTLE_PAUSE /* v1:pause on/off v2:time of pause */ }; typedef struct _CtlEvent { @@ -119,6 +121,8 @@ #define CTLF_LIST_LOOP (1u<<0) /* -i?l */ #define CTLF_LIST_RANDOM (1u<<1) /* -i?r */ #define CTLF_LIST_SORT (1u<<2) /* -i?s */ +#define CTLF_AUTOSTART (1u<<3) /* -i?a */ +#define CTLF_AUTOEXIT (1u<<4) /* -i?x */ int (*open)(int using_stdin, int using_stdout); void (*close)(void); diff -ruN TiMidity++-2.2.0/timidity/miditrace.c TiMidity++-2.3.0/timidity/miditrace.c --- TiMidity++-2.2.0/timidity/miditrace.c Sun Apr 4 23:15:47 1999 +++ TiMidity++-2.3.0/timidity/miditrace.c Sat Jul 31 20:11:42 1999 @@ -141,7 +141,7 @@ { MidiTraceList *p; - if(midi_trace.nodelay || node->start < 0) + if(!ctl->trace_playing || node->start < 0) { run_midi_trace(node); return NULL; @@ -239,7 +239,7 @@ if(midi_trace.head == NULL) return 0; - if((cur = current_trace_samples()) == -1) + if((cur = current_trace_samples()) == -1 || !ctl->trace_playing) cur = 0x7fffffff; /* apply all trace event */ ctl_update = 0; @@ -278,11 +278,6 @@ void trace_offset(int offset) { midi_trace.offset = offset; -} - -void trace_nodelay(int nodelay) -{ - midi_trace.nodelay = nodelay; } void trace_flush(void) diff -ruN TiMidity++-2.2.0/timidity/miditrace.h TiMidity++-2.3.0/timidity/miditrace.h --- TiMidity++-2.2.0/timidity/miditrace.h Thu Feb 18 12:28:36 1999 +++ TiMidity++-2.3.0/timidity/miditrace.h Thu Jul 29 14:52:14 1999 @@ -25,7 +25,6 @@ typedef struct _MidiTrace { - int nodelay; /* True if run immediately */ int offset; /* sample offset */ int flush_flag; /* True while in trace_flush() */ diff -ruN TiMidity++-2.2.0/timidity/playmidi.c TiMidity++-2.3.0/timidity/playmidi.c --- TiMidity++-2.2.0/timidity/playmidi.c Sat Jul 17 14:00:00 1999 +++ TiMidity++-2.3.0/timidity/playmidi.c Sun Aug 1 01:55:18 1999 @@ -34,16 +34,13 @@ #include #endif #include - -#include "timidity.h" - -#ifndef __W32__ -#include -#else +#ifdef __W32__ #include -extern VOLATILE int intr; -#endif /* __W32__ */ - +#endif +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ +#include "timidity.h" #include "common.h" #include "instrum.h" #include "playmidi.h" @@ -58,6 +55,8 @@ #include "wrd.h" #include "aq.h" +extern VOLATILE int intr; + #ifdef SOLARIS /* shut gcc warning up */ int usleep(unsigned int useconds); @@ -85,6 +84,10 @@ #ifdef REDUCE_VOICE_TIME_TUNING static int max_good_nv = 1; static int min_bad_nv = 256; +static int32 ok_nv_total = 32; +static int32 ok_nv_counts = 1; +static int32 ok_nv_sample = 0; +static int ok_nv = 32; static int old_rate = -1; #endif @@ -100,7 +103,7 @@ int special_tonebank = -1; int default_tonebank = 0; int playmidi_seek_flag = 0; -static int play_pause_flag = 0; +int play_pause_flag = 0; static int file_from_stdin; static void set_reverb_level(int ch, int level); @@ -165,6 +168,7 @@ ChannelBitMask drumchannel_mask; ChannelBitMask drumchannels; int adjust_panning_immediately=0; +int auto_reduce_polyphony=1; double envelope_modify_rate = 1.0; static int32 lost_notes, cut_notes; @@ -186,6 +190,7 @@ static void update_rpn_map(int ch, int addr, int update_now); static void ctl_prog_event(int ch); static void ctl_timestamp(void); +static void ctl_pause_event(int pause, int32 samples); static char *event_name(int type) { @@ -676,29 +681,267 @@ return ip; } -static int reduce_voice(void) +/* The goal of this routine is to free as much CPU as possible without + loosing too much sound quality. We would like to know how long a note + has been playing, but since we usually can't calculate this, we guess at + the value instead. A bad guess is better than nothing. Notes which + have been playing a short amount of time are killed first. This causes + decays and notes to be cut earlier, saving more CPU time. It also causes + notes which are closer to ending not to be cut as often, so it cuts + a different note instead and saves more CPU in the long run. ON voices + are treated a little differently, since sound quality is more important + than saving CPU at this point. Duration guesses for loop regions are very + crude, but are still better than nothing, they DO help. Non-looping ON + notes are cut before looping ON notes. Since a looping ON note is more + likely to have been playing for a long time, we want to keep it because it + sounds better to keep long notes. +*/ +static int reduce_voice_CPU(void) { int32 lv, v, vr; int i, j, lowest=-0x7FFFFFFF; + int32 duration; i = upper_voices; lv = 0x7FFFFFFF; + /* Look for the decaying note with the longest remaining decay time */ /* Protect drum decays. They do not take as much CPU (?) and truncating them early sounds bad, especially on snares and cymbals */ - /* Also look for chorus notes */ for(j = 0; j < i; j++) { - if(voice[j].status & VOICE_FREE) + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) continue; - if (!voice[j].delay && ISDRUMCHANNEL(voice[j].channel)) + /* skip notes that don't need resampling (most drums) */ + if (!voice[j].sample->sample_rate) continue; - if(voice[j].status & ~(VOICE_ON | VOICE_DIE | VOICE_SUSTAINED) || - voice[j].delay) + if(voice[j].status & ~(VOICE_ON | VOICE_DIE | VOICE_SUSTAINED)) { /* Choose note with longest decay time remaining */ /* This frees more CPU than choosing lowest volume */ - v = current_sample - voice[j].timeout; + if (!voice[j].envelope_increment) duration = 0; + else duration = + (voice[j].envelope_target - voice[j].envelope_volume) / + voice[j].envelope_increment; + v = -duration; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -0x7FFFFFFF) + { + /* This can still cause a click, but if we had a free voice to + spare for ramping down this note, we wouldn't need to kill it + in the first place... Still, this needs to be fixed. Perhaps + we could use a reserve of voices to play dying notes only. */ + + cut_notes++; + return lowest; + } + + /* try to remove VOICE_DIE before VOICE_ON */ + lv = 0x7FFFFFFF; + lowest = -1; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) + continue; + if(voice[j].status & ~(VOICE_ON | VOICE_SUSTAINED)) + { + /* continue protecting non-resample decays */ + if (voice[j].status & ~(VOICE_DIE) && !voice[j].sample->sample_rate) + continue; + + /* choose note which has been on the shortest amount of time */ + /* this is a VERY crude estimate... */ + if (voice[j].sample->modes & MODES_LOOPING) + duration = voice[j].sample_offset - voice[j].sample->loop_start; + else + duration = voice[j].sample_offset; + if (voice[j].sample_increment > 0) + duration /= voice[j].sample_increment; + v = duration; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -1) + { + cut_notes++; + return lowest; + } + + /* try to remove VOICE_SUSTAINED before VOICE_ON */ + lv = 0x7FFFFFFF; + lowest = -0x7FFFFFFF; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) + continue; + if(voice[j].status & VOICE_SUSTAINED) + { + /* choose note which has been on the shortest amount of time */ + /* this is a VERY crude estimate... */ + if (voice[j].sample->modes & MODES_LOOPING) + duration = voice[j].sample_offset - voice[j].sample->loop_start; + else + duration = voice[j].sample_offset; + if (voice[j].sample_increment > 0) + duration /= voice[j].sample_increment; + v = duration; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -0x7FFFFFFF) + { + cut_notes++; + return lowest; + } + + /* try to remove chorus before VOICE_ON */ + lv = 0x7FFFFFFF; + lowest = -0x7FFFFFFF; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) + continue; + if(voice[j].delay) + { + /* score notes based on both volume AND duration */ + /* this scoring function needs some more tweaking... */ + if (voice[j].sample->modes & MODES_LOOPING) + duration = voice[j].sample_offset - voice[j].sample->loop_start; + else + duration = voice[j].sample_offset; + if (voice[j].sample_increment > 0) + duration /= voice[j].sample_increment; + v = voice[j].left_mix * duration; + vr = voice[j].right_mix * duration; + if(voice[j].panned == PANNED_MYSTERY && vr > v) + v = vr; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -0x7FFFFFFF) + { + int low_channel, low_note; + + cut_notes++; + + /* hack - double volume of chorus partner */ + low_channel = voice[lowest].channel; + low_note = voice[lowest].note; + for (j = 0; j < i; j++) { + if (voice[j].status & VOICE_FREE) continue; + if (voice[j].channel == low_channel && + voice[j].note == low_note && + j != lowest) { + voice[j].left_mix <<= 1; + voice[j].right_mix <<= 1; + break; + } + } + + return lowest; + } + + lost_notes++; + + /* try to remove non-looping voices first */ + lv = 0x7FFFFFFF; + lowest = -0x7FFFFFFF; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) + continue; + if(voice[j].sample->modes & ~MODES_LOOPING) + { + /* score notes based on both volume AND duration */ + /* this scoring function needs some more tweaking... */ + duration = voice[j].sample_offset; + if (voice[j].sample_increment > 0) + duration /= voice[j].sample_increment; + v = voice[j].left_mix * duration; + vr = voice[j].right_mix * duration; + if(voice[j].panned == PANNED_MYSTERY && vr > v) + v = vr; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -0x7FFFFFFF) + { + return lowest; + } + + lv = 0x7FFFFFFF; + lowest = 0; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) + continue; + if (voice[j].sample->modes & ~MODES_LOOPING) continue; + + /* score notes based on both volume AND duration */ + /* this scoring function needs some more tweaking... */ + duration = voice[j].sample_offset - voice[j].sample->loop_start; + if (voice[j].sample_increment > 0) + duration /= voice[j].sample_increment; + v = voice[j].left_mix * duration; + vr = voice[j].right_mix * duration; + if(voice[j].panned == PANNED_MYSTERY && vr > v) + v = vr; + if(v < lv) + { + lv = v; + lowest = j; + } + } + + return lowest; +} + +/* this reduces voices while maintaining sound quality */ +static int reduce_voice(void) +{ + int32 lv, v; + int i, j, lowest=-0x7FFFFFFF; + + i = upper_voices; + lv = 0x7FFFFFFF; + + /* Look for the decaying note with the smallest volume */ + /* Protect drum decays. Truncating them early sounds bad, especially on + snares and cymbals */ + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || + (!voice[j].sample->sample_rate && ISDRUMCHANNEL(voice[j].channel))) + continue; + + if(voice[j].status & ~(VOICE_ON | VOICE_DIE | VOICE_SUSTAINED)) + { + /* find lowest volume */ + v = voice[j].left_mix; + if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) + v = voice[j].right_mix; if(v < lv) { lv = v; @@ -720,7 +963,7 @@ return lowest; } - /* EAW -- try to remove VOICE_DIE before VOICE_ON */ + /* try to remove VOICE_DIE before VOICE_ON */ lv = 0x7FFFFFFF; lowest = -1; for(j = 0; j < i; j++) @@ -729,11 +972,11 @@ continue; if(voice[j].status & ~(VOICE_ON | VOICE_SUSTAINED)) { - /* continue protecting the drum decays */ - if (!voice[j].delay && voice[j].status & ~(VOICE_DIE) && - ISDRUMCHANNEL(voice[j].channel)) + /* continue protecting drum decays */ + if (voice[j].status & ~(VOICE_DIE) && + (!voice[j].sample->sample_rate && ISDRUMCHANNEL(voice[j].channel))) continue; - + /* find lowest volume */ v = voice[j].left_mix; if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) v = voice[j].right_mix; @@ -753,8 +996,6 @@ return lowest; } - lost_notes++; - /* try to remove VOICE_SUSTAINED before VOICE_ON */ lv = 0x7FFFFFFF; lowest = -0x7FFFFFFF; @@ -764,9 +1005,10 @@ continue; if(voice[j].status & VOICE_SUSTAINED) { - /* Choose note with longest decay time remaining */ - /* This frees more CPU than choosing lowest volume */ - v = current_sample - voice[j].timeout; + /* find lowest volume */ + v = voice[j].left_mix; + if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) + v = voice[j].right_mix; if(v < lv) { lv = v; @@ -783,32 +1025,107 @@ return lowest; } + /* try to remove chorus before VOICE_ON */ lv = 0x7FFFFFFF; - lowest = 0; + lowest = -0x7FFFFFFF; for(j = 0; j < i; j++) { - if(voice[j].status & VOICE_FREE) + if(voice[j].status & VOICE_FREE || voice[j].cache != NULL) continue; + if(voice[j].delay) + { + /* find lowest volume */ + v = voice[j].left_mix; + if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) + v = voice[j].right_mix; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + if(lowest != -0x7FFFFFFF) + { + int low_channel, low_note; - /* score notes based on both volume AND duration */ - /* this scoring function needs some more tweaking... */ - v = voice[j].left_mix * (voice[j].timeout - current_sample); - vr = voice[j].right_mix * (voice[j].timeout - current_sample); - if(voice[j].panned == PANNED_MYSTERY && vr > v) - v = vr; + cut_notes++; + + /* hack - double volume of chorus partner */ + low_channel = voice[lowest].channel; + low_note = voice[lowest].note; + for (j = 0; j < i; j++) { + if (voice[j].status & VOICE_FREE) continue; + if (voice[j].channel == low_channel && + voice[j].note == low_note && + j != lowest) { + voice[j].left_mix <<= 1; + voice[j].right_mix <<= 1; + break; + } + } + + voice[lowest].status = VOICE_FREE; + if(!prescanning_flag) + ctl_note_event(lowest); + return lowest; + } + + lost_notes++; + + /* remove non-drum VOICE_ON */ + lv = 0x7FFFFFFF; + lowest = -0x7FFFFFFF; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE || + (!voice[j].sample->sample_rate && ISDRUMCHANNEL(voice[j].channel))) + continue; + + /* find lowest volume */ + v = voice[j].left_mix; + if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) + v = voice[j].right_mix; if(v < lv) { lv = v; lowest = j; } } + if(lowest != -0x7FFFFFFF) + { + voice[lowest].status = VOICE_FREE; + if(!prescanning_flag) + ctl_note_event(lowest); + return lowest; + } + /* remove all other types of notes */ + lv = 0x7FFFFFFF; + lowest = 0; + for(j = 0; j < i; j++) + { + if(voice[j].status & VOICE_FREE) + continue; + /* find lowest volume */ + v = voice[j].left_mix; + if(voice[j].panned == PANNED_MYSTERY && voice[j].right_mix > v) + v = voice[j].right_mix; + if(v < lv) + { + lv = v; + lowest = j; + } + } + voice[lowest].status = VOICE_FREE; if(!prescanning_flag) ctl_note_event(lowest); return lowest; } + + /* Only one instance of a note can be playing on a single channel. */ static int find_voice(MidiEvent *e) { @@ -878,7 +1195,8 @@ lowest = -1; for(i = 0; i < nv; i++) { - if(voice[i].status & ~(VOICE_ON | VOICE_DIE)) + if(voice[i].status & ~(VOICE_ON | VOICE_DIE) && + !(!voice[i].sample->sample_rate && ISDRUMCHANNEL(voice[i].channel))) { v = voice[i].left_mix; if((voice[i].panned==PANNED_MYSTERY) && (voice[i].right_mix>v)) @@ -2293,6 +2611,7 @@ break; case RC_TOGGLE_PAUSE: play_pause_flag = !play_pause_flag; + ctl_pause_event(play_pause_flag, 0); return RC_NONE; case RC_TOGGLE_SNDSPEC: #ifdef SUPPORT_SOUNDSPEC @@ -2385,6 +2704,80 @@ upper_voices = voices; } +/* EAW -- do not throw away good notes, stop decrementing */ +static void voice_decrement_conservative(int n) +{ + int i, j, lowest, finalnv; + int32 lv, v; + + /* decrease voice */ + finalnv = voices - n; + for(i = 1; i <= n && voices > 0; i++) + { + if(voice[voices-1].status == VOICE_FREE) { + voices--; + continue; /* found */ + } + + for(j = 0; j < finalnv; j++) + if(voice[j].status == VOICE_FREE) + break; + if(j != finalnv) + { + voice[j] = voice[voices-1]; + voices--; + continue; /* found */ + } + + /* Look for the decaying note with the lowest volume */ + lv = 0x7FFFFFFF; + lowest = -1; + for(j = 0; j < voices; j++) + { + if(voice[j].status & ~(VOICE_ON | VOICE_DIE) && + !(!voice[j].sample->sample_rate && + ISDRUMCHANNEL(voice[j].channel))) + { + v = voice[j].left_mix; + if((voice[j].panned==PANNED_MYSTERY) && + (voice[j].right_mix > v)) + v = voice[j].right_mix; + if(v < lv) + { + lv = v; + lowest = j; + } + } + } + + if(lowest != -1) + { + voices--; + cut_notes++; + voice[lowest].status = VOICE_FREE; + ctl_note_event(lowest); + voice[lowest] = voice[voices]; + } + else break; + } + if(upper_voices > voices) + upper_voices = voices; +} + +void restore_voices(int save_voices) +{ +#ifdef REDUCE_VOICE_TIME_TUNING + static int old_voices = -1; + if(old_voices == -1 || save_voices) + old_voices = voices; + else if (voices < old_voices) + voice_increment(old_voices - voices); + else + voice_decrement(voices - old_voices); +#endif /* REDUCE_VOICE_TIME_TUNING */ +} + + static int apply_controls(void) { int rc, i, jump_flag = 0; @@ -2396,6 +2789,7 @@ { switch(rc=ctl->read(&val)) { + case RC_STOP: case RC_QUIT: /* [] */ case RC_LOAD_FILE: case RC_NEXT: /* >>| */ @@ -2433,12 +2827,24 @@ return RC_RESTART; case RC_RESTART: /* |<< */ + if(play_pause_flag) + { + midi_restart_time = 0; + ctl_pause_event(1, 0); + continue; + } aq_flush(1); skip_to(0); jump_flag = 1; continue; case RC_JUMP: + if(play_pause_flag) + { + midi_restart_time = val; + ctl_pause_event(1, val); + continue; + } aq_flush(1); if (val >= sample_count) return RC_NEXT; @@ -2446,6 +2852,14 @@ return rc; case RC_FORWARD: /* >> */ + if(play_pause_flag) + { + midi_restart_time += val; + if(midi_restart_time > sample_count) + midi_restart_time = sample_count; + ctl_pause_event(1, midi_restart_time); + continue; + } cur = current_trace_samples(); aq_flush(1); if(cur == -1) @@ -2456,6 +2870,14 @@ return RC_JUMP; case RC_BACK: /* << */ + if(play_pause_flag) + { + midi_restart_time -= val; + if(midi_restart_time < 0) + midi_restart_time = 0; + ctl_pause_event(1, midi_restart_time); + continue; + } cur = current_trace_samples(); aq_flush(1); if(cur == -1) @@ -2480,6 +2902,7 @@ aq_flush(1); play_pause_flag = 1; } + ctl_pause_event(play_pause_flag, midi_restart_time); jump_flag = 1; continue; @@ -2513,21 +2936,25 @@ continue; case RC_VOICEINCR: + restore_voices(0); voice_increment(val); if(sync_restart(1) != -1) jump_flag = 1; + restore_voices(1); continue; case RC_VOICEDECR: + restore_voices(0); if(sync_restart(1) != -1) { voices -= val; if(voices < 0) voices = 0; jump_flag = 1; - continue; } - voice_decrement(val); + else + voice_decrement(val); + restore_voices(1); continue; case RC_TOGGLE_DRUMCHAN: @@ -2840,6 +3267,9 @@ { int i; + if((rc = apply_controls()) != RC_NONE) + return rc; + do_compute_data(AUDIO_BUFFER_SIZE-buffered_count); count -= AUDIO_BUFFER_SIZE-buffered_count; ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY, @@ -2855,30 +3285,13 @@ (play_mode->flag & PF_CAN_TRACE) && !aq_fill_buffer_flag) { - /* Reduce voices if there is no enough audio device buffer */ + /* Reduce voices if there is not enough audio device buffer */ int nv, filled, filled_limit, rate, rate_limit; static int last_filled; filled = aq_filled(); - /* EAW -- set upper and lower bounds for "good" number of voices; - rate check bounds are 10 beyond the magic numbers used for - voice reduction threshholds */ - - rate = 100 * filled / aq_get_dev_queuesize(); - for(i = nv = 0; i < upper_voices; i++) - if(voice[i].status != VOICE_FREE) - nv++; - if(opt_realtime_playing != 2) - { - if (rate > old_rate && rate > 85 && nv > max_good_nv) - max_good_nv = nv; - else if (rate < old_rate && rate > 20 && nv < min_bad_nv) - min_bad_nv = nv; - old_rate = rate; - } - rate_limit = 75; if(reduce_voice_threshold >= 0) { @@ -2897,6 +3310,46 @@ } } + rate = 100 * filled / aq_get_dev_queuesize(); + for(i = nv = 0; i < upper_voices; i++) + if(voice[i].status != VOICE_FREE) + nv++; + + if(opt_realtime_playing != 2) + { + /* calculate ok_nv, the "optimum" max polyphony */ + if (auto_reduce_polyphony && rate < 85) { + /* average in current nv */ + if ((rate == old_rate && nv > min_bad_nv) || + (rate >= old_rate && rate < 20)) { + ok_nv_total += nv; + ok_nv_counts++; + } + /* increase polyphony when it is too low */ + else if (nv == voices && + (rate > old_rate && filled > last_filled)) { + ok_nv_total += nv + 1; + ok_nv_counts++; + } + /* reduce polyphony when loosing buffer */ + else if (rate < 75 && + (rate < old_rate && filled < last_filled)) { + ok_nv_total += min_bad_nv; + ok_nv_counts++; + } + else goto NO_RESCALE_NV; + + /* rescale ok_nv stuff every 1 seconds */ + if (current_sample >= ok_nv_sample && ok_nv_counts > 1) { + ok_nv_total >>= 1; + ok_nv_counts >>= 1; + ok_nv_sample = current_sample + (play_mode->rate); + } + + NO_RESCALE_NV:; + } + } + /* EAW -- if buffer is < 75%, start reducing some voices to try to let it recover. This really helps a lot, preserves decent sound, and decreases the frequency of lost ON notes */ @@ -2907,17 +3360,24 @@ { int v, kill_nv, temp_nv; + /* set bounds on "good" and "bad" nv */ + if (opt_realtime_playing != 2 && rate > 20 && + nv < min_bad_nv) { + min_bad_nv = nv; + if (max_good_nv < min_bad_nv) + max_good_nv = min_bad_nv; + } + /* EAW -- count number of !ON voices */ /* treat chorus notes as !ON */ for(i = kill_nv = 0; i < upper_voices; i++) { - if(voice[i].status & VOICE_FREE) + if(voice[i].status & VOICE_FREE || + voice[i].cache != NULL) continue; - if(voice[i].delay || - (voice[i].status & ~(VOICE_ON|VOICE_SUSTAINED) && + if((voice[i].status & ~(VOICE_ON|VOICE_SUSTAINED) && !(voice[i].status & ~(VOICE_DIE) && - !voice[i].delay && - ISDRUMCHANNEL(voice[i].channel)))) + !voice[i].sample->sample_rate))) kill_nv++; } @@ -2946,7 +3406,7 @@ for(i = 0; i < kill_nv; i++) { - v = reduce_voice(); + v = reduce_voice_CPU(); /* Tell VOICE_DIE to interface */ voice[v].status = VOICE_DIE; @@ -2954,14 +3414,55 @@ voice[v].status = VOICE_FREE; } + /* lower max # of allowed voices to let the buffer recover */ + if (auto_reduce_polyphony) { + temp_nv = nv - kill_nv; + ok_nv = ok_nv_total / ok_nv_counts; + + /* decrease it to current nv left */ + if (voices > temp_nv && temp_nv > ok_nv) + voice_decrement_conservative(voices - temp_nv); + /* decrease it to ok_nv */ + else if (voices > ok_nv && temp_nv <= ok_nv) + voice_decrement_conservative(voices - ok_nv); + /* increase the polyphony */ + else if (voices < ok_nv) + voice_increment(ok_nv - voices); + } + while(upper_voices > 0 && voice[upper_voices - 1].status == VOICE_FREE) upper_voices--; } last_filled = filled; } - else + else { + if (opt_realtime_playing != 2 && rate >= rate_limit && + filled > last_filled) { + + /* set bounds on "good" and "bad" nv */ + if (rate > 85 && nv > max_good_nv) { + max_good_nv = nv; + if (min_bad_nv > max_good_nv) + min_bad_nv = max_good_nv; + } + + if (auto_reduce_polyphony) { + /* reset ok_nv stuff when out of danger */ + ok_nv_total = max_good_nv * ok_nv_counts; + if (ok_nv_counts > 1) { + ok_nv_total >>= 1; + ok_nv_counts >>= 1; + } + + /* restore max # of allowed voices to normal */ + restore_voices(0); + } + } + last_filled = filled_limit; + } + old_rate = rate; } #endif @@ -2972,15 +3473,11 @@ buffered_count=0; if(current_event->type != ME_EOT) ctl_timestamp(); - if((rc = apply_controls()) != RC_NONE) - return rc; -#ifdef __W32__ /* check break signals */ VOLATILE_TOUCH(intr); if(intr) return RC_QUIT; -#endif if(upper_voices == 0 && check_eot_flag && (i = check_midi_play_end(current_event, EOT_PRESEARCH_LEN)) > 0) @@ -3507,6 +4004,9 @@ MidiEvent *event; int32 nsamples; + /* Set current file information */ + current_file_info = get_midi_file_info(fn, 1); + rc = check_apply_control(); if(RC_IS_SKIP_FILE(rc) && rc != RC_RELOAD) return rc; @@ -3522,7 +4022,12 @@ /* Reset voice reduction stuff */ min_bad_nv = 256; max_good_nv = 1; + ok_nv_total = 32; + ok_nv_counts = 1; + ok_nv = 32; + ok_nv_sample = 0; old_rate = -1; + restore_voices(0); #endif play_reload: /* Come here to reload MIDI file */ @@ -3560,9 +4065,13 @@ free(event); if(rc == RC_RELOAD) goto play_reload; - - if(rc == RC_ERROR && last_rc == RC_REALLY_PREVIOUS) - return RC_REALLY_PREVIOUS; + if(rc == RC_ERROR) + { + if(current_file_info->file_type == IS_OTHER_FILE) + current_file_info->file_type = IS_ERROR_FILE; + if(last_rc == RC_REALLY_PREVIOUS) + return RC_REALLY_PREVIOUS; + } last_rc = rc; return rc; } @@ -3669,6 +4178,18 @@ ctl->event(&ce); } +static void ctl_pause_event(int pause, int32 s) +{ + if(ctl->event) + { + CtlEvent ce; + ce.type = CTLE_PAUSE; + ce.v1 = pause; + ce.v2 = (long)(s / (midi_time_ratio * play_mode->rate)); + ctl->event(&ce); + } +} + char *channel_instrum_name(int ch) { char *comm; @@ -3711,7 +4232,6 @@ note_key_offset = 0; midi_time_ratio = 1.0; midi_restart_time = 0; - midi_trace.nodelay = 1; if(first) { first = 0; diff -ruN TiMidity++-2.2.0/timidity/playmidi.h TiMidity++-2.3.0/timidity/playmidi.h --- TiMidity++-2.2.0/timidity/playmidi.h Sun Apr 11 23:15:48 1999 +++ TiMidity++-2.3.0/timidity/playmidi.h Sat Jul 31 21:21:54 1999 @@ -312,6 +312,8 @@ extern int playmidi_seek_flag; extern int effect_lr_mode; extern int effect_lr_delay_msec; +extern int auto_reduce_polyphony; +extern int play_pause_flag; extern int play_midi_file(char *fn); extern void dumb_pass_playing_list(int number_of_files, char *list_of_files[]); diff -ruN TiMidity++-2.2.0/timidity/raw_a.c TiMidity++-2.3.0/timidity/raw_a.c --- TiMidity++-2.2.0/timidity/raw_a.c Mon Mar 1 21:15:22 1999 +++ TiMidity++-2.3.0/timidity/raw_a.c Fri Jul 30 23:04:22 1999 @@ -67,7 +67,7 @@ DEFAULT_RATE, PE_16BIT|PE_SIGNED, PF_PCM_STREAM, -1, {0,0,0,0,0}, - "raw waveform data", 'r', + "Raw waveform data", 'r', "output.raw", open_output, close_output, @@ -121,5 +121,10 @@ static int acntl(int request, void *arg) { + switch(request) + { + case PM_REQ_DISCARD: + return 0; + } return -1; } diff -ruN TiMidity++-2.2.0/timidity/readmidi.h TiMidity++-2.3.0/timidity/readmidi.h --- TiMidity++-2.2.0/timidity/readmidi.h Sat Apr 10 00:56:24 1999 +++ TiMidity++-2.3.0/timidity/readmidi.h Sat Jul 31 23:57:42 1999 @@ -25,6 +25,7 @@ */ /* MIDI file types */ +#define IS_ERROR_FILE -1 /* Error file */ #define IS_OTHER_FILE 0 /* Not a MIDI file */ #define IS_SMF_FILE 101 /* Standard MIDI File */ #define IS_MCP_FILE 201 /* MCP */ diff -ruN TiMidity++-2.2.0/timidity/recache.c TiMidity++-2.3.0/timidity/recache.c --- TiMidity++-2.2.0/timidity/recache.c Sun Apr 18 15:24:39 1999 +++ TiMidity++-2.3.0/timidity/recache.c Thu Jul 22 17:16:28 1999 @@ -360,7 +360,6 @@ } else { - for(i = 0; i < newlen; i++) { int32 j, v1, v2; diff -ruN TiMidity++-2.2.0/timidity/timidity.c TiMidity++-2.3.0/timidity/timidity.c --- TiMidity++-2.2.0/timidity/timidity.c Mon Jul 19 11:17:17 1999 +++ TiMidity++-2.3.0/timidity/timidity.c Sat Jul 31 17:17:24 1999 @@ -32,10 +32,11 @@ #endif #ifdef __W32__ #include -#else +#endif +#ifdef HAVE_UNISTD_H #include +#endif /* HAVE_UNISTD_H */ #include /* for open */ -#endif #include #ifdef BORLANDC_EXCEPTION @@ -76,13 +77,14 @@ #include "mid.defs" #include "aq.h" +#ifdef IA_W32GUI +#include "w32g.h" +#endif + #define OPTCOMMANDS "A:aB:b:C:c:D:d:eE:Ffg:hI:i:jk:L:n:O:o:P:p:Q:q:R:rS:s:t:UW:w:x:Z:" -#define INTERACTIVE_INTERFACE_IDS "kmqagr" +#define INTERACTIVE_INTERFACE_IDS "kmqagrw" /* main interfaces (To be used another main) */ -#ifdef IA_W32GUI -#define ANOTHER_MAIN 1 -#endif /* IA_W32GUI */ #if defined(main) || defined(ANOTHER_MAIN) #define MAIN_INTERFACE #else @@ -95,10 +97,11 @@ MAIN_INTERFACE void timidity_init_player(void); MAIN_INTERFACE int timidity_play_main(int nfiles, char **files); MAIN_INTERFACE int got_a_configuration; -MAIN_INTERFACE char *wrdt_open_opts = NULL; -MAIN_INTERFACE char *opt_aq_max_buff = "5.0", - *opt_aq_fill_buff = "100%"; -MAIN_INTERFACE void timidity_init_aq_buff(void); +char *wrdt_open_opts = NULL; +char *opt_aq_max_buff = NULL, + *opt_aq_fill_buff = NULL; +void timidity_init_aq_buff(void); +int opt_control_ratio = 0; /* Save -C option */ #ifdef IA_DYNAMIC MAIN_INTERFACE char dynamic_interface_id; @@ -163,17 +166,17 @@ #endif /* MAXPATHLEN */ int free_instruments_afterwards=0; -MAIN_INTERFACE char def_instr_name[256]=""; +char def_instr_name[256]=""; +VOLATILE int intr = 0; #ifdef __W32__ -VOLATILE int intr = FALSE; CRITICAL_SECTION critSect; #pragma argsused static BOOL WINAPI handler (DWORD dw) { if(dw == CTRL_C_EVENT || dw == CTRL_BREAK_EVENT) - printf ("***BREAK" NLS); + printf ("***BREAK" NLS); fflush(stdout); intr = TRUE; aq_flush(1); play_mode->close_output(); @@ -182,15 +185,6 @@ ExitProcess(-1); return TRUE; } -/* -static BOOL WINAPI handler (DWORD dw) - { - printf ("***BREAK" NLS); - intr = TRUE; - play_mode->purge_output (); - return TRUE; - } -*/ #endif @@ -417,7 +411,9 @@ " -o file Output to another file (Use \"-\" for stdout)", #endif " -P file Use patch file for all programs", -" -p n Allow n-voice polyphony", +" -p n(a) Allow n-voice polyphony. Optional auto polyphony reduction toggle." +, +" -p a Toggle automatic polyphony reduction. Enabled by default.", " -Q n Ignore channel n", " -q m/n Specify audio buffer in seconds", " m:Maxmum buffer, n:Filled to start (default is 5.0/100%%)", @@ -621,7 +617,7 @@ return 0; } -static int set_default_prog(char *opt) +MAIN_INTERFACE int set_default_prog(char *opt) { int prog, ch; char *p; @@ -653,7 +649,7 @@ return 0; } -MAIN_INTERFACE int set_play_mode(char *cp) +int set_play_mode(char *cp) { PlayMode *pmp, **pmpp=play_mode_list; @@ -714,7 +710,7 @@ return 1; } -MAIN_INTERFACE int set_ctl(char *cp) +int set_ctl(char *cp) { ControlMode *cmp, **cmpp = ctl_list; @@ -723,6 +719,13 @@ if(cmp->id_character == *cp) { ctl = cmp; + +#ifdef IA_W32GUI + cmp->verbosity = 1; + cmp->trace_playing = 0; + cmp->flags = 0; +#endif /* IA_W32GUI */ + while(*(++cp)) { switch(*cp) @@ -741,6 +744,12 @@ case 's': cmp->flags ^= CTLF_LIST_SORT; break; + case 'a': + cmp->flags ^= CTLF_AUTOSTART; + break; + case 'x': + cmp->flags ^= CTLF_AUTOEXIT; + break; default: ctl->cmsg(CMSG_ERROR, VERB_NORMAL, @@ -760,6 +769,7 @@ { cmp->verbosity = 1; cmp->trace_playing = 0; + cmp->flags = 0; cmp->id_character = dynamic_interface_id = *cp; } while (*(++cp)) @@ -789,7 +799,7 @@ return 1; } -MAIN_INTERFACE int set_wrd(char *w) +int set_wrd(char *w) { WRDTracer **wl = wrdt_list; @@ -848,19 +858,133 @@ } } +static int set_gus_patchconf_opts(char *name, int line, char *opts, + ToneBankElement *tone) +{ + char *cp; + int k; + + if(!(cp = strchr(opts, '='))) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: bad patch option %s", + name, line, opts); + return 1; + } + + *cp++ = 0; + if(!strcmp(opts, "amp")) + { + k = atoi(cp); + if((k < 0 || k > MAX_AMPLIFICATION) || + (*cp < '0' || *cp > '9')) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: amplification must be between " + "0 and %d", name, line, MAX_AMPLIFICATION); + return 1; + } + tone->amp = k; + } + else if(!strcmp(opts, "note")) + { + k = atoi(cp); + if((k < 0 || k > 127) || (*cp < '0' || *cp > '9')) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: note must be between 0 and 127", + name, line); + return 1; + } + tone->note = k; + } + else if(!strcmp(opts, "pan")) + { + if(!strcmp(cp, "center")) + k = 64; + else if(!strcmp(cp, "left")) + k = 0; + else if(!strcmp(cp, "right")) + k = 127; + else + k = ((atoi(cp) + 100) * 100) / 157; + if((k < 0 || k > 127) || + (k == 0 && *cp != '-' && (*cp < '0' || *cp > '9'))) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: panning must be left, right, " + "center, or between -100 and 100", + name, line); + return 1; + } + tone->pan = k; + } + else if(!strcmp(opts, "keep")) + { + if(!strcmp(cp, "env")) + tone->strip_envelope = 0; + else if(!strcmp(cp, "loop")) + tone->strip_loop = 0; + else + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: keep must be env or loop", + name, line); + return 1; + } + } + else if(!strcmp(opts, "strip")) + { + if(!strcmp(cp, "env")) + tone->strip_envelope = 1; + else if(!strcmp(cp, "loop")) + tone->strip_loop = 1; + else if(!strcmp(cp, "tail")) + tone->strip_tail = 1; + else + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: strip must be " + "env, loop, or tail", name, line); + return 1; + } + } + else if(!strcmp(opts, "comm")) + { + char *p; + if(tone->comment) + free(tone->comment); + p = tone->comment = safe_strdup(cp); + while(*p) + { + if(*p == ',') *p = ' '; + p++; + } + } + else + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "%s: line %d: bad patch option %s", + name, line, opts); + return 1; + } + return 0; +} + + static int set_gus_patchconf(char *name, int line, - ToneBank *bank, int key, char *pat, char **opts) + ToneBankElement *tone, char *pat, char **opts) { int j; - if(bank->tone[key].name) + if(tone->name) { - free(bank->tone[key].name); - bank->tone[key].name = NULL; + free(tone->name); + tone->name = NULL; } - bank->tone[key].note = bank->tone[key].amp = bank->tone[key].pan = - bank->tone[key].strip_loop = bank->tone[key].strip_envelope = - bank->tone[key].strip_tail = -1; + tone->note = tone->amp = tone->pan = + tone->strip_loop = tone->strip_envelope = + tone->strip_tail = -1; if(strcmp(pat, "%font") == 0) /* Font extention */ { @@ -875,150 +999,46 @@ "%s: line %d: Syntax error", name, line); return 1; } - bank->tone[key].name = safe_strdup(opts[0]); - bank->tone[key].instype = 1; + tone->name = safe_strdup(opts[0]); + tone->instype = 1; if(atoi(opts[1]) == 128) /* drum */ { - bank->tone[key].font_bank = 128; - bank->tone[key].font_preset = atoi(opts[2]); - bank->tone[key].note = atoi(opts[3]); + tone->font_bank = 128; + tone->font_preset = atoi(opts[2]); + tone->note = atoi(opts[3]); opts += 4; } else { - bank->tone[key].font_bank = atoi(opts[1]); - bank->tone[key].font_preset = atoi(opts[2]); + tone->font_bank = atoi(opts[1]); + tone->font_preset = atoi(opts[2]); if(opts[3] && ('0' <= opts[3][0] && opts[3][0] <= '9')) { - bank->tone[key].note = atoi(opts[3]); + tone->note = atoi(opts[3]); opts += 4; } else { - bank->tone[key].note = -1; + tone->note = -1; opts += 3; } } } else { - bank->tone[key].instype = 0; - bank->tone[key].name = safe_strdup(pat); + tone->instype = 0; + tone->name = safe_strdup(pat); } for(j = 0; opts[j] != NULL; j++) { - char *cp; - int k; - - if(!(cp = strchr(opts[j], '='))) - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: bad patch option %s", - name, line, opts[j]); - return 1; - } - - *cp++ = 0; - if(!strcmp(opts[j], "amp")) - { - k = atoi(cp); - if((k < 0 || k > MAX_AMPLIFICATION) || - (*cp < '0' || *cp > '9')) - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: amplification must be between " - "0 and %d", name, line, MAX_AMPLIFICATION); - return 1; - } - bank->tone[key].amp = k; - } - else if(!strcmp(opts[j], "note")) - { - k = atoi(cp); - if((k < 0 || k > 127) || (*cp < '0' || *cp > '9')) - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: note must be between 0 and 127", - name, line); - return 1; - } - bank->tone[key].note = k; - } - else if(!strcmp(opts[j], "pan")) - { - if(!strcmp(cp, "center")) - k = 64; - else if(!strcmp(cp, "left")) - k = 0; - else if(!strcmp(cp, "right")) - k = 127; - else - k = ((atoi(cp) + 100) * 100) / 157; - if((k < 0 || k > 127) || - (k == 0 && *cp != '-' && (*cp < '0' || *cp > '9'))) - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: panning must be left, right, " - "center, or between -100 and 100", - name, line); - return 1; - } - bank->tone[key].pan = k; - } - else if(!strcmp(opts[j], "keep")) - { - if(!strcmp(cp, "env")) - bank->tone[key].strip_envelope = 0; - else if(!strcmp(cp, "loop")) - bank->tone[key].strip_loop = 0; - else - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: keep must be env or loop", - name, line); - return 1; - } - } - else if(!strcmp(opts[j], "strip")) - { - if(!strcmp(cp, "env")) - bank->tone[key].strip_envelope = 1; - else if(!strcmp(cp, "loop")) - bank->tone[key].strip_loop = 1; - else if(!strcmp(cp, "tail")) - bank->tone[key].strip_tail = 1; - else - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: strip must be " - "env, loop, or tail", name, line); - return 1; - } - } - else if(!strcmp(opts[j], "comm")) - { - char *p; - if(bank->tone[key].comment) - free(bank->tone[key].comment); - p = bank->tone[key].comment = safe_strdup(cp); - while(*p) - { - if(*p == ',') *p = ' '; - p++; - } - } - else - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "%s: line %d: bad patch option %s", - name, line, opts[j]); - return 1; - } + int err; + if((err = set_gus_patchconf_opts(name, line, opts[j], tone)) != 0) + return err; } - if(bank->tone[key].comment == NULL) - bank->tone[key].comment = safe_strdup(bank->tone[key].name); + if(tone->comment == NULL) + tone->comment = safe_strdup(tone->name); return 0; } @@ -1791,7 +1811,8 @@ continue; } - if(set_gus_patchconf(name, line, localbank, i, w[3], w + 4)) + if(set_gus_patchconf(name, line, &localbank->tone[i], + w[3], w + 4)) { CHECKERRLIMIT; continue; @@ -1851,7 +1872,8 @@ continue; } - if(set_gus_patchconf(name, line, localbank, i, w[3], w + 4)) + if(set_gus_patchconf(name, line, &localbank->tone[i], + w[3], w + 4)) { CHECKERRLIMIT; continue; @@ -1897,7 +1919,7 @@ continue; } - if(set_gus_patchconf(name, line, bank, i, w[1], w + 2)) + if(set_gus_patchconf(name, line, &bank->tone[i], w[1], w + 2)) { CHECKERRLIMIT; continue; @@ -2355,16 +2377,16 @@ #endif /* __W32__ */ #ifdef __W32__ -static int opt_evil_mode = 0; +int opt_evil_mode = 0; #endif /* __W32__ */ static int try_config_again = 0; -static int32 opt_output_rate = 0; +int32 opt_output_rate = 0; static char *opt_output_name = NULL; static StringTable opt_config_string; #ifdef SUPPORT_SOUNDSPEC static double spectrogram_update_sec = 0.0; #endif /* SUPPORT_SOUNDSPEC */ -static int buffer_fragments = -1; +int opt_buffer_fragments = -1; MAIN_INTERFACE int set_tim_opt(int c, char *optarg) { @@ -2372,37 +2394,20 @@ switch(c) { - case 'U': - free_instruments_afterwards = 1; - break; - case 'L': - add_to_pathlist(optarg); - try_config_again = 1; - break; - case 'c': - if(read_config_file(optarg, 0)) + case 'A': + if(set_value(&lification, atoi(optarg), 0, MAX_AMPLIFICATION, + "Amplification")) return 1; - got_a_configuration = 1; break; - case 'Q': - if(set_channel_flag(&quietchannels, atoi(optarg), "Quiet channel")) - return 1; + + case 'a': + antialiasing_allowed = 1; break; - case 'q': - if(strchr(optarg, '/') == NULL) - opt_aq_max_buff = strdup(optarg); - else - { - if(optarg[0] == '/') - opt_aq_fill_buff = strdup(optarg + 1); - else - { - opt_aq_max_buff = strdup(optarg); - opt_aq_fill_buff = strchr(opt_aq_max_buff, '/'); - *opt_aq_fill_buff++ = '\0'; - } - } + case 'B': + if(set_value(&tmpi32, atoi(optarg), 0, 1000, "Buffer fragments")) + return 1; + opt_buffer_fragments = tmpi32; break; case 'b': @@ -2410,17 +2415,27 @@ "-b option is obsoleted. " "Please use -EFdelay=b"); return 1; - case 'r': - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "-r option is obsoleted. Please use -EFreverb=1"); - return 1; - case 'D': - if(set_channel_flag(&drumchannels, atoi(optarg), "Drum channel")) + + case 'C': + if(set_value(&control_ratio, atoi(optarg), 1, MAX_CONTROL_RATIO, + "Control ratio")) return 1; + opt_control_ratio = control_ratio; + break; + + case 'c': + if(read_config_file(optarg, 0)) + return 1; + got_a_configuration = 1; + break; + + case 'D': tmpi32 = atoi(optarg); + if(set_channel_flag(&default_drumchannels, tmpi32, "Drum channel")) + return 1; if(tmpi32 < 0) tmpi32 = -tmpi32; - set_channel_flag(&drumchannel_mask, tmpi32, "Drum channel"); + set_channel_flag(&default_drumchannel_mask, tmpi32, "Drum channel"); break; case 'd': /* dynamic lib root */ @@ -2433,55 +2448,137 @@ #endif /* IA_DYNAMIC */ break; - case 'O': /* output mode */ - if(set_play_mode(optarg)) - return 1; - break; - case 'o': - if(opt_output_name != NULL) - free(opt_output_name); - opt_output_name = safe_strdup(url_expand_home_dir(optarg)); + case 'E': + return set_extension_modes(optarg); + + case 'e': /* evil */ +#ifdef __W32__ + opt_evil_mode = 1; break; - case 'a': - antialiasing_allowed = 1; +#else + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-e option is not supported"); + return 1; +#endif + + case 'F': + adjust_panning_immediately = !adjust_panning_immediately; break; + case 'f': fast_decay = (fast_decay) ? 0 : 1; break; - case 'F': - adjust_panning_immediately = !adjust_panning_immediately; - break; - case 's': /* sampling rate */ - tmpi32 = atoi(optarg); - if(tmpi32 < 100) - tmpi32 = (int32)(atof(optarg) * 1000.0 + 0.5); - if(set_value(&opt_output_rate, tmpi32, MIN_OUTPUT_RATE,MAX_OUTPUT_RATE, - "Resampling frequency")) + + case 'g': +#ifdef SUPPORT_SOUNDSPEC + spectrogram_update_sec = (FLOAT_T)atof(optarg); + if(spectrogram_update_sec <= 0) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "Invalid -g argument: `%s'", optarg); return 1; + } + view_soundspec_flag = 1; break; - case 'P': /* set overriding instrument */ - strncpy(def_instr_name, optarg, 255); - def_instr_name[255] = '\0'; - break; +#else + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-g option is not supported"); + return 1; +#endif /* SUPPORT_SOUNDSPEC */ + + case 'h': + help(); + exit(0); + case 'I': if(set_default_prog(optarg)) return -1; break; - case 'A': - if(set_value(&lification, atoi(optarg), 0, MAX_AMPLIFICATION, - "Amplification")) + + case 'i': + if(set_ctl(optarg)) return 1; break; - case 'C': - if(set_value(&control_ratio, atoi(optarg), 1, MAX_CONTROL_RATIO, - "Control ratio")) + + case 'j': + opt_realtime_playing = !opt_realtime_playing; + break; + + case 'k': + reduce_voice_threshold = atoi(optarg); + break; + + case 'L': + add_to_pathlist(optarg); + try_config_again = 1; + break; + + case 'n': + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "-n option is obsoleted. Please use -EFns="); + return 1; + + case 'O': /* output mode */ + if(set_play_mode(optarg)) return 1; break; + + case 'o': + if(opt_output_name != NULL) + free(opt_output_name); + opt_output_name = safe_strdup(url_expand_home_dir(optarg)); + break; + + case 'P': /* set overriding instrument */ + strncpy(def_instr_name, optarg, 255); + def_instr_name[255] = '\0'; + break; + case 'p': - if(set_value(&tmpi32, atoi(optarg), 1, MAX_VOICES, "Polyphony")) + if (strchr(optarg, 'a')) auto_reduce_polyphony = + !auto_reduce_polyphony; + if (*optarg != 'a') { + if(set_value(&tmpi32, atoi(optarg), 1, MAX_VOICES, "Polyphony")) + return 1; + voices = tmpi32; + } + break; + + case 'Q': + if(set_channel_flag(&quietchannels, atoi(optarg), "Quiet channel")) return 1; - voices = tmpi32; break; + + case 'q': + if(strchr(optarg, '/') == NULL) + { + if(opt_aq_max_buff) + free(opt_aq_max_buff); + opt_aq_max_buff = safe_strdup(optarg); + } + else + { + if(optarg[0] == '/') + { + if(opt_aq_fill_buff) + free(opt_aq_fill_buff); + opt_aq_fill_buff = safe_strdup(optarg + 1); + } + else + { + char *max_buff, *fill_buff; + + max_buff = safe_strdup(optarg); + fill_buff = strchr(max_buff, '/'); + *fill_buff++ = '\0'; + if(opt_aq_max_buff) + free(opt_aq_max_buff); + if(opt_aq_fill_buff) + free(opt_aq_fill_buff); + opt_aq_max_buff = max_buff; + opt_aq_fill_buff = safe_strdup(fill_buff); + } + } + break; + case 'R': tmpi32 = atoi(optarg); if(set_value(&modify_release, tmpi32, 0, MAX_MREL, "Modify Release")) @@ -2489,21 +2586,10 @@ if (modify_release==0) modify_release=DEFAULT_MREL; break; - case 'g': -#ifdef SUPPORT_SOUNDSPEC - spectrogram_update_sec = (FLOAT_T)atof(optarg); - if(spectrogram_update_sec <= 0) - { - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "Invalid -g argument: `%s'", optarg); - return 1; - } - view_soundspec_flag = 1; - break; -#else - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-g option is not supported"); + case 'r': + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, + "-r option is obsoleted. Please use -EFreverb=1"); return 1; -#endif /* SUPPORT_SOUNDSPEC */ case 'S': if(optarg[strlen(optarg) - 1] == 'k' || @@ -2516,25 +2602,37 @@ allocate_cache_size = atoi(optarg); break; - case 'i': - if(set_ctl(optarg)) + case 's': /* sampling rate */ + tmpi32 = atoi(optarg); + if(tmpi32 < 100) + tmpi32 = (int32)(atof(optarg) * 1000.0 + 0.5); + if(set_value(&opt_output_rate, tmpi32, MIN_OUTPUT_RATE,MAX_OUTPUT_RATE, + "Resampling frequency")) return 1; break; - case 'B': - if(set_value(&tmpi32, atoi(optarg), 0, 1000, "Buffer fragments")) + case 't': + if(output_text_code) + free(output_text_code); + output_text_code = safe_strdup(optarg); + break; + + case 'U': + free_instruments_afterwards = 1; + break; + + case 'W': + if(set_wrd(optarg)) return 1; - buffer_fragments = tmpi32; break; - case 'e': /* evil */ + case 'w': #ifdef __W32__ - opt_evil_mode = 1; - break; + return set_win_modes(optarg); #else - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-e option is not supported"); + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-w option is not supported"); return 1; -#endif +#endif /* __W32__ */ case 'x': { @@ -2545,40 +2643,11 @@ expand_escape_string(st->string); } break; - case 't': - output_text_code = optarg; - break; - case 'E': - return set_extension_modes(optarg); - case 'j': - opt_realtime_playing = !opt_realtime_playing; - break; - case 'k': - reduce_voice_threshold = atoi(optarg); - break; - case 'w': -#ifdef __W32__ - return set_win_modes(optarg); -#else - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "-w option is not supported"); - return 1; -#endif /* __W32__ */ - case 'W': - if(set_wrd(optarg)) + + case 'Z': + if(load_table(optarg)) return 1; break; - case 'h': - help(); - exit(0); - case 'n': - ctl->cmsg(CMSG_ERROR, VERB_NORMAL, - "-n option is obsoleted. Please use -EFns="); - return 1; - - case 'Z': - if(load_table(optarg)) - return 1; - break; default: return 1; @@ -2586,6 +2655,7 @@ return 0; } +#ifdef HAVE_SIGNAL static RETSIGTYPE sigterm_exit(int sig) { char s[4]; @@ -2599,13 +2669,19 @@ s[1] = "0123456789abcdef"[sig & 0xf]; s[2] = '\n'; write(2, s, 3); - safe_exit(1); + + if(sig == SIGINT) + intr = 1; + else + safe_exit(1); } +#endif /* HAVE_SIGNAL */ MAIN_INTERFACE void timidity_start_initialize(void) { int i; static int drums[] = DEFAULT_DRUMCHANNELS; + static int is_first = 1; #if defined(__FreeBSD__) fp_except_t fpexp; @@ -2613,6 +2689,13 @@ fpsetmask(fpexp & ~FP_X_INV); #endif + if(!output_text_code) + output_text_code = safe_strdup(OUTPUT_TEXT_CODE); + if(!opt_aq_max_buff) + opt_aq_max_buff = safe_strdup("5.0"); + if(!opt_aq_fill_buff) + opt_aq_fill_buff = safe_strdup("100%"); + /* Check the byte order */ i = 1; #ifdef LITTLE_ENDIAN @@ -2626,53 +2709,64 @@ } memset(&quietchannels, 0, sizeof(ChannelBitMask)); - memset(&drumchannels, 0, sizeof(ChannelBitMask)); + memset(&default_drumchannels, 0, sizeof(ChannelBitMask)); for(i = 0; drums[i] > 0; i++) - SET_CHANNELMASK(drumchannels, drums[i] - 1); + SET_CHANNELMASK(default_drumchannels, drums[i] - 1); #if MAX_CHANNELS > 16 for(i = 16; i < MAX_CHANNELS; i++) - if(IS_SET_CHANNELMASK(drumchannels, i & 0xF)) - SET_CHANNELMASK(drumchannels, i); + if(IS_SET_CHANNELMASK(default_drumchannels, i & 0xF)) + SET_CHANNELMASK(default_drumchannels, i); #endif - got_a_configuration = 0; if(program_name == NULL) program_name = "TiMidity"; - -#ifdef SUPPORT_SOCKET - init_mail_addr(); - if(url_user_agent == NULL) + uudecode_unquote_html = 1; + for(i = 0; i < MAX_CHANNELS; i++) { - url_user_agent = (char *)safe_malloc(10 + strlen(timidity_version)); - strcpy(url_user_agent, "TiMidity-"); - strcat(url_user_agent, timidity_version); + default_program[i] = DEFAULT_PROGRAM; + memset(channel[i].drums, 0, sizeof(channel[i].drums)); } + + if(is_first) /* initialize once time */ + { + got_a_configuration = 0; + +#ifdef SUPPORT_SOCKET + init_mail_addr(); + if(url_user_agent == NULL) + { + url_user_agent = + (char *)safe_malloc(10 + strlen(timidity_version)); + strcpy(url_user_agent, "TiMidity-"); + strcat(url_user_agent, timidity_version); + } #endif /* SUPPORT_SOCKET */ - for(i = 0; url_module_list[i]; i++) - url_add_module(url_module_list[i]); - init_string_table(&opt_config_string); - init_tables(); - uudecode_unquote_html = 1; + for(i = 0; url_module_list[i]; i++) + url_add_module(url_module_list[i]); + init_string_table(&opt_config_string); + init_tables(); #ifdef SUPPORT_SOCKET - url_news_connection_cache(URL_NEWS_CONN_CACHE); + url_news_connection_cache(URL_NEWS_CONN_CACHE); #endif /* SUPPORT_SOCKET */ - init_midi_trace(); - int_rand(-1); /* initialize random seed */ - int_rand(42); /* the 1st number generated is not very random */ - for(i = 0; i < NSPECIAL_PATCH; i++) - special_patch[i] = NULL; - for(i = 0; i < MAX_CHANNELS; i++) - { - default_program[i] = DEFAULT_PROGRAM; - memset(channel[i].drums, 0, sizeof(channel[i].drums)); + for(i = 0; i < NSPECIAL_PATCH; i++) + special_patch[i] = NULL; + init_midi_trace(); + int_rand(-1); /* initialize random seed */ + int_rand(42); /* the 1st number generated is not very random */ } + + is_first = 0; } MAIN_INTERFACE int timidity_pre_load_configuration(void) { -#ifdef __W32__ +#ifdef IA_W32GUI + extern char *ConfigFile; + if(!read_config_file(ConfigFile, 0)) + got_a_configuration=1; +#elif defined(__W32__) char *strp; int check; char local[1024]; @@ -2745,14 +2839,14 @@ play_mode->rate = DEFAULT_RATE; /* save defaults */ - memcpy(&default_drumchannels, &drumchannels, sizeof(ChannelBitMask)); - memcpy(&default_drumchannel_mask, &drumchannel_mask, + memcpy(&drumchannels, &default_drumchannels, sizeof(ChannelBitMask)); + memcpy(&drumchannel_mask, &default_drumchannel_mask, sizeof(ChannelBitMask)); - if(buffer_fragments != -1) + if(opt_buffer_fragments != -1) { if(play_mode->flag & PF_BUFF_FRAGM_OPT) - play_mode->extra_param[0] = buffer_fragments; + play_mode->extra_param[0] = opt_buffer_fragments; else ctl->cmsg(CMSG_WARNING, VERB_NORMAL, "%s: -B option is ignored", play_mode->id_name); @@ -2767,7 +2861,7 @@ #endif /* SOUNDSPEC */ } -MAIN_INTERFACE void timidity_init_aq_buff(void) +void timidity_init_aq_buff(void) { double time1, /* max buffer */ time2, /* init filled */ @@ -2832,6 +2926,11 @@ { #endif /* BORLANDC_EXCEPTION */ #ifdef __W32__ +#ifdef HAVE_SIGNAL + signal(SIGINT, sigterm_exit); + signal(SIGTERM, sigterm_exit); +#endif + ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY, "Initialize for Critical Section"); SetConsoleCtrlHandler (handler, TRUE); @@ -2841,6 +2940,7 @@ THREAD_PRIORITY_ABOVE_NORMAL)) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Error raising process priority"); + #else /* UNIX */ #ifdef HAVE_SIGNAL @@ -2885,8 +2985,6 @@ if(*def_instr_name) set_default_instrument(def_instr_name); - trace_nodelay(!ctl->trace_playing); - if(ctl->flags & CTLF_LIST_RANDOM) randomize_string_list(files, nfiles); else if(ctl->flags & CTLF_LIST_SORT) @@ -2895,6 +2993,7 @@ /* Return only when quitting */ ctl->cmsg(CMSG_INFO, VERB_DEBUG_SILLY, "pass_playing_list() nfiles=%d", nfiles); + ctl->pass_playing_list(nfiles, files); #ifdef XP_UNIX @@ -2932,15 +3031,10 @@ #ifdef SUPPORT_SOCKET url_news_connection_cache(URL_NEWS_CLOSE_CACHE); #endif /* SUPPORT_SOCKET */ + return 0; } -#ifdef IA_W32GUI -int main(int argc, char **argv) -{ - return w32gui_main(argc, argv); -} -#else #ifndef __MACOS__ #ifdef __W32__ int __cdecl main(int argc, char **argv) @@ -2973,22 +3067,33 @@ setreuid(uid, uid); #endif +#if 0 /* For console redirect */ + memcpy(stdout, fopen("/tmp/console", "a"), sizeof(*_iob)); + memcpy(stderr, stdout, sizeof(*_iob)); + printf("## TiMidity++ starts\n"); + { int i; + for(i = 0; i < argc; i++) + printf("[%d]: <%s>\n", i, argv[i]); + } + fflush(stdout); +#endif + #ifdef main -{ - static int maincnt = 0; - if(maincnt++ > 0) { - argv++; - argc--; - while(argv[0][0] == '-') { + static int maincnt = 0; + if(maincnt++ > 0) + { argv++; argc--; + while(argv[0][0] == '-') { + argv++; + argc--; + } + ctl->pass_playing_list(argc, argv); + return 0; } - ctl->pass_playing_list(argc, argv); - return 0; } -} #endif #ifdef IA_DYNAMIC @@ -3019,6 +3124,20 @@ } timidity_start_initialize(); +#ifdef IA_W32GUI + w32g_initialize(); + for(c = 1; c < argc; c++) + { + if(is_directory(argv[c])) + { + char *p; + p = (char *)safe_malloc(strlen(argv[c]) + 2); + strcpy(p, argv[c]); + directory_form(p); + argv[c] = p; + } + } +#endif if((err = timidity_pre_load_configuration()) != 0) return err; @@ -3049,4 +3168,3 @@ return timidity_play_main(nfiles, files); } #endif /* __MACOS__ */ -#endif diff -ruN TiMidity++-2.2.0/timidity/timidity.h TiMidity++-2.3.0/timidity/timidity.h --- TiMidity++-2.2.0/timidity/timidity.h Sat Jul 17 18:57:20 1999 +++ TiMidity++-2.3.0/timidity/timidity.h Sat Jul 31 16:52:12 1999 @@ -38,9 +38,8 @@ Any file with a name ending in one of these strings will be run through the corresponding decompressor. If you don't like this behavior, you can undefine DECOMPRESSOR_LIST to disable automatic - decompression entirely. + decompression entirely. */ - This is currently ignored for Windows. */ #define DECOMPRESSOR_LIST { \ ".gz", "gunzip -c %s", \ ".bz2", "bunzip2 -c %s", \ @@ -52,14 +51,11 @@ 0 } -/* Define GUS/patch converter. - This is currently ignored for Windows. - */ +/* Define GUS/patch converter. */ #define PATCH_CONVERTERS { \ ".wav", "wav2pat %s", \ 0 } - /* When a patch file can't be opened, one of these extensions is appended to the filename and the open is tried again. @@ -128,7 +124,11 @@ You should probably use a larger number for improved performance. */ +#ifdef __W32__ +#define AUDIO_BUFFER_BITS 12 +#else #define AUDIO_BUFFER_BITS 11 +#endif /* 1000 here will give a control ratio of 22:1 with 22 kHz output. diff -ruN TiMidity++-2.2.0/timidity/timpp32g.ini TiMidity++-2.3.0/timidity/timpp32g.ini --- TiMidity++-2.2.0/timidity/timpp32g.ini Sat Apr 17 21:51:09 1999 +++ TiMidity++-2.3.0/timidity/timpp32g.ini Sat Jul 31 22:20:16 1999 @@ -1,4 +1,5 @@ [PLAYER] +IniVersion=2.0 InitMinimizeFlag=0 DebugWndStartFlag=1 ConsoleWndStartFlag=0 @@ -14,18 +15,14 @@ WrdWndFlag=0 SoundSpecWndFlag=0 SubWindowMax=2 -ConfigFile=\WINDOWS\TIMIDITY.CFG +ConfigFile=C:\WINDOWS\TIMIDITY.CFG PlaylistFile= PlaylistHistoryFile= MidiFileOpenDir= ConfigFileOpenDir= PlaylistFileOpenDir= -ProcessPriority=0 PlayerThreadPriority=0 -MidiPlayerThreadPriority=0 -MainThreadPriority=0 -TracerThreadPriority=0 -WrdThreadPriority=0 +GUIThreadPriority=0 SystemFont=‚l‚r –¾’© PlayerFont=‚l‚r –¾’© WrdFont=‚l‚r –¾’© @@ -44,22 +41,29 @@ DocFileExt= [TIMIDITY] -free_instruments_afterwards=0 -effect_lr_mode=-1 -effect_lr_delay_msec=25 -quietchannels=0 -drumchannels=33554944 -drumchannel_mask=0 +amplification=70 +antialiasing_allowed=0 +buffer_fragments=-1 +control_ratio=0 default_drumchannels=33554944 default_drumchannel_mask=0 -play_mode_id_character=d -play_mode_encoding=6 -pmp_id_character= -OutputName= -antialiasing_allowed=0 +opt_modulation_wheel=1 +opt_portamento=1 +opt_nrpn_vibrato=1 +opt_channel_pressure=0 +opt_trace_text_meta_event=0 +opt_overlap_voice_allow=1 +opt_default_mid=0 +default_tonebank=0 +special_tonebank=-1 +effect_lr_mode=-1 +effect_lr_delay_msec=25 +opt_reverb_control=1 +opt_chorus_control=1 +noise_sharp_type=0 +opt_evil_mode=0 +adjust_panning_immediately=0 fast_decay=0 -adjust_panning_immediately=1 -output_rate=33075 default_program0=0 default_program1=0 default_program2=0 @@ -92,127 +96,17 @@ default_program29=0 default_program30=0 default_program31=0 -amplification=70 -control_ratio=32 -voices=128 +opt_ctl=wla +opt_realtime_playing=0 +reduce_voice_threshold=-1 +opt_playmode=dSs1l +OutputName= +voices=64 +quietchannels=0 +opt_qsize=5.0/100% modify_release=0 -view_soundspec_flag=0 allocate_cache_size=2097152 -allocate_chace_size_string= -ctl_verbosity=1 -ctl_id_character=w -ctl_trace_playing=1 -buffer_fragments=32 +output_rate=33075 output_text_code=SJIS -opt_modulation_wheel=1 -opt_portamento=1 -opt_nrpn_vibrato=1 -opt_reverb_control=1 -opt_chorus_control=1 -opt_chorus_control20=0 -opt_chorus_control21=0 -opt_chorus_control22=0 -opt_chorus_control23=0 -opt_chorus_control24=0 -opt_chorus_control25=0 -opt_chorus_control26=0 -opt_chorus_control27=0 -opt_chorus_control28=0 -opt_chorus_control29=0 -opt_chorus_control210=0 -opt_chorus_control211=0 -opt_chorus_control212=0 -opt_chorus_control213=0 -opt_chorus_control214=0 -opt_chorus_control215=0 -opt_chorus_control216=0 -opt_chorus_control217=0 -opt_chorus_control218=0 -opt_chorus_control219=0 -opt_chorus_control220=0 -opt_chorus_control221=0 -opt_chorus_control222=0 -opt_chorus_control223=0 -opt_chorus_control224=0 -opt_chorus_control225=0 -opt_chorus_control226=0 -opt_chorus_control227=0 -opt_chorus_control228=0 -opt_chorus_control229=0 -opt_chorus_control230=0 -opt_chorus_control231=0 -opt_channel_pressure=0 -opt_trace_text_meta_event=0 -opt_overlap_voice_allow=1 -opt_default_mid=0 -opt_default_mid_str0=0 -opt_default_mid_str1=0 -opt_default_mid_str2=0 -opt_default_mid_str3=0 -opt_default_mid_str4=0 -opt_default_mid_str5=0 -opt_default_mid_str6=0 -opt_default_mid_str7=0 -opt_default_mid_str8=0 -opt_default_mid_str9=0 -opt_default_mid_str10=0 -opt_default_mid_str11=0 -opt_default_mid_str12=0 -opt_default_mid_str13=0 -opt_default_mid_str14=0 -opt_default_mid_str15=0 -opt_default_mid_str16=0 -opt_default_mid_str17=0 -opt_default_mid_str18=0 -opt_default_mid_str19=0 -opt_default_mid_str20=0 -opt_default_mid_str21=0 -opt_default_mid_str22=0 -opt_default_mid_str23=0 -opt_default_mid_str24=0 -opt_default_mid_str25=0 -opt_default_mid_str26=0 -opt_default_mid_str27=0 -opt_default_mid_str28=0 -opt_default_mid_str29=0 -opt_default_mid_str30=0 -opt_default_mid_str31=0 -opt_default_mid_str32=0 -opt_default_mid_str33=0 -opt_default_mid_str34=0 -opt_default_mid_str35=0 -opt_default_mid_str36=0 -opt_default_mid_str37=0 -opt_default_mid_str38=0 -opt_default_mid_str39=0 -opt_default_mid_str40=0 -opt_default_mid_str41=0 -opt_default_mid_str42=0 -opt_default_mid_str43=0 -opt_default_mid_str44=0 -opt_default_mid_str45=0 -opt_default_mid_str46=0 -opt_default_mid_str47=0 -opt_default_mid_str48=0 -opt_default_mid_str49=0 -opt_default_mid_str50=0 -opt_default_mid_str51=0 -opt_default_mid_str52=0 -opt_default_mid_str53=0 -opt_default_mid_str54=0 -opt_default_mid_str55=0 -opt_default_mid_str56=0 -opt_default_mid_str57=0 -opt_default_mid_str58=0 -opt_default_mid_str59=0 -opt_default_mid_str60=0 -opt_default_mid_str61=0 -opt_default_mid_str62=0 -opt_default_mid_str63=0 -default_tonebank=0 -special_tonebank=-1 -opt_realtime_playing=0 -opt_rcpcv_dll=0 -wrdt_id=- -wrdt_open_opts= -noise_sharp_type=0 +free_instruments_afterwards=0 +out_wrd=- diff -ruN TiMidity++-2.2.0/timidity/w32_a.c TiMidity++-2.3.0/timidity/w32_a.c --- TiMidity++-2.2.0/timidity/w32_a.c Sat Apr 17 01:01:55 1999 +++ TiMidity++-2.3.0/timidity/w32_a.c Sat Jul 31 17:17:08 1999 @@ -148,8 +148,9 @@ static struct data_block_t *new_data_block(); static HWAVEOUT dev; -static int nBlocks; +static volatile int nBlocks; static const char *mmerror_code_string(MMRESULT res); +static int msec_per_block; /* export the playback mode */ @@ -174,10 +175,23 @@ static int w32_wave_allowsync = 1; /* waveOutOpen() fdwOpen : WAVE_ALLOWSYNC */ //static int w32_wave_allowsync = 0; -static void wait(void) +static void wait_playing(int all) { - while(nBlocks) - Sleep(0); + if(all) + { + while(nBlocks) + Sleep(msec_per_block); + reset_data_block(); + } + else + { +#ifndef IA_W32GUI + if(ctl->trace_playing) + Sleep(0); + else +#endif /* IA_W32GUI */ + Sleep(msec_per_block); + } } static void CALLBACK wave_callback(HWAVE hWave, UINT uMsg, @@ -306,6 +320,15 @@ } reset_data_block(); dpm.fd = 0; + + /* calc. msec/block */ + msec_per_block = AUDIO_BUFFER_SIZE; + if(!(dpm.encoding & PE_MONO)) + msec_per_block *= 2; + if(dpm.encoding & PE_16BIT) + msec_per_block *= 2; + msec_per_block = msec_per_block * 1000 / dpm.rate; + return warnings; } @@ -327,7 +350,7 @@ { if((block = new_data_block()) == NULL) { - Sleep(0); /* Busy? */ + wait_playing(0); continue; } if(len <= DATA_BLOCK_SIZE) @@ -371,7 +394,7 @@ if(dpm.fd == -1) return; - wait(); + wait_playing(1); waveOutClose(dev); for(i = 0; i < DATA_BLOCK_NUM; i++) @@ -401,8 +424,10 @@ return 0; case PM_REQ_DISCARD: waveOutReset(dev); - wait(); - reset_data_block(); + wait_playing(1); + return 0; + case PM_REQ_FLUSH: + wait_playing(1); return 0; } return -1; diff -ruN TiMidity++-2.2.0/timidity/wave_a.c TiMidity++-2.3.0/timidity/wave_a.c --- TiMidity++-2.2.0/timidity/wave_a.c Sat Mar 6 14:45:10 1999 +++ TiMidity++-2.3.0/timidity/wave_a.c Fri Jul 30 23:59:34 1999 @@ -199,6 +199,7 @@ bytes_output = 0; next_bytes = bytes_output + UPDATE_HEADER_STEP; already_warning_lseek = 0; + return 0; } @@ -276,5 +277,10 @@ static int acntl(int request, void *arg) { + switch(request) + { + case PM_REQ_DISCARD: + return 0; + } return -1; }