1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20 
21 #ifndef ___W32G_H_
22 #define ___W32G_H_
23 
24 #include <process.h>
25 #ifdef RC_NONE
26 #undef RC_NONE
27 #endif
28 #include <windows.h>
29 #ifdef RC_NONE
30 #undef RC_NONE
31 #endif
32 #define RC_NONE	0
33 
34 #define LANGUAGE_JAPANESE				0x0001
35 #define LANGUAGE_ENGLISH				0x0002
36 extern int PlayerLanguage;
37 extern int PlayerMode;
38 
39 
40 #ifndef MAXPATH
41 #define MAXPATH 256
42 #endif /* MAXPATH */
43 
44 
45 typedef struct argc_argv_t_ {
46 	int argc;
47 	char **argv;
48 } argc_argv_t;
49 
50 #if defined(_MSC_VER) || defined(__WATCOMC__)
51 //typedef void (__cdecl *MSVC_BEGINTHREAD_START_ADDRESS)(void *);
52 typedef LPTHREAD_START_ROUTINE MSVC_BEGINTHREAD_START_ADDRESS;
53 #elif defined(_BORLANDC_)
54 // typedef _USERENTRY (*BCC_BEGINTHREAD_START_ADDRESS)(void *);
55 typedef LPTHREAD_START_ROUTINE BCC_BEGINTHREAD_START_ADDRESS;
56 #endif
57 
58 // beginthread for C RUNTIME LIBRARY
59 
60 // HANDLE crt_beginthread(LPTHREAD_START_ROUTINE start_address, DWORD stack_size, LPVOID arglist);
61 #if defined(_MSC_VER) || defined(__WATCOMC__)
62 #define crt_beginthread(start_address,stack_size,arglist) \
63 (HANDLE)_beginthread((MSVC_BEGINTHREAD_START_ADDRESS)start_address,(unsigned)stack_size,(void *)arglist)
64 #elif defined(_BORLANDC_)
65 #define crt_beginthread(start_address,stack_size,arglist) \
66 (HANDLE)_beginthread((BCC_BEGINTHREAD_START_ADDRESS)start_address,(unsigned)stack_size,(void *)arglist)
67 #else
68 #define crt_beginthread(start_address,stack_size,arglist) \
69 (HANDLE)CreateThread(NULL,(DWORD)stack_size,(LPTHREAD_START_ROUTINE)start_address,(LPVOID)arglist,0,&dwTmp)
70 #endif
71 
72 // (HANDLE)crt_beginthreadex(LPSECURITY_ATTRIBUTES security, DWORD stack_size, LPTHREAD_START_ROUTINE start_address, LPVOID arglist, DWORD initflag, LPDWORD thrdaddr );
73 #if defined(_MSC_VER) || defined(__WATCOMC__)
74 #define crt_beginthreadex(security,stack_size,start_address,arglist,initflag,thrdaddr ) \
75 (HANDLE)_beginthreadex((void *)security,(unsigned)stack_size,(MSVC_BEGINTHREAD_START_ADDRESS)start_address,(void *)arglist,(unsigned)initflag,(unsigned *)thrdaddr)
76 #elif defined(_BORLANDC_)
77 #define crt_beginthreadex(security,stack_size,start_address,arglist,initflag,thrdaddr ) \
78 (HANDLE)_beginthreadNT((BCC_BEGINTHREAD_START_ADDRESS)start_address,(unsigned)stack_size,(void *)arglist,(void *)security_attrib,(unsigned long)create_flags,(unsigned long *)thread_id)
79 #else
80 #define crt_beginthreadex(security,stack_size,start_address,arglist,initflag,thrdaddr ) \
81 (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES)security,(DWORD)stack_size,(LPTHREAD_START_ROUTINE)start_address,(LPVOID)arglist,(DWORD)initflag,(LPDWORD)thrdaddr)
82 #endif
83 
84 #if defined(_MSC_VER) || defined(__WATCOMC__)
85 #define crt_endthread() _endthread()
86 #elif defined(_BORLANDC_)
87 #define crt_endthread() _endthread()
88 #else
89 #define crt_endthread() ExitThread(0);
90 #endif
91 
92 #define RANGE(x,min,max) (((x)<(min))?((x)=(min)):(((x)>(max))?((x)=(max)):(x)))
93 
94 #define RC_EXT_BASE 1000
95 enum {
96     RC_EXT_DROP = RC_EXT_BASE,
97     RC_EXT_LOAD_FILE,
98     RC_EXT_LOAD_PLAYLIST,
99     RC_EXT_SAVE_PLAYLIST,
100     RC_EXT_MODE_CHANGE,
101     RC_EXT_APPLY_SETTING,
102     RC_EXT_DELETE_PLAYLIST,
103     RC_EXT_UPDATE_PLAYLIST,
104     RC_EXT_UNIQ_PLAYLIST,
105     RC_EXT_REFINE_PLAYLIST,
106     RC_EXT_JUMP_FILE,
107     RC_EXT_ROTATE_PLAYLIST,
108     RC_EXT_CLEAR_PLAYLIST,
109     RC_EXT_OPEN_DOC,
110     RC_EXT_RESTART_GUI,
111 	RC_EXT_LOAD_FILES_AND_PLAY
112 };
113 
114 #define MAX_W32G_MIDI_CHANNELS	32
115 
116 
117 // Toolbar Macros
118 #define IDM_STOP		2501
119 #define IDM_PAUSE		2502
120 #define IDM_PREV		2503
121 #define IDM_FOREWARD	2504
122 #define IDM_PLAY		2505
123 #define IDM_BACKWARD	2506
124 #define IDM_NEXT		2507
125 
126 #define IDM_CONSOLE		2511
127 #define IDM_LIST		2512
128 #define IDM_TRACER	 	2513
129 #define IDM_DOC			2514
130 #define IDM_WRD			2515
131 #define IDM_SOUNDSPEC	2516
132 
133 
134 #define FLAG_NOTE_OFF	1
135 #define FLAG_NOTE_ON	2
136 
137 #define FLAG_BANK	0x0001
138 #define FLAG_PROG	0x0002
139 #define FLAG_PAN	0x0004
140 #define FLAG_SUST	0x0008
141 
142 #define FLAG_NOTE_OFF	1
143 #define FLAG_NOTE_ON	2
144 
145 #define FLAG_BANK	0x0001
146 #define FLAG_PROG	0x0002
147 #define FLAG_PAN	0x0004
148 #define FLAG_SUST	0x0008
149 
150 typedef struct {
151 	int reset_panel;
152 	int wait_reset;
153 	int multi_part;
154 
155 	char v_flags[MAX_W32G_MIDI_CHANNELS];
156 	int16 cnote[MAX_W32G_MIDI_CHANNELS];
157 	int16 cvel[MAX_W32G_MIDI_CHANNELS];
158 	int16 ctotal[MAX_W32G_MIDI_CHANNELS];
159 	char c_flags[MAX_W32G_MIDI_CHANNELS];
160 	Channel channel[MAX_W32G_MIDI_CHANNELS];
161 
162 	int32 total_time;
163 	int total_time_h;
164 	int total_time_m;
165 	int total_time_s;
166 	int total_time_ss;
167 	int32 cur_time;
168 	int cur_time_h;
169 	int cur_time_m;
170 	int cur_time_s;
171 	int cur_time_ss;
172 	int cur_voices;
173 	int voices;
174 	int upper_voices;
175 	char filename[MAXPATH + 64];
176 	char titlename[MAXPATH + 64];
177 	int filename_setflag;
178 	int titlename_setflag;
179 	int32 master_volume;
180 	int32 master_volume_max;
181 	int meas;
182 	int beat;
183 	char keysig[7];
184 	int key_offset;
185 	int tempo;
186 	int tempo_ratio;
187 	int invalid_flag;
188 
189 	int32 xnote[MAX_W32G_MIDI_CHANNELS][4];
190 	int aq_ratio;
191 
192 	int changed;
193 	char dummy[1024];
194 
195 	int8 GSLCD[20][16];
196 	double gslcd_last_display_time;
197 	int8 gslcd_displayed_flag;
198 } PanelInfo;
199 extern PanelInfo *Panel;
200 
201 #define PANELRESET_TIME			0x0001
202 #define PANELRESET_CHANNEL		0x0002
203 #define PANELRESET_MIDIINFO	0x0004
204 #define PANELRESET_MISC			0x0008
205 #define PANELRESET_EFFECT		0x0010
206 
207 
208 #define CANVAS_MODE_GSLCD		0x0001
209 #define CANVAS_MODE_MAP16		0x0002
210 #define CANVAS_MODE_MAP32		0x0003
211 #define CANVAS_MODE_KBD_A		0x0004
212 #define CANVAS_MODE_KBD_B		0x0005
213 #define CANVAS_MODE_SLEEP		0x0006
214 
215 #if 0
216 #define TMCCC_BLACK	RGB(0x00,0x00,0x00)
217 #define TMCCC_WHITE	RGB(0xff,0xff,0xff)
218 #define TMCCC_RED	RGB(0xff,0x00,0x00)
219 
220 #define TMCCC_FORE	TMCCC_BLACK // Aliased
221 #define TMCCC_BACK 	RGB(0x00, 0xf0, 0x00)
222 #define TMCCC_LOW	RGB(0x80, 0xd0, 0x00)
223 #define TMCCC_MIDDLE	RGB(0xb0, 0xb0, 0x00)
224 #define TMCCC_HIGH	RGB(0xe0, 0x00, 0x00)
225 
226 enum {
227     TMCC_BLACK, // Aliased FORE
228     TMCC_WHITE,
229     TMCC_RED,
230     TMCC_BACK,
231     TMCC_LOW,
232     TMCC_MIDDLE,
233     TMCC_HIGH,
234     TMCC_FORE_HALF,
235     TMCC_LOW_HALF,
236     TMCC_MIDDLE_HALF,
237     TMCC_HIGH_HALF,
238     TMCC_FORE_WEAKHALF,
239     TMCC_SIZE
240 };
241 #define TMCC_FORE TMCC_BLACK // Aliased
242 
243 typedef struct _TmColors {
244     COLORREF color;
245     HPEN pen;
246     HBRUSH brush;
247 } TmColors;
248 #endif
249 
250 /* w32g_i.c */
251 extern int w32g_open(void);
252 extern void w32g_close(void);
253 extern void w32g_send_rc(int rc, ptr_size_t value);
254 extern int w32g_get_rc(ptr_size_t *value, int wait_if_empty);
255 extern void w32g_lock(void);
256 extern void w32g_unlock(void);
257 extern void MainWndScrollbarProgressUpdate(int sec);
258 extern void PutsConsoleWnd(char *str);
259 extern void w32g_ctle_play_start(int sec);
260 extern void SettingWndApply(void);
261 extern int w32g_lock_open_file;
262 extern void w32g_i_init(void);
263 extern void CanvasChange(int mode);
264 extern HINSTANCE hInst;
265 extern void w32g_show_console(void);
266 extern void MPanelStartLoad(char *filename);
267 
268 
269 /* w32g_utl.c */
270 
271 /* w32g_playlist.c */
272 extern int w32g_add_playlist(int nfiles, char **files, int expand_flag,
273 			     int autouniq, int autorefine);
274 extern char *w32g_get_playlist(int idx);
275 extern int w32g_next_playlist(int skip_invalid_file);
276 extern int w32g_prev_playlist(int skip_invalid_file);
277 extern int w32g_random_playlist(int skip_invalid_file);
278 extern int w32g_shuffle_playlist_reset(int preserve);
279 extern int w32g_shuffle_playlist_next(int skip_invalid_file);
280 extern void w32g_first_playlist(int skip_invalid_file);
281 extern int w32g_isempty_playlist(void);
282 extern char *w32g_curr_playlist(void);
283 extern void w32g_update_playlist(void);
284 extern void w32g_get_playlist_index(int *selected, int *nfiles, int *cursel);
285 extern int w32g_goto_playlist(int num, int skip_invalid_file);
286 extern int w32g_delete_playlist(int pos);
287 extern int w32g_nvalid_playlist(void);
288 extern int w32g_ismidi_playlist(int n);
289 extern void w32g_setcur_playlist(void);
290 extern int w32g_refine_playlist(int *is_selected_removed);
291 extern int w32g_uniq_playlist(int *is_selected_removed);
292 extern void w32g_clear_playlist(void);
293 extern void w32g_rotate_playlist(int dest);
294 void w32g_free_playlist(void);
295 
296 #if 0
297 /* w32g_panel.c */
298 extern void w32g_init_panel(HWND hwnd);
299 extern void TmPanelStartToLoad(char *filename);
300 extern void TmPanelStartToPlay(int total_sec);
301 extern void TmPanelSetVoices(int v);
302 //extern void TmPanelInit(HWND hwnd);
303 extern void TmPanelRefresh(void);
304 extern void TmPanelSetTime(int sec);
305 extern void TmPanelSetMasterVol(int v);
306 extern void TmPanelUpdateList(void);
307 
308 /* w32g_canvas.c */
309 extern void w32g_init_canvas(HWND hwnd);
310 extern void TmCanvasRefresh(void);
311 extern void TmCanvasReset(void);
312 extern void TmCanvasNote(int status, int ch, int note, int vel);
313 extern int TmCanvasChange(void);
314 extern void TmCanvasUpdateInterval();
315 extern int TmCanvasMode;
316 #endif
317 
318 /* w32g_c.c */
319 extern volatile int w32g_play_active;
320 extern int w32g_current_volume[/* MAX_CHANNELS */];
321 extern int w32g_current_expression[/* MAX_CHANNELS */];
322 extern volatile int w32g_restart_gui_flag;
323 
324 
325 void PrefSettingApplyReally(void);
326 
327 
328 
329 // flags
330 extern int InitMinimizeFlag;
331 extern int DebugWndStartFlag;
332 extern int ConsoleWndStartFlag;
333 extern int ListWndStartFlag;
334 extern int TracerWndStartFlag;
335 extern int DocWndStartFlag;
336 extern int WrdWndStartFlag;
337 extern int DebugWndFlag;
338 extern int ConsoleWndFlag;
339 extern int ListWndFlag;
340 extern int TracerWndFlag;
341 extern int DocWndFlag;
342 extern int WrdWndFlag;
343 extern int SoundSpecWndFlag;
344 
345 extern int SubWindowMax;
346 
347 extern char *IniFile;
348 extern char *ConfigFile;
349 extern char *PlaylistFile;
350 extern char *PlaylistHistoryFile;
351 extern char *MidiFileOpenDir;
352 extern char *ConfigFileOpenDir;
353 extern char *PlaylistFileOpenDir;
354 
355 extern int PlayerThreadPriority;
356 extern int GUIThreadPriority;
357 
358 extern int WrdGraphicFlag;
359 extern int TraceGraphicFlag;
360 extern int DocMaxSize;
361 extern char *DocFileExt;
362 
363 extern int w32g_has_ini_file;
364 extern char *w32g_output_dir;
365 extern int w32g_auto_output_mode;
366 
367 // HWND
368 extern HWND hMainWnd;
369 extern HWND hDebugWnd;
370 extern HWND hConsoleWnd;
371 extern HWND hTracerWnd;
372 extern HWND hDocWnd;
373 extern HWND hListWnd;
374 extern HWND hWrdWnd;
375 extern HWND hSoundSpecWnd;
376 extern HWND hDebugEditWnd;
377 extern HWND hDocEditWnd;
378 
379 // gdi_lock
380 extern int gdi_lock(void);
381 extern int gdi_unlock(void);
382 #define GDI_SAFETY(command) (gdi_lock(),(command),gdi_unlock);
383 
384 #define W32G_RANDOM_IS_SHUFFLE
385 
386 #ifndef BELOW_NORMAL_PRIORITY_CLASS	/* VC6.0 doesn't support them. */
387 #define BELOW_NORMAL_PRIORITY_CLASS 0x4000
388 #define ABOVE_NORMAL_PRIORITY_CLASS 0x8000
389 #endif /* BELOW_NORMAL_PRIORITY_CLASS */
390 
391 #endif
392