1 #ifndef APE_ALL_H
2 #define APE_ALL_H
3
4 #include "config.h"
5 #include "MACUtils.h"
6
7 /*****************************************************************************************
8 Unicode
9 *****************************************************************************************/
10 #ifdef _UNICODE
11
12 #else
13
14 #endif // #ifdef _UNICODE
15
16
17 /*****************************************************************************************
18 Global includes
19 *****************************************************************************************/
20 #ifndef BUILD_CROSS_PLATFORM
21 #include <windows.h>
22 #endif
23
24 #ifdef _WIN32
25 #include <mmsystem.h>
26 #include <tchar.h>
27 #else
28 #include <unistd.h>
29 #include <time.h>
30 #include <sys/time.h>
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <wchar.h>
34 #include "NoWindows.h"
35 #endif
36
37 #include <stdlib.h>
38 #include <memory.h>
39 #include <stdio.h>
40 #include <math.h>
41 #include <string.h>
42 #include "SmartPtr.h"
43
44 /*****************************************************************************************
45 Global compiler settings (useful for porting)
46 *****************************************************************************************/
47
48 #define ENABLE_COMPRESSION_MODE_FAST
49 #define ENABLE_COMPRESSION_MODE_NORMAL
50 #define ENABLE_COMPRESSION_MODE_HIGH
51 #define ENABLE_COMPRESSION_MODE_EXTRA_HIGH
52
53 #ifdef _WIN32
54 typedef unsigned __int32 uint32;
55 typedef __int32 int32;
56 typedef unsigned __int16 uint16;
57 typedef __int16 int16;
58 typedef unsigned __int8 uint8;
59 typedef __int8 int8;
60 typedef long long int64;
61 typedef unsigned long long uint64;
62 typedef char str_ansi;
63 typedef unsigned char str_utf8;
64 typedef wchar_t str_utf16;
65
66 #define IO_USE_WIN_FILE_IO
67 #define IO_HEADER_FILE "WinFileIO.h"
68 #define IO_CLASS_NAME CWinFileIO
69 #define DLLEXPORT __declspec(dllexport)
70 #define SLEEP(MILLISECONDS) ::Sleep(MILLISECONDS)
71 #define MESSAGEBOX(PARENT, TEXT, CAPTION, TYPE) ::MessageBox(PARENT, TEXT, CAPTION, TYPE)
72 #define PUMP_MESSAGE_LOOP { MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) != 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } }
73 #define ODS OutputDebugString
74 #define TICK_COUNT_TYPE unsigned long
75 #define TICK_COUNT_READ(VARIABLE) VARIABLE = GetTickCount()
76 #define TICK_COUNT_FREQ 1000
77 #else
78 #define IO_USE_STD_LIB_FILE_IO
79 #define IO_HEADER_FILE "StdLibFileIO.h"
80 #define IO_CLASS_NAME CStdLibFileIO
81 #define DLLEXPORT
82 #define SLEEP(MILLISECONDS) { struct timespec t; t.tv_sec = (MILLISECONDS) / 1000; t.tv_nsec = (MILLISECONDS) % 1000 * 1000000; nanosleep(&t, NULL); }
83 #define MESSAGEBOX(PARENT, TEXT, CAPTION, TYPE)
84 #define PUMP_MESSAGE_LOOP
85 #define ODS printf
86 #define TICK_COUNT_TYPE unsigned long long
87 #define TICK_COUNT_READ(VARIABLE) { struct timeval t; gettimeofday(&t, NULL); VARIABLE = t.tv_sec * 1000000LLU + t.tv_usec; }
88 #define TICK_COUNT_FREQ 1000000
89 #endif
90
91 #ifdef IS_64BIT
92 /*
93 typedef uint64 ptr_t;
94 typedef int64 intptr_t;
95 typedef uint64 uintptr_t;
96 */
97 #else
98 /*
99 typedef uint32 prt_t;
100 typedef int32 intptr_t;
101 typedef uint32 uintptr_t;
102 */
103 #endif
104
105 /*****************************************************************************************
106 Global defines
107 *****************************************************************************************/
108 #define MAC_VERSION_NUMBER 3990
109 #define MAC_VERSION_STRING _T("3.99")
110 #define MAC_NAME _T("Monkey's Audio 3.99")
111 #define PLUGIN_NAME "Monkey's Audio Player v3.99"
112 #define MJ_PLUGIN_NAME _T("APE Plugin (v3.99)")
113 #ifdef SHNTOOL
114 #define CONSOLE_NAME "-- Monkey's Audio Console Front End (v " VERSION ") (c) Matthew T. Ashland --\n"
115 #else
116 #define CONSOLE_NAME "--- Monkey's Audio Console Front End (v 3.99) (c) Matthew T. Ashland ---\n"
117 #endif
118 #define PLUGIN_ABOUT _T("Monkey's Audio Player v3.99\nCopyrighted (c) 2000-2004 by Matthew T. Ashland")
119 #define MAC_DLL_INTERFACE_VERSION_NUMBER 1000
120
121 /*****************************************************************************************
122 Byte order
123 *****************************************************************************************/
124 #if defined(__DragonFly__)
125 #include <sys/endian.h>
126 #endif
127
128 #ifndef __LITTLE_ENDIAN
129 #define __LITTLE_ENDIAN 1234
130 #endif
131 #ifndef __BIG_ENDIAN
132 #define __BIG_ENDIAN 4321
133 #endif
134
135 #ifdef WORDS_BIGENDIAN
136
137 #ifndef __BYTE_ORDER
138 #define __BYTE_ORDER __BIG_ENDIAN
139 #endif
140
141 #else
142
143 #ifndef __BYTE_ORDER
144 #define __BYTE_ORDER __LITTLE_ENDIAN
145 #endif
146
147 #endif
148
149 #ifdef WORDS_BIGENDIAN
150
swap_int16(int16 x)151 static inline int16 swap_int16(int16 x)
152 {
153 int16 y = x;
154
155 #if __BYTE_ORDER == __BIG_ENDIAN
156 y = ((x & 0x00ff) << 8) |
157 ((x & 0xff00) >> 8);
158 #endif
159 return y;
160 }
161
swap_int32(int32 x)162 static inline int32 swap_int32(int32 x)
163 {
164 int32 y = x;
165
166 #if __BYTE_ORDER == __BIG_ENDIAN
167 y = ((x & 0x000000ff) << 24) |
168 ((x & 0x0000ff00) << 8) |
169 ((x & 0x00ff0000) >> 8) |
170 ((x & 0xff000000) >> 24);
171 #endif
172 return y;
173 }
174
175 #else
176
177 #define swap_int16(a) (a)
178 #define swap_int32(a) (a)
179
180 #endif
181
182 /*****************************************************************************************
183 Macros
184 *****************************************************************************************/
185 #define MB(TEST) MESSAGEBOX(NULL, TEST, _T("Information"), MB_OK);
186 #define MBN(NUMBER) { TCHAR cNumber[16]; _stprintf(cNumber, _T("%d"), NUMBER); MESSAGEBOX(NULL, cNumber, _T("Information"), MB_OK); }
187
188 #define SAFE_DELETE(POINTER) if (POINTER) { delete POINTER; POINTER = NULL; }
189 #define SAFE_ARRAY_DELETE(POINTER) if (POINTER) { delete [] POINTER; POINTER = NULL; }
190 #define SAFE_VOID_CLASS_DELETE(POINTER, Class) { Class *pClass = (Class *) POINTER; if (pClass) { delete pClass; POINTER = NULL; } }
191 #define SAFE_FILE_CLOSE(HANDLE) if (HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = INVALID_HANDLE_VALUE; }
192
193 #define ODN(NUMBER) { TCHAR cNumber[16]; _stprintf(cNumber, _T("%d\n"), int(NUMBER)); ODS(cNumber); }
194
195 #define CATCH_ERRORS(CODE) try { CODE } catch(...) { }
196
197 #define RETURN_ON_ERROR(FUNCTION) { int nRetVal = FUNCTION; if (nRetVal != 0) { return nRetVal; } }
198 #define RETURN_VALUE_ON_ERROR(FUNCTION, VALUE) { int nRetVal = FUNCTION; if (nRetVal != 0) { return VALUE; } }
199 #define RETURN_ON_EXCEPTION(CODE, VALUE) { try { CODE } catch(...) { return VALUE; } }
200
201 #define THROW_ON_ERROR(CODE) { int nRetVal = CODE; if (nRetVal != 0) throw(nRetVal); }
202
203 #define EXPAND_1_TIMES(CODE) CODE
204 #define EXPAND_2_TIMES(CODE) CODE CODE
205 #define EXPAND_3_TIMES(CODE) CODE CODE CODE
206 #define EXPAND_4_TIMES(CODE) CODE CODE CODE CODE
207 #define EXPAND_5_TIMES(CODE) CODE CODE CODE CODE CODE
208 #define EXPAND_6_TIMES(CODE) CODE CODE CODE CODE CODE CODE
209 #define EXPAND_7_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE
210 #define EXPAND_8_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE
211 #define EXPAND_9_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE
212 #define EXPAND_12_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
213 #define EXPAND_14_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
214 #define EXPAND_15_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
215 #define EXPAND_16_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
216 #define EXPAND_30_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
217 #define EXPAND_31_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
218 #define EXPAND_32_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
219 #define EXPAND_64_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
220 #define EXPAND_N_TIMES(NUMBER, CODE) EXPAND_##NUMBER##_TIMES(CODE)
221
222 #define UNROLL_4_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3)
223 #define UNROLL_8_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7)
224 #define UNROLL_15_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7) MACRO(8) MACRO(9) MACRO(10) MACRO(11) MACRO(12) MACRO(13) MACRO(14)
225 #define UNROLL_16_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7) MACRO(8) MACRO(9) MACRO(10) MACRO(11) MACRO(12) MACRO(13) MACRO(14) MACRO(15)
226 #define UNROLL_64_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7) MACRO(8) MACRO(9) MACRO(10) MACRO(11) MACRO(12) MACRO(13) MACRO(14) MACRO(15) MACRO(16) MACRO(17) MACRO(18) MACRO(19) MACRO(20) MACRO(21) MACRO(22) MACRO(23) MACRO(24) MACRO(25) MACRO(26) MACRO(27) MACRO(28) MACRO(29) MACRO(30) MACRO(31) MACRO(32) MACRO(33) MACRO(34) MACRO(35) MACRO(36) MACRO(37) MACRO(38) MACRO(39) MACRO(40) MACRO(41) MACRO(42) MACRO(43) MACRO(44) MACRO(45) MACRO(46) MACRO(47) MACRO(48) MACRO(49) MACRO(50) MACRO(51) MACRO(52) MACRO(53) MACRO(54) MACRO(55) MACRO(56) MACRO(57) MACRO(58) MACRO(59) MACRO(60) MACRO(61) MACRO(62) MACRO(63)
227 #define UNROLL_128_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7) MACRO(8) MACRO(9) MACRO(10) MACRO(11) MACRO(12) MACRO(13) MACRO(14) MACRO(15) MACRO(16) MACRO(17) MACRO(18) MACRO(19) MACRO(20) MACRO(21) MACRO(22) MACRO(23) MACRO(24) MACRO(25) MACRO(26) MACRO(27) MACRO(28) MACRO(29) MACRO(30) MACRO(31) MACRO(32) MACRO(33) MACRO(34) MACRO(35) MACRO(36) MACRO(37) MACRO(38) MACRO(39) MACRO(40) MACRO(41) MACRO(42) MACRO(43) MACRO(44) MACRO(45) MACRO(46) MACRO(47) MACRO(48) MACRO(49) MACRO(50) MACRO(51) MACRO(52) MACRO(53) MACRO(54) MACRO(55) MACRO(56) MACRO(57) MACRO(58) MACRO(59) MACRO(60) MACRO(61) MACRO(62) MACRO(63) MACRO(64) MACRO(65) MACRO(66) MACRO(67) MACRO(68) MACRO(69) MACRO(70) MACRO(71) MACRO(72) MACRO(73) MACRO(74) MACRO(75) MACRO(76) MACRO(77) MACRO(78) MACRO(79) MACRO(80) MACRO(81) MACRO(82) MACRO(83) MACRO(84) MACRO(85) MACRO(86) MACRO(87) MACRO(88) MACRO(89) MACRO(90) MACRO(91) MACRO(92) MACRO(93) MACRO(94) MACRO(95) MACRO(96) MACRO(97) MACRO(98) MACRO(99) MACRO(100) MACRO(101) MACRO(102) MACRO(103) MACRO(104) MACRO(105) MACRO(106) MACRO(107) MACRO(108) MACRO(109) MACRO(110) MACRO(111) MACRO(112) MACRO(113) MACRO(114) MACRO(115) MACRO(116) MACRO(117) MACRO(118) MACRO(119) MACRO(120) MACRO(121) MACRO(122) MACRO(123) MACRO(124) MACRO(125) MACRO(126) MACRO(127)
228 #define UNROLL_256_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7) MACRO(8) MACRO(9) MACRO(10) MACRO(11) MACRO(12) MACRO(13) MACRO(14) MACRO(15) MACRO(16) MACRO(17) MACRO(18) MACRO(19) MACRO(20) MACRO(21) MACRO(22) MACRO(23) MACRO(24) MACRO(25) MACRO(26) MACRO(27) MACRO(28) MACRO(29) MACRO(30) MACRO(31) MACRO(32) MACRO(33) MACRO(34) MACRO(35) MACRO(36) MACRO(37) MACRO(38) MACRO(39) MACRO(40) MACRO(41) MACRO(42) MACRO(43) MACRO(44) MACRO(45) MACRO(46) MACRO(47) MACRO(48) MACRO(49) MACRO(50) MACRO(51) MACRO(52) MACRO(53) MACRO(54) MACRO(55) MACRO(56) MACRO(57) MACRO(58) MACRO(59) MACRO(60) MACRO(61) MACRO(62) MACRO(63) MACRO(64) MACRO(65) MACRO(66) MACRO(67) MACRO(68) MACRO(69) MACRO(70) MACRO(71) MACRO(72) MACRO(73) MACRO(74) MACRO(75) MACRO(76) MACRO(77) MACRO(78) MACRO(79) MACRO(80) MACRO(81) MACRO(82) MACRO(83) MACRO(84) MACRO(85) MACRO(86) MACRO(87) MACRO(88) MACRO(89) MACRO(90) MACRO(91) MACRO(92) MACRO(93) MACRO(94) MACRO(95) MACRO(96) MACRO(97) MACRO(98) MACRO(99) MACRO(100) MACRO(101) MACRO(102) MACRO(103) MACRO(104) MACRO(105) MACRO(106) MACRO(107) MACRO(108) MACRO(109) MACRO(110) MACRO(111) MACRO(112) MACRO(113) MACRO(114) MACRO(115) MACRO(116) MACRO(117) MACRO(118) MACRO(119) MACRO(120) MACRO(121) MACRO(122) MACRO(123) MACRO(124) MACRO(125) MACRO(126) MACRO(127) \
229 MACRO(128) MACRO(129) MACRO(130) MACRO(131) MACRO(132) MACRO(133) MACRO(134) MACRO(135) MACRO(136) MACRO(137) MACRO(138) MACRO(139) MACRO(140) MACRO(141) MACRO(142) MACRO(143) MACRO(144) MACRO(145) MACRO(146) MACRO(147) MACRO(148) MACRO(149) MACRO(150) MACRO(151) MACRO(152) MACRO(153) MACRO(154) MACRO(155) MACRO(156) MACRO(157) MACRO(158) MACRO(159) MACRO(160) MACRO(161) MACRO(162) MACRO(163) MACRO(164) MACRO(165) MACRO(166) MACRO(167) MACRO(168) MACRO(169) MACRO(170) MACRO(171) MACRO(172) MACRO(173) MACRO(174) MACRO(175) MACRO(176) MACRO(177) MACRO(178) MACRO(179) MACRO(180) MACRO(181) MACRO(182) MACRO(183) MACRO(184) MACRO(185) MACRO(186) MACRO(187) MACRO(188) MACRO(189) MACRO(190) MACRO(191) MACRO(192) MACRO(193) MACRO(194) MACRO(195) MACRO(196) MACRO(197) MACRO(198) MACRO(199) MACRO(200) MACRO(201) MACRO(202) MACRO(203) MACRO(204) MACRO(205) MACRO(206) MACRO(207) MACRO(208) MACRO(209) MACRO(210) MACRO(211) MACRO(212) MACRO(213) MACRO(214) MACRO(215) MACRO(216) MACRO(217) MACRO(218) MACRO(219) MACRO(220) MACRO(221) MACRO(222) MACRO(223) MACRO(224) MACRO(225) MACRO(226) MACRO(227) MACRO(228) MACRO(229) MACRO(230) MACRO(231) MACRO(232) MACRO(233) MACRO(234) MACRO(235) MACRO(236) MACRO(237) MACRO(238) MACRO(239) MACRO(240) MACRO(241) MACRO(242) MACRO(243) MACRO(244) MACRO(245) MACRO(246) MACRO(247) MACRO(248) MACRO(249) MACRO(250) MACRO(251) MACRO(252) MACRO(253) MACRO(254) MACRO(255)
230
231 /*****************************************************************************************
232 Error Codes
233 *****************************************************************************************/
234
235 // success
236 #ifndef ERROR_SUCCESS
237 #define ERROR_SUCCESS 0
238 #endif
239
240 // file and i/o errors (1000's)
241 #define ERROR_IO_READ 1000
242 #define ERROR_IO_WRITE 1001
243 #define ERROR_INVALID_INPUT_FILE 1002
244 #define ERROR_INVALID_OUTPUT_FILE 1003
245 #define ERROR_INPUT_FILE_TOO_LARGE 1004
246 #define ERROR_INPUT_FILE_UNSUPPORTED_BIT_DEPTH 1005
247 #define ERROR_INPUT_FILE_UNSUPPORTED_SAMPLE_RATE 1006
248 #define ERROR_INPUT_FILE_UNSUPPORTED_CHANNEL_COUNT 1007
249 #define ERROR_INPUT_FILE_TOO_SMALL 1008
250 #define ERROR_INVALID_CHECKSUM 1009
251 #define ERROR_DECOMPRESSING_FRAME 1010
252 #define ERROR_INITIALIZING_UNMAC 1011
253 #define ERROR_INVALID_FUNCTION_PARAMETER 1012
254 #define ERROR_UNSUPPORTED_FILE_TYPE 1013
255 #define ERROR_UPSUPPORTED_FILE_VERSION 1014
256
257 // memory errors (2000's)
258 #define ERROR_INSUFFICIENT_MEMORY 2000
259
260 // dll errors (3000's)
261 #define ERROR_LOADINGAPE_DLL 3000
262 #define ERROR_LOADINGAPE_INFO_DLL 3001
263 #define ERROR_LOADING_UNMAC_DLL 3002
264
265 // general and misc errors
266 #define ERROR_USER_STOPPED_PROCESSING 4000
267 #define ERROR_SKIPPED 4001
268
269 // programmer errors
270 #define ERROR_BAD_PARAMETER 5000
271
272 // IAPECompress errors
273 #define ERROR_APE_COMPRESS_TOO_MUCH_DATA 6000
274
275 // unknown error
276 #define ERROR_UNDEFINED -1
277
278 #define ERROR_EXPLANATION \
279 { ERROR_IO_READ , "I/O read error" }, \
280 { ERROR_IO_WRITE , "I/O write error" }, \
281 { ERROR_INVALID_INPUT_FILE , "invalid input file" }, \
282 { ERROR_INVALID_OUTPUT_FILE , "invalid output file" }, \
283 { ERROR_INPUT_FILE_TOO_LARGE , "input file file too large" }, \
284 { ERROR_INPUT_FILE_UNSUPPORTED_BIT_DEPTH , "input file unsupported bit depth" }, \
285 { ERROR_INPUT_FILE_UNSUPPORTED_SAMPLE_RATE , "input file unsupported sample rate" }, \
286 { ERROR_INPUT_FILE_UNSUPPORTED_CHANNEL_COUNT , "input file unsupported channel count" }, \
287 { ERROR_INPUT_FILE_TOO_SMALL , "input file too small" }, \
288 { ERROR_INVALID_CHECKSUM , "invalid checksum" }, \
289 { ERROR_DECOMPRESSING_FRAME , "decompressing frame" }, \
290 { ERROR_INITIALIZING_UNMAC , "initializing unmac" }, \
291 { ERROR_INVALID_FUNCTION_PARAMETER , "invalid function parameter" }, \
292 { ERROR_UNSUPPORTED_FILE_TYPE , "unsupported file type" }, \
293 { ERROR_INSUFFICIENT_MEMORY , "insufficient memory" }, \
294 { ERROR_LOADINGAPE_DLL , "loading MAC.dll" }, \
295 { ERROR_LOADINGAPE_INFO_DLL , "loading MACinfo.dll" }, \
296 { ERROR_LOADING_UNMAC_DLL , "loading UnMAC.dll" }, \
297 { ERROR_USER_STOPPED_PROCESSING , "user stopped processing" }, \
298 { ERROR_SKIPPED , "skipped" }, \
299 { ERROR_BAD_PARAMETER , "bad parameter" }, \
300 { ERROR_APE_COMPRESS_TOO_MUCH_DATA , "APE compress too much data" }, \
301 { ERROR_UNDEFINED , "undefined" }, \
302
303 #endif // #ifndef APE_ALL_H
304