1 #pragma once
2 
3 /*****************************************************************************************
4 Platform
5 
6 One of the following platforms should be defined (either in code or as a project setting):
7 PLATFORM_WINDOWS
8 PLATFORM_APPLE
9 PLATFORM_LINUX
10 *****************************************************************************************/
11 #if !defined(PLATFORM_WINDOWS) && !defined(PLATFORM_APPLE) && !defined(PLATFORM_LINUX)
12 	#pragma message("No platform set for MACLib, defaulting to Windows")
13 	#define PLATFORM_WINDOWS
14 #endif
15 
16 /*****************************************************************************************
17 Global includes
18 *****************************************************************************************/
19 #include <stdint.h>
20 #include <stdlib.h>
21 #include <memory.h>
22 #include <stdio.h>
23 #include <math.h>
24 
25 #if defined(PLATFORM_WINDOWS)
26     #include "WindowsEnvironment.h"
27     #include <windows.h>
28     #include <tchar.h>
29     #include <assert.h>
30 #else
31     #include <unistd.h>
32     #include <time.h>
33     #include <sys/time.h>
34     #include <sys/types.h>
35     #include <sys/stat.h>
36 	#include <wchar.h>
37     #include "NoWindows.h"
38 #endif
39 #define ape_max(a,b)    (((a) > (b)) ? (a) : (b))
40 #define ape_min(a,b)    (((a) < (b)) ? (a) : (b))
41 
42 #include "SmartPtr.h"
43 
44 /*****************************************************************************************
45 Global compiler settings (useful for porting)
46 *****************************************************************************************/
47 // assembly code (helps performance, but limits portability)
48 #ifndef PLATFORM_ARM
49     #define ENABLE_SSE_ASSEMBLY
50 	#ifdef _MSC_VER // doesn't compile in gcc
51 		#ifndef PLATFORM_x64
52 			#define ENABLE_MMX_ASSEMBLY
53 		#endif
54 	#endif
55 #endif
56 
57 // APE_BACKWARDS_COMPATIBILITY is only needed for decoding APE 3.92 or earlier files.  It
58 // has not been possible to make these files for over 10 years, so it's unlikely
59 // that disabling APE_BACKWARDS_COMPATIBILITY would have any effect on a normal user.  For
60 // porting or third party usage, it's probably best to not bother with APE_BACKWARDS_COMPATIBILITY.
61 // A future release of Monkey's Audio itself may remove support for these obsolete files.
62 //#if defined(PLATFORM_WINDOWS)
63 	#define APE_BACKWARDS_COMPATIBILITY
64 //#endif
65 
66 // compression modes
67 #define ENABLE_COMPRESSION_MODE_FAST
68 #define ENABLE_COMPRESSION_MODE_NORMAL
69 #define ENABLE_COMPRESSION_MODE_HIGH
70 #define ENABLE_COMPRESSION_MODE_EXTRA_HIGH
71 
72 // 64 bit platform
73 #if __x86_64__
74     #define PLATFORM_x64
75 #endif
76 
77 /*****************************************************************************************
78 Global types
79 *****************************************************************************************/
80 namespace APE
81 {
82 	// integer types
83 #if defined(PLATFORM_x64)
84 	typedef	intptr_t                                    int64; // native integer, can safely hold a pointer
85     typedef int32_t                                     int32;
86 #else
87 	typedef	intptr_t                                    int32; // native integer, can safely hold a pointer
88     typedef int64_t                                     int64;
89 #endif
90     //typedef intptr_t                                  intn;
91 	//typedef uintptr_t                                   uintn;
92 
93 // From GlobalIntTypes.h.
94 #ifndef PLATFORM_WINDOWS
95 #include <stdint.h>
96 #endif
97 
98 #if defined(PLATFORM_x64)
99 // DO NOT CHANGE THE FOLLOWING 6 LINES! They are necessary for building Media Center 64 bit on non-windows platforms!
100     #ifndef PLATFORM_WINDOWS
101     	typedef long long intn;
102     	typedef unsigned long long uintn;
103     #else
104     	typedef int64_t intn;
105     	typedef uint64_t uintn;
106     #endif
107 #else
108     typedef int32_t intn;
109     typedef uint32_t uintn;
110 #endif
111 
112 	typedef uint64_t                                    uint64;
113 	typedef uint32_t                                    uint32;
114 	typedef uint16_t                                    uint16;
115 	typedef int16_t                                     int16;
116 	typedef uint8_t                                     uint8;
117 	typedef int8_t                                      int8;
118 
119 	// string types
120 	typedef char                                        str_ansi;
121 	typedef unsigned char                               str_utf8;
122 	typedef int16										str_utf16;
123 	typedef wchar_t                                     str_utfn; // could be UTF-16 or UTF-32 depending on platform
124 }
125 
126 /*****************************************************************************************
127 Global macros
128 *****************************************************************************************/
129 #if defined(PLATFORM_WINDOWS)
130     #define IO_USE_WIN_FILE_IO
131     #define IO_HEADER_FILE                              "WinFileIO.h"
132     #define IO_CLASS_NAME                               CWinFileIO
133     #define DLLEXPORT                                   __declspec(dllexport)
134     #define SLEEP(MILLISECONDS)                         ::Sleep(MILLISECONDS)
135     #define MESSAGEBOX(PARENT, TEXT, CAPTION, TYPE)     ::MessageBox(PARENT, TEXT, CAPTION, TYPE)
136     #define PUMP_MESSAGE_LOOP                           { MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE) != 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } }
137     #define ODS                                         OutputDebugString
138     #define TICK_COUNT_TYPE                             unsigned long
139     #define TICK_COUNT_READ(VARIABLE)                   VARIABLE = GetTickCount()
140     #define TICK_COUNT_FREQ                             1000
141     #if !defined(ASSERT)
142         #if defined(_DEBUG)
143             #define ASSERT(e)                            assert(e)
144         #else
145             #define ASSERT(e)
146         #endif
147     #endif
148 #else
149     #define IO_USE_STD_LIB_FILE_IO
150     #define IO_HEADER_FILE                              "StdLibFileIO.h"
151     #define IO_CLASS_NAME                               CStdLibFileIO
152     #define DLLEXPORT
153     #define SLEEP(MILLISECONDS)                         { struct timespec t; t.tv_sec = (MILLISECONDS) / 1000; t.tv_nsec = (MILLISECONDS) % 1000 * 1000000; nanosleep(&t, NULL); }
154     #define MESSAGEBOX(PARENT, TEXT, CAPTION, TYPE)
155     #define PUMP_MESSAGE_LOOP
156     #define ODS                                         printf
157     #define TICK_COUNT_TYPE                             unsigned long long
158     #define TICK_COUNT_READ(VARIABLE)                   { struct timeval t; gettimeofday(&t, NULL); VARIABLE = t.tv_sec * 1000000LLU + t.tv_usec; }
159     #define TICK_COUNT_FREQ                             1000000
160     #define ASSERT(e)
161 #endif
162 
163 /*****************************************************************************************
164 WAVE format descriptor (binary compatible with Windows define, but in the APE namespace)
165 *****************************************************************************************/
166 namespace APE
167 {
168 #pragma pack(push, 1)
169 	typedef struct tWAVEFORMATEX
170 	{
171 		WORD        wFormatTag;         /* format type */
172 		WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
173 		uint32      nSamplesPerSec;     /* sample rate */
174 		uint32      nAvgBytesPerSec;    /* for buffer estimation */
175 		WORD        nBlockAlign;        /* block size of data */
176 		WORD        wBitsPerSample;     /* number of bits per sample of mono data */
177 		WORD        cbSize;             /* the count in bytes of the size of */
178 		/* extra information (after cbSize) */
179 	} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
180 #pragma pack(pop)
181 }
182 
183 /*****************************************************************************************
184 Global defines
185 *****************************************************************************************/
186 #define MAC_FILE_VERSION_NUMBER                         3990
187 #define MAC_VERSION_STRING                              _T("4.33")
188 #define MAC_NAME                                        _T("Monkey's Audio 4.33")
189 #define PLUGIN_NAME                                     "Monkey's Audio Player v4.33"
190 #define MJ_PLUGIN_NAME                                  _T("APE Plugin (v4.33)")
191 #define CONSOLE_NAME                                    _T("--- Monkey's Audio Console Front End (v 4.33) (c) Matthew T. Ashland ---\n")
192 #define PLUGIN_ABOUT                                    _T("Monkey's Audio Player v4.33\nCopyrighted (c) 2000-2018 by Matthew T. Ashland")
193 #define MAC_DLL_INTERFACE_VERSION_NUMBER                1000
194 #ifdef PLATFORM_WINDOWS
195 	#define APE_FILENAME_SLASH '\\'
196 #else
197 	#define APE_FILENAME_SLASH '/'
198 #endif
199 
200 /*****************************************************************************************
201 Byte order
202 *****************************************************************************************/
203 #ifdef __DragonFly__
204 #include <machine/endian.h>
205 #else
206 #define __LITTLE_ENDIAN     1234
207 #define __BIG_ENDIAN        4321
208 #define __BYTE_ORDER        __LITTLE_ENDIAN
209 #endif
210 
211 /*****************************************************************************************
212 Macros
213 *****************************************************************************************/
214 #define MB(TEST) MESSAGEBOX(NULL, TEST, _T("Information"), MB_OK);
215 #define MBN(NUMBER) { TCHAR cNumber[16]; _stprintf(cNumber, _T("%d"), NUMBER); MESSAGEBOX(NULL, cNumber, _T("Information"), MB_OK); }
216 
217 #define SAFE_DELETE(POINTER) if (POINTER) { delete POINTER; POINTER = NULL; }
218 #define SAFE_ARRAY_DELETE(POINTER) if (POINTER) { delete [] POINTER; POINTER = NULL; }
219 #define SAFE_VOID_CLASS_DELETE(POINTER, Class) { Class *pClass = (Class *) POINTER; if (pClass) { delete pClass; POINTER = NULL; } }
220 #define SAFE_FILE_CLOSE(HANDLE) if (HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = INVALID_HANDLE_VALUE; }
221 
222 #define ODN(NUMBER) { TCHAR cNumber[16]; _stprintf(cNumber, _T("%d\n"), int(NUMBER)); ODS(cNumber); }
223 
224 #define CATCH_ERRORS(CODE) try { CODE } catch(...) { }
225 
226 #define RETURN_ON_ERROR(FUNCTION) {    int nResult = FUNCTION; if (nResult != 0) { return nResult; } }
227 #define RETURN_VALUE_ON_ERROR(FUNCTION, VALUE) { int nResult = FUNCTION; if (nResult != 0) { return VALUE; } }
228 #define RETURN_ON_EXCEPTION(CODE, VALUE) { try { CODE } catch(...) { return VALUE; } }
229 
230 #define THROW_ON_ERROR(CODE) { intn nResult = CODE; if (nResult != 0) throw(nResult); }
231 
232 #define EXPAND_1_TIMES(CODE) CODE
233 #define EXPAND_2_TIMES(CODE) CODE CODE
234 #define EXPAND_3_TIMES(CODE) CODE CODE CODE
235 #define EXPAND_4_TIMES(CODE) CODE CODE CODE CODE
236 #define EXPAND_5_TIMES(CODE) CODE CODE CODE CODE CODE
237 #define EXPAND_6_TIMES(CODE) CODE CODE CODE CODE CODE CODE
238 #define EXPAND_7_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE
239 #define EXPAND_8_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE
240 #define EXPAND_9_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE
241 #define EXPAND_12_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
242 #define EXPAND_14_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
243 #define EXPAND_15_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
244 #define EXPAND_16_TIMES(CODE) CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE CODE
245 #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
246 #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
247 #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
248 #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
249 #define EXPAND_N_TIMES(NUMBER, CODE) EXPAND_##NUMBER##_TIMES(CODE)
250 
251 #define UNROLL_4_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3)
252 #define UNROLL_8_TIMES(MACRO) MACRO(0) MACRO(1) MACRO(2) MACRO(3) MACRO(4) MACRO(5) MACRO(6) MACRO(7)
253 #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)
254 #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)
255 #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)
256 #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)
257 #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)    \
258     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)
259 
260 /*****************************************************************************************
261 Error Codes
262 *****************************************************************************************/
263 
264 // success
265 #ifndef ERROR_SUCCESS
266 #define ERROR_SUCCESS                                   0
267 #endif
268 
269 // file and i/o errors (1000's)
270 #define ERROR_IO_READ                                   1000
271 #define ERROR_IO_WRITE                                  1001
272 #define ERROR_INVALID_INPUT_FILE                        1002
273 #define ERROR_INVALID_OUTPUT_FILE                       1003
274 #define ERROR_INPUT_FILE_TOO_LARGE                      1004
275 #define ERROR_INPUT_FILE_UNSUPPORTED_BIT_DEPTH          1005
276 #define ERROR_INPUT_FILE_UNSUPPORTED_SAMPLE_RATE        1006
277 #define ERROR_INPUT_FILE_UNSUPPORTED_CHANNEL_COUNT      1007
278 #define ERROR_INPUT_FILE_TOO_SMALL                      1008
279 #define ERROR_INVALID_CHECKSUM                          1009
280 #define ERROR_DECOMPRESSING_FRAME                       1010
281 #define ERROR_INITIALIZING_UNMAC                        1011
282 #define ERROR_INVALID_FUNCTION_PARAMETER                1012
283 #define ERROR_UNSUPPORTED_FILE_TYPE                     1013
284 #define ERROR_UPSUPPORTED_FILE_VERSION                  1014
285 
286 // memory errors (2000's)
287 #define ERROR_INSUFFICIENT_MEMORY                       2000
288 
289 // dll errors (3000's)
290 #define ERROR_LOADINGAPE_DLL                            3000
291 #define ERROR_LOADINGAPE_INFO_DLL                       3001
292 #define ERROR_LOADING_UNMAC_DLL                         3002
293 
294 // general and misc errors
295 #define ERROR_USER_STOPPED_PROCESSING                   4000
296 #define ERROR_SKIPPED                                   4001
297 
298 // programmer errors
299 #define ERROR_BAD_PARAMETER                             5000
300 
301 // IAPECompress errors
302 #define ERROR_APE_COMPRESS_TOO_MUCH_DATA                6000
303 
304 // unknown error
305 #define ERROR_UNDEFINED                                -1
306 
307 #define ERROR_EXPLANATION \
308     { ERROR_IO_READ                               , _T("I/O read error") },                         \
309     { ERROR_IO_WRITE                              , _T("I/O write error") },                        \
310     { ERROR_INVALID_INPUT_FILE                    , _T("invalid input file") },                     \
311     { ERROR_INVALID_OUTPUT_FILE                   , _T("invalid output file") },                    \
312     { ERROR_INPUT_FILE_TOO_LARGE                  , _T("input file file too large") },              \
313     { ERROR_INPUT_FILE_UNSUPPORTED_BIT_DEPTH      , _T("input file unsupported bit depth") },       \
314     { ERROR_INPUT_FILE_UNSUPPORTED_SAMPLE_RATE    , _T("input file unsupported sample rate") },     \
315     { ERROR_INPUT_FILE_UNSUPPORTED_CHANNEL_COUNT  , _T("input file unsupported channel count") },   \
316     { ERROR_INPUT_FILE_TOO_SMALL                  , _T("input file too small") },                   \
317     { ERROR_INVALID_CHECKSUM                      , _T("invalid checksum") },                       \
318     { ERROR_DECOMPRESSING_FRAME                   , _T("decompressing frame") },                    \
319     { ERROR_INITIALIZING_UNMAC                    , _T("initializing unmac") },                     \
320     { ERROR_INVALID_FUNCTION_PARAMETER            , _T("invalid function parameter") },             \
321     { ERROR_UNSUPPORTED_FILE_TYPE                 , _T("unsupported file type") },                  \
322     { ERROR_INSUFFICIENT_MEMORY                   , _T("insufficient memory") },                    \
323     { ERROR_LOADINGAPE_DLL                        , _T("loading MAC.dll") },                        \
324     { ERROR_LOADINGAPE_INFO_DLL                   , _T("loading MACinfo.dll") },                    \
325     { ERROR_LOADING_UNMAC_DLL                     , _T("loading UnMAC.dll") },                      \
326     { ERROR_USER_STOPPED_PROCESSING               , _T("user stopped processing") },                \
327     { ERROR_SKIPPED                               , _T("skipped") },                                \
328     { ERROR_BAD_PARAMETER                         , _T("bad parameter") },                          \
329     { ERROR_APE_COMPRESS_TOO_MUCH_DATA            , _T("APE compress too much data") },             \
330     { ERROR_UNDEFINED                             , _T("undefined") },
331