--- /dev/null
+LameXP third-party patches
+--------------------------
+
+This directory contains the modifications (as Unified Diff's) that have been applied to third-party audio tools as part of the development of LameXP.
+
+Most of these modifications were required to fix Unicode support on the Windows platform and/or to properly flush the STDOUT for "real-time" progress updates.
+
+Other modifications were required to make the third-party audio tools compile+link properly in the build environment used in the development of LameXP.
+
+All the patches provided here are Copyright (c) LoRd_MuldeR <mulder2@gmx.de> 2004-2012; they are released under the same license as the original audio tools.
+
+Please note that the patches provided here have NOT been approved by the original developers of the third-party audio tools - use them at your own risk!
+
+They are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of FITNESS FOR A PARTICULAR PURPOSE.
--- /dev/null
+ tools/unicode_support.cpp | 86 ++++++++++++++++++
+ tools/unicode_support.h | 21 +++++
+ tools/valdec.cpp | 180 ++++++++++++++++++++++++--------------
+ tools/valdec.sln | 50 +++++++----
+ tools/valdec.vcproj | 61 +++++++------
+ valib/lib/valib.vcproj | 19 ++++-
+ valib/valib/auto_file.cpp | 3 +-
+ valib/valib/sink/sink_dsound.cpp | 4 +-
+ valib/valib/sink/sink_stdout.h | 93 ++++++++++++++++++++
+ 9 files changed, 402 insertions(+), 115 deletions(-)
+
+diff --git a/tools/unicode_support.cpp b/tools/unicode_support.cpp
+new file mode 100644
+index 0000000..13f89ba
+--- /dev/null
++++ b/tools/unicode_support.cpp
+@@ -0,0 +1,86 @@
++#include "unicode_support.h"
++
++#include <windows.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = new char[BuffSize]; //(char*) malloc(sizeof(char) * BuffSize);
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = new wchar_t[BuffSize]; //(wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = new char*[nArgs]; //malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ if(*argv != NULL)
++ {
++ for(int i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ delete [] ((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ delete [] (*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) delete [] filename_utf16;
++ if(mode_utf16) delete [] mode_utf16;
++
++ return ret;
++}
+diff --git a/tools/unicode_support.h b/tools/unicode_support.h
+new file mode 100644
+index 0000000..9ad3173
+--- /dev/null
++++ b/tools/unicode_support.h
+@@ -0,0 +1,21 @@
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++char *utf16_to_utf8(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff --git a/tools/valdec.cpp b/tools/valdec.cpp
+index 6b24ecf..b5fe15d 100644
+--- a/tools/valdec.cpp
++++ b/tools/valdec.cpp
+@@ -15,6 +15,7 @@
+ #include "sink\sink_raw.h"
+ #include "sink\sink_wav.h"
+ #include "sink\sink_dsound.h"
++#include "sink\sink_stdout.h"
+
+ // filters
+ #include "filters\dvd_graph.h"
+@@ -22,6 +23,7 @@
+ // other
+ #include "win32\cpu.h"
+ #include "vargs.h"
++#include "unicode_support.h"
+
+
+ #define bool2str(v) ((v)? "true": "false")
+@@ -65,7 +67,7 @@ const sample_t level_tbl[] =
+ 1.0
+ };
+
+-int main(int argc, char *argv[])
++int valdec_main(int argc, char *argv[])
+ {
+ if (argc < 2)
+ {
+@@ -77,6 +79,7 @@ int main(int argc, char *argv[])
+ "\n"
+ "This utility is a part of AC3Filter project (http://ac3filter.net)\n"
+ "Copyright (c) 2006-2009 by Alexander Vigovsky\n"
++"Support for Unicode file names and STDOUT output added by LoRd_MuldeR\n"
+ "\n"
+ "Usage:\n"
+ " valdec some_file [options]\n"
+@@ -91,6 +94,7 @@ int main(int argc, char *argv[])
+ " -r[aw] file.raw - decode to RAW file\n"
+ " -w[av] file.wav - decode to WAV file\n"
+ " -n[othing] - do nothing (to be used with -i option)\n"
++" -s[td] - decode to RAW and write to STDOUT\n"
+ " \n"
+ " output options:\n"
+ //" -spdif - spdif output (no other options will work in this mode)\n"
+@@ -184,12 +188,13 @@ int main(int argc, char *argv[])
+ /////////////////////////////////////////////////////////
+ // Sinks
+
+- enum { mode_undefined, mode_nothing, mode_play, mode_raw, mode_wav, mode_decode } mode = mode_undefined;
++ enum { mode_undefined, mode_nothing, mode_play, mode_raw, mode_wav, mode_decode, mode_stdout } mode = mode_undefined;
+ const char *out_filename = 0;
+
+ RAWSink raw;
+ WAVSink wav;
+ DSoundSink dsound;
++ StdOutSink stdsnk;
+ NullSink null;
+
+ Sink *sink = 0;
+@@ -216,7 +221,7 @@ int main(int argc, char *argv[])
+ {
+ if (parser)
+ {
+- printf("-ac3 : ambigous parser\n");
++ fprintf(stderr, "-ac3 : ambigous parser\n");
+ return 1;
+ }
+
+@@ -229,7 +234,7 @@ int main(int argc, char *argv[])
+ {
+ if (parser)
+ {
+- printf("-dts : ambigous parser\n");
++ fprintf(stderr, "-dts : ambigous parser\n");
+ return 1;
+ }
+
+@@ -242,7 +247,7 @@ int main(int argc, char *argv[])
+ {
+ if (parser)
+ {
+- printf("-mpa : ambigous parser\n");
++ fprintf(stderr, "-mpa : ambigous parser\n");
+ return 1;
+ }
+
+@@ -268,7 +273,7 @@ int main(int argc, char *argv[])
+
+ if (imask < 0 || imask > array_size(mask_tbl))
+ {
+- printf("-spk : incorrect speaker configuration\n");
++ fprintf(stderr, "-spk : incorrect speaker configuration\n");
+ return 1;
+ }
+ continue;
+@@ -280,7 +285,7 @@ int main(int argc, char *argv[])
+ iformat = int(arg_num(argv[iarg]));
+ if (iformat < 0 || iformat > array_size(format_tbl))
+ {
+- printf("-fmt : incorrect sample format");
++ fprintf(stderr, "-fmt : incorrect sample format");
+ return 1;
+ }
+ continue;
+@@ -296,7 +301,7 @@ int main(int argc, char *argv[])
+ {
+ if (sink)
+ {
+- printf("-decode : ambigous output mode\n");
++ fprintf(stderr, "-decode : ambigous output mode\n");
+ return 1;
+ }
+
+@@ -312,7 +317,7 @@ int main(int argc, char *argv[])
+ {
+ if (sink)
+ {
+- printf("-play : ambigous output mode\n");
++ fprintf(stderr, "-play : ambigous output mode\n");
+ return 1;
+ }
+
+@@ -328,12 +333,12 @@ int main(int argc, char *argv[])
+ {
+ if (sink)
+ {
+- printf("-raw : ambigous output mode\n");
++ fprintf(stderr, "-raw : ambigous output mode\n");
+ return 1;
+ }
+ if (argc - iarg < 1)
+ {
+- printf("-raw : specify a file name\n");
++ fprintf(stderr, "-raw : specify a file name\n");
+ return 1;
+ }
+
+@@ -343,19 +348,40 @@ int main(int argc, char *argv[])
+ mode = mode_raw;
+ continue;
+ }
++
++ // -s[td] - RAW output to STDOUT
++ if (is_arg(argv[iarg], "s", argt_exist) ||
++ is_arg(argv[iarg], "std", argt_exist))
++ {
++ if (sink)
++ {
++ fprintf(stderr, "-std : ambigous output mode\n");
++ return 1;
++ }
++ if (argc - iarg < 1)
++ {
++ fprintf(stderr, "-std : specify a file name\n");
++ return 1;
++ }
+
++ //out_filename = argv[++iarg];
++ sink = &stdsnk;
++ control = 0;
++ mode = mode_stdout;
++ continue;
++ }
+ // -w[av] - WAV output
+ if (is_arg(argv[iarg], "w", argt_exist) ||
+ is_arg(argv[iarg], "wav", argt_exist))
+ {
+ if (sink)
+ {
+- printf("-wav : ambigous output mode\n");
++ fprintf(stderr, "-wav : ambigous output mode\n");
+ return 1;
+ }
+ if (argc - iarg < 1)
+ {
+- printf("-wav : specify a file name\n");
++ fprintf(stderr, "-wav : specify a file name\n");
+ return 1;
+ }
+
+@@ -372,7 +398,7 @@ int main(int argc, char *argv[])
+ {
+ if (sink)
+ {
+- printf("-nothing : ambigous output mode\n");
++ fprintf(stderr, "-nothing : ambigous output mode\n");
+ return 1;
+ }
+
+@@ -614,7 +640,7 @@ int main(int argc, char *argv[])
+ continue;
+ }
+
+- printf("Error: unknown option: %s\n", argv[iarg]);
++ fprintf(stderr, "Error: unknown option: %s\n", argv[iarg]);
+ return 1;
+ }
+
+@@ -627,13 +653,13 @@ int main(int argc, char *argv[])
+
+ if (!file.open(input_filename, parser, 1000000))
+ {
+- printf("Error: Cannot open file '%s'\n", input_filename);
++ fprintf(stderr, "Error: Cannot open file '%s'\n", input_filename);
+ return 1;
+ }
+
+ if (!file.stats())
+ {
+- printf("Error: Cannot detect input file format\n", input_filename);
++ fprintf(stderr, "Error: Cannot detect input file format\n", input_filename);
+ return 1;
+ }
+
+@@ -643,7 +669,7 @@ int main(int argc, char *argv[])
+
+ if (!file.is_frame_loaded())
+ {
+- printf("Error: Cannot load the first frame\n");
++ fprintf(stderr, "Error: Cannot load the first frame\n");
+ return 1;
+ }
+
+@@ -655,9 +681,9 @@ int main(int argc, char *argv[])
+ {
+ char info[1024];
+ file.file_info(info, sizeof(info));
+- printf("%s\n", info);
++ fprintf(stderr, "%s\n", info);
+ file.stream_info(info, sizeof(info));
+- printf("%s", info);
++ fprintf(stderr, "%s", info);
+ }
+
+ if (mode == mode_nothing)
+@@ -678,7 +704,7 @@ int main(int argc, char *argv[])
+ Speakers user_spk(format_tbl[iformat], mask_tbl[imask], 0, level_tbl[iformat]);
+ if (!dvd_graph.set_user(user_spk))
+ {
+- printf("Error: unsupported user format (%s %s %i)\n",
++ fprintf(stderr, "Error: unsupported user format (%s %s %i)\n",
+ user_spk.format_text(), user_spk.mode_text(), user_spk.sample_rate);
+ return 1;
+ }
+@@ -686,7 +712,7 @@ int main(int argc, char *argv[])
+ Speakers in_spk = file.get_spk();
+ if (!dvd_graph.set_input(in_spk))
+ {
+- printf("Error: unsupported input format (%s %s %i)\n",
++ fprintf(stderr, "Error: unsupported input format (%s %s %i)\n",
+ in_spk.format_text(), in_spk.mode_text(), in_spk.sample_rate);
+ return 1;
+ }
+@@ -718,10 +744,18 @@ int main(int argc, char *argv[])
+
+ switch (mode)
+ {
++ case mode_stdout:
++ if (!stdsnk.is_open())
++ {
++ fprintf(stderr, "Error: failed to open standard output handle.\n");
++ return 1;
++ }
++ break;
++
+ case mode_raw:
+ if (!out_filename || !raw.open(out_filename))
+ {
+- printf("Error: failed to open output file '%s'\n", out_filename);
++ fprintf(stderr, "Error: failed to open output file '%s'\n", out_filename);
+ return 1;
+ }
+ break;
+@@ -729,7 +763,7 @@ int main(int argc, char *argv[])
+ case mode_wav:
+ if (!out_filename || !wav.open(out_filename))
+ {
+- printf("Error: failed to open output file '%s'\n", out_filename);
++ fprintf(stderr, "Error: failed to open output file '%s'\n", out_filename);
+ return 1;
+ }
+ break;
+@@ -737,7 +771,7 @@ int main(int argc, char *argv[])
+ case mode_play:
+ if (!dsound.open_dsound(0))
+ {
+- printf("Error: failed to init DirectSound\n");
++ fprintf(stderr, "Error: failed to init DirectSound\n");
+ return 1;
+ }
+ break;
+@@ -765,27 +799,28 @@ int main(int argc, char *argv[])
+
+ int streams = 0;
+
+-// fprintf(stderr, " 0.0%% Frs: 0 Err: 0 Time: 0:00.000i Level: 0dB FPS: 0 CPU: 0%%\r");
++// ffprintf(stderr, stderr, " 0.0%% Frs: 0 Err: 0 Time: 0:00.000i Level: 0dB FPS: 0 CPU: 0%%\r");
+
+ file.seek(0);
+
+- #define PRINT_STAT \
+- { \
+- if (control) \
+- { \
+- dvd_graph.proc.get_output_levels(control->get_playback_time(), levels); \
+- level = levels[0]; \
+- for (i = 1; i < NCHANNELS; i++) \
+- if (levels[i] > level) \
+- level = levels[i]; \
+- } \
+- fprintf(stderr, "%4.1f%% Frs: %-6i Err: %-i Time: %3i:%02i.%03i Level: %-4idB FPS: %-4i CPU: %.1f%% \r", \
+- file.get_pos(file.relative) * 100, \
+- file.get_frames(), dvd_graph.dec.get_errors(), \
+- int(time/60), int(time) % 60, int(time * 1000) % 1000, \
+- int(value2db(level)), \
+- int(file.get_frames() / time), \
+- cpu_current.usage() * 100); \
++ #define PRINT_STAT \
++ { \
++ if (control) \
++ { \
++ dvd_graph.proc.get_output_levels(control->get_playback_time(), levels); \
++ level = levels[0]; \
++ for (i = 1; i < NCHANNELS; i++) \
++ if (levels[i] > level) \
++ level = levels[i]; \
++ } \
++ fprintf(stderr, "[%4.1f%%] Frs: %-6i Err: %-i Time: %3i:%02i.%03i Level: %-4idB FPS: %-4i CPU: %.1f%% \r", \
++ file.get_pos(file.relative) * 100, \
++ file.get_frames(), dvd_graph.dec.get_errors(), \
++ int(time/60), int(time) % 60, int(time * 1000) % 1000, \
++ int(value2db(level)), \
++ int(file.get_frames() / time), \
++ cpu_current.usage() * 100); \
++ fflush(stderr); \
+ }
+
+ #define DROP_STAT \
+@@ -811,7 +846,7 @@ int main(int argc, char *argv[])
+ {
+ char info[1024];
+ file.stream_info(info, sizeof(info));
+- printf("\n\n%s", info);
++ fprintf(stderr, "\n\n%s", info);
+ }
+
+ streams++;
+@@ -825,7 +860,7 @@ int main(int argc, char *argv[])
+ chunk.set_rawdata(file.get_spk(), file.get_frame(), file.get_frame_size());
+ if (!dvd_graph.process(&chunk))
+ {
+- printf("\nError in dvd_graph.process()\n");
++ fprintf(stderr, "\nError in dvd_graph.process()\n");
+ return 1;
+ }
+
+@@ -833,7 +868,7 @@ int main(int argc, char *argv[])
+ {
+ if (!dvd_graph.get_chunk(&chunk))
+ {
+- printf("\nError in dvd_graph.get_chunk()\n");
++ fprintf(stderr, "\nError in dvd_graph.get_chunk()\n");
+ return 1;
+ }
+
+@@ -847,12 +882,12 @@ int main(int argc, char *argv[])
+ if (sink->query_input(chunk.spk))
+ {
+ DROP_STAT;
+- printf("Opening audio output %s %s %i...\n",
++ fprintf(stderr, "Opening audio output %s %s %i...\n",
+ chunk.spk.format_text(), chunk.spk.mode_text(), chunk.spk.sample_rate);
+ }
+ else
+ {
+- printf("\nOutput format %s %s %i is unsupported\n",
++ fprintf(stderr, "\nOutput format %s %s %i is unsupported\n",
+ chunk.spk.format_text(), chunk.spk.mode_text(), chunk.spk.sample_rate);
+ return 1;
+ }
+@@ -860,7 +895,7 @@ int main(int argc, char *argv[])
+
+ if (!sink->process(&chunk))
+ {
+- printf("\nError in sink->process()\n");
++ fprintf(stderr, "\nError in sink->process()\n");
+ return 1;
+ }
+ }
+@@ -893,7 +928,7 @@ int main(int argc, char *argv[])
+
+ if (!dvd_graph.process_to(&chunk, sink))
+ {
+- printf("\nProcessing error!\n");
++ fprintf(stderr, "\nProcessing error!\n");
+ return 1;
+ }
+
+@@ -907,13 +942,13 @@ int main(int argc, char *argv[])
+ // Final statistics
+
+ PRINT_STAT;
+- printf("\n---------------------------------------\n");
++ fprintf(stderr, "\n---------------------------------------\n");
+ if (streams > 1)
+- printf("Streams found: %i\n", streams);
+- printf("Frames/errors: %i/%i\n", file.get_frames(), dvd_graph.dec.get_errors());
+- printf("System time: %ims\n", int(cpu_total.get_system_time() * 1000));
+- printf("Process time: %ims\n", int(cpu_total.get_thread_time() * 1000 ));
+- printf("Approx. %.2f%% realtime CPU usage\n", double(cpu_total.get_thread_time() * 100) / file.get_size(file.time));
++ fprintf(stderr, "Streams found: %i\n", streams);
++ fprintf(stderr, "Frames/errors: %i/%i\n", file.get_frames(), dvd_graph.dec.get_errors());
++ fprintf(stderr, "System time: %ims\n", int(cpu_total.get_system_time() * 1000));
++ fprintf(stderr, "Process time: %ims\n", int(cpu_total.get_thread_time() * 1000 ));
++ fprintf(stderr, "Approx. %.2f%% realtime CPU usage\n", double(cpu_total.get_thread_time() * 100) / file.get_size(file.time));
+
+ /////////////////////////////////////////////////////////
+ // Print levels histogram
+@@ -930,22 +965,35 @@ int main(int argc, char *argv[])
+ max_level = dvd_graph.proc.get_max_level();
+ dbpb = dvd_graph.proc.get_dbpb();
+
+- printf("\nHistogram:\n");
+- printf("------------------------------------------------------------------------------\n");
++ fprintf(stderr, "\nHistogram:\n");
++ fprintf(stderr, "------------------------------------------------------------------------------\n");
+ for (i = 0; i*dbpb < 100 && i < MAX_HISTOGRAM; i++)
+ {
+- printf("%2idB: %4.1f ", i * dbpb, hist[i] * 100);
++ fprintf(stderr, "%2idB: %4.1f ", i * dbpb, hist[i] * 100);
+ for (j = 0; j < 67 && j < hist[i] * 67; j++)
+- printf("*");
+- printf("\n");
++ fprintf(stderr, "*");
++ fprintf(stderr, "\n");
+ }
+- printf("------------------------------------------------------------------------------\n");
+- printf("max_level;%f\ndbpb;%i\nhistogram;", max_level, dbpb);
++ fprintf(stderr, "------------------------------------------------------------------------------\n");
++ fprintf(stderr, "max_level;%f\ndbpb;%i\nhistogram;", max_level, dbpb);
+ for (i = 0; i < MAX_HISTOGRAM; i++)
+- printf("%.4f;", hist[i]);
+- printf("\n");
+- printf("------------------------------------------------------------------------------\n");
++ fprintf(stderr, "%.4f;", hist[i]);
++ fprintf(stderr, "\n");
++ fprintf(stderr, "------------------------------------------------------------------------------\n");
+ }
+
+ return 0;
+ }
++
++int main(int argc, char *argv[])
++{
++ int argc_utf8;
++ char **argv_utf8;
++ int exit_code;
++
++ init_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
++ exit_code = valdec_main(argc_utf8, argv_utf8);
++ free_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
++
++ return exit_code;
++}
+diff --git a/tools/valdec.sln b/tools/valdec.sln
+index 9120b95..8b0cf39 100644
+--- a/tools/valdec.sln
++++ b/tools/valdec.sln
+@@ -1,12 +1,12 @@
+
+ Microsoft Visual Studio Solution File, Format Version 10.00
+ # Visual Studio 2008
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "valdec", "valdec.vcproj", "{871889DF-6EF7-461F-AC1B-7DA682CB79A0}"
++Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "valdec", "valdec.icproj", "{EB870031-881E-455A-A1E2-5FD222F92D61}"
+ ProjectSection(ProjectDependencies) = postProject
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C} = {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1} = {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}
+ EndProjectSection
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "valib", "..\valib\lib\valib.vcproj", "{30FCD216-1CAD-48FD-BF4B-337572F7EC9C}"
++Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "valib", "..\valib\lib\valib.icproj", "{C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}"
+ EndProject
+ Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+@@ -16,22 +16,38 @@ Global
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|Win32.ActiveCfg = Debug|Win32
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|Win32.Build.0 = Debug|Win32
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|x64.ActiveCfg = Debug|x64
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|x64.Build.0 = Debug|x64
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|Win32.ActiveCfg = Release|Win32
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|Win32.Build.0 = Release|Win32
+- {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|x64.ActiveCfg = Release|x64
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Debug|Win32.ActiveCfg = Debug|Win32
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Debug|Win32.Build.0 = Debug|Win32
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Debug|x64.ActiveCfg = Debug|x64
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Debug|x64.Build.0 = Debug|x64
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Release|Win32.ActiveCfg = Release|Win32
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Release|Win32.Build.0 = Release|Win32
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Release|x64.ActiveCfg = Release|x64
++ {EB870031-881E-455A-A1E2-5FD222F92D61}.Release|x64.Build.0 = Release|x64
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Debug|Win32.ActiveCfg = Debug|Win32
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Debug|Win32.Build.0 = Debug|Win32
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Debug|x64.ActiveCfg = Debug|x64
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Debug|x64.Build.0 = Debug|x64
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Release|Win32.ActiveCfg = Release|Win32
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Release|Win32.Build.0 = Release|Win32
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Release|x64.ActiveCfg = Release|x64
++ {C9AE46F3-AA5D-421B-99DF-3BBA26AEF6B1}.Release|x64.Build.0 = Release|x64
+ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|x64.Build.0 = Release|x64
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|Win32.ActiveCfg = Debug|Win32
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|Win32.Build.0 = Debug|Win32
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|x64.ActiveCfg = Debug|x64
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|x64.Build.0 = Debug|x64
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|Win32.ActiveCfg = Release|Win32
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|Win32.Build.0 = Release|Win32
+- {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|x64.ActiveCfg = Release|x64
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|x64.ActiveCfg = Release|x64
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|Win32.Build.0 = Release|Win32
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Release|Win32.ActiveCfg = Release|Win32
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|x64.Build.0 = Debug|x64
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|x64.ActiveCfg = Debug|x64
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|Win32.Build.0 = Debug|Win32
++ {871889DF-6EF7-461F-AC1B-7DA682CB79A0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|x64.Build.0 = Release|x64
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|x64.ActiveCfg = Release|x64
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|Win32.Build.0 = Release|Win32
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Release|Win32.ActiveCfg = Release|Win32
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|x64.Build.0 = Debug|x64
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|x64.ActiveCfg = Debug|x64
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|Win32.Build.0 = Debug|Win32
++ {30FCD216-1CAD-48FD-BF4B-337572F7EC9C}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+diff --git a/tools/valdec.vcproj b/tools/valdec.vcproj
+index d6a6b98..4d3056b 100644
+--- a/tools/valdec.vcproj
++++ b/tools/valdec.vcproj
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="windows-1251"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="9.00"
++ Version="9,00"
+ Name="valdec"
+ ProjectGUID="{871889DF-6EF7-461F-AC1B-7DA682CB79A0}"
+ RootNamespace="valdec"
+@@ -93,12 +93,11 @@
+ />
+ </Configuration>
+ <Configuration
+- Name="Release|Win32"
+- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+- IntermediateDirectory="$(ConfigurationName)\$(ProjectName)"
++ Name="Debug|x64"
++ OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
++ IntermediateDirectory="$(PlatformName)\$(ConfigurationName)\$(ProjectName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+- WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+@@ -114,15 +113,16 @@
+ />
+ <Tool
+ Name="VCMIDLTool"
++ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+- Optimization="2"
+- EnableIntrinsicFunctions="true"
++ Optimization="0"
+ AdditionalIncludeDirectories="..\valib\valib"
+- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+- RuntimeLibrary="0"
+- EnableFunctionLevelLinking="true"
++ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
++ MinimalRebuild="true"
++ BasicRuntimeChecks="3"
++ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+@@ -139,12 +139,10 @@
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="dsound.lib"
+- LinkIncremental="1"
++ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+- OptimizeReferences="2"
+- EnableCOMDATFolding="2"
+- TargetMachine="1"
++ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+@@ -169,11 +167,12 @@
+ />
+ </Configuration>
+ <Configuration
+- Name="Debug|x64"
+- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)\$(ProjectName)"
++ Name="Release|Win32"
++ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
++ IntermediateDirectory="$(ConfigurationName)\$(ProjectName)"
+ ConfigurationType="1"
+ CharacterSet="1"
++ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+@@ -189,19 +188,21 @@
+ />
+ <Tool
+ Name="VCMIDLTool"
+- TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+- Optimization="0"
++ Optimization="2"
++ InlineFunctionExpansion="2"
++ EnableIntrinsicFunctions="true"
++ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories="..\valib\valib"
+- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+- MinimalRebuild="true"
+- BasicRuntimeChecks="3"
+- RuntimeLibrary="1"
++ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
++ RuntimeLibrary="0"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+- DebugInformationFormat="3"
++ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+@@ -214,11 +215,13 @@
+ />
+ <Tool
+ Name="VCLinkerTool"
+- AdditionalDependencies="dsound.lib"
+- LinkIncremental="2"
++ AdditionalDependencies="LIBIOMP5MT.lib"
++ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+- TargetMachine="17"
++ OptimizeReferences="2"
++ EnableCOMDATFolding="2"
++ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+@@ -324,6 +327,10 @@
+ </References>
+ <Files>
+ <File
++ RelativePath=".\unicode_support.cpp"
++ >
++ </File>
++ <File
+ RelativePath=".\valdec.cpp"
+ >
+ </File>
+diff --git a/valib/lib/valib.vcproj b/valib/lib/valib.vcproj
+index a30826e..3b04d9f 100644
+--- a/valib/lib/valib.vcproj
++++ b/valib/lib/valib.vcproj
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="windows-1251"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="9.00"
++ Version="9,00"
+ Name="valib"
+ ProjectGUID="{30FCD216-1CAD-48FD-BF4B-337572F7EC9C}"
+ RootNamespace="valib"
+@@ -164,12 +164,15 @@
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
++ InlineFunctionExpansion="2"
+ EnableIntrinsicFunctions="true"
++ FavorSizeOrSpeed="1"
+ PreprocessorDefinitions="NDEBUG"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ WarningLevel="3"
+- DebugInformationFormat="3"
++ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+@@ -939,6 +942,14 @@
+ <File
+ RelativePath="..\valib\sink\sink_dshow.cpp"
+ >
++ <FileConfiguration
++ Name="Release|Win32"
++ ExcludedFromBuild="true"
++ >
++ <Tool
++ Name="VCCLCompilerTool"
++ />
++ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\valib\sink\sink_dshow.h"
+@@ -957,6 +968,10 @@
+ >
+ </File>
+ <File
++ RelativePath="..\valib\sink\sink_stdout.h"
++ >
++ </File>
++ <File
+ RelativePath="..\valib\sink\sink_wav.cpp"
+ >
+ </File>
+diff --git a/valib/valib/auto_file.cpp b/valib/valib/auto_file.cpp
+index 235ad1d..8d99c91 100644
+--- a/valib/valib/auto_file.cpp
++++ b/valib/valib/auto_file.cpp
+@@ -1,5 +1,6 @@
+ #include <limits.h>
+ #include "auto_file.h"
++#include "..\..\tools\unicode_support.h"
+
+ #if defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+@@ -40,7 +41,7 @@ AutoFile::open(const char *filename, const char *mode)
+ {
+ if (f) close();
+ filesize = max_size;
+- f = fopen(filename, mode);
++ f = fopen_utf8(filename, mode);
+ if (f)
+ {
+ if (portable_seek(f, 0, SEEK_END) == 0)
+diff --git a/valib/valib/sink/sink_dsound.cpp b/valib/valib/sink/sink_dsound.cpp
+index 542d31f..c5aa132 100644
+--- a/valib/valib/sink/sink_dsound.cpp
++++ b/valib/valib/sink/sink_dsound.cpp
+@@ -47,8 +47,8 @@ DSoundSink::open_dsound(HWND _hwnd, int _buf_size_ms, int _preload_ms, LPCGUID _
+
+ // Open DirectSound
+
+- if FAILED(DirectSoundCreate(_device, &ds, 0))
+- return false;
++ //if FAILED(DirectSoundCreate(_device, &ds, 0))
++ return false;
+
+ if (!_hwnd) _hwnd = GetForegroundWindow();
+ if (!_hwnd) _hwnd = GetDesktopWindow();
+diff --git a/valib/valib/sink/sink_stdout.h b/valib/valib/sink/sink_stdout.h
+new file mode 100644
+index 0000000..3112531
+--- /dev/null
++++ b/valib/valib/sink/sink_stdout.h
+@@ -0,0 +1,93 @@
++/*
++ RAW file output audio renderer
++*/
++
++#ifndef VALIB_SINK_STDOUT_H
++#define VALIB_SINK_STDOUT_H
++
++#include "filter.h"
++#include "auto_file.h"
++
++class StdOutSink : public Sink
++{
++protected:
++ Speakers spk;
++ HANDLE h;
++ //AutoFile f;
++
++public:
++ StdOutSink():
++ h(GetStdHandle(STD_OUTPUT_HANDLE))
++ {}
++
++ StdOutSink(const char *_filename):
++ h(GetStdHandle(STD_OUTPUT_HANDLE))
++ {}
++
++ StdOutSink(FILE *_f):
++ h(GetStdHandle(STD_OUTPUT_HANDLE))
++ {}
++
++ /////////////////////////////////////////////////////////
++ // RAWSink interface
++
++ bool open(const char *_filename)
++ {
++ return true; //f.open(_filename, "wb");
++ }
++
++ bool open(FILE *_f)
++ {
++ return true; //f.open(_f);
++ }
++
++ void close()
++ {
++ //f.close();
++ spk = spk_unknown;
++ }
++
++ bool is_open() const
++ {
++ return ((h != INVALID_HANDLE_VALUE) && (h != 0)); //f.is_open();
++ }
++
++ /////////////////////////////////////////////////////////
++ // Sink interface
++
++ virtual bool query_input(Speakers _spk) const
++ {
++ // cannot write linear format
++ return /*f.is_open() &&*/ _spk.format != FORMAT_LINEAR;
++ }
++
++ virtual bool set_input(Speakers _spk)
++ {
++ if (!query_input(_spk))
++ return false;
++
++ spk = _spk;
++ return true;
++ }
++
++ virtual Speakers get_input() const
++ {
++ return spk;
++ }
++
++ // data write
++ virtual bool process(const Chunk *_chunk)
++ {
++ if (_chunk->is_dummy())
++ return true;
++
++ if (spk != _chunk->spk)
++ if (!set_input(_chunk->spk))
++ return false;
++
++ DWORD bytesWritten = 0;
++ return WriteFile(h, _chunk->rawdata, _chunk->size, &bytesWritten, NULL); //f.write(_chunk->rawdata, _chunk->size) == _chunk->size;
++ }
++};
++
++#endif
--- /dev/null
+ .gitignore | 7 +
+ Makefile.am | 26 +-
+ compiler_info.h | 61 ++++
+ config_msvc.h | 101 +++++++
+ configure.ac | 20 +-
+ dcaenc.c | 88 ++++--
+ dcaenc.h | 24 ++-
+ delphi/DcaEncAPI.pas | 44 +++
+ delphi/DcaEncTest.cfg | 38 +++
+ delphi/DcaEncTest.dof | 136 +++++++++
+ delphi/DcaEncTest.dpr | 15 +
+ delphi/DcaEncTest.res | Bin 0 -> 876 bytes
+ delphi/DcaEncTestForm.dfm | 35 +++
+ delphi/DcaEncTestForm.pas | 111 +++++++
+ dllmain.cpp | 19 ++
+ main.c | 371 +++++++++++++++++++++--
+ math_tables.h | 10 +-
+ unicode_support.c | 225 ++++++++++++++
+ unicode_support.h | 51 ++++
+ vc_solution/dcadll_vc2010.vcxproj | 126 ++++++++
+ vc_solution/dcadll_vc2010.vcxproj.filters | 48 +++
+ vc_solution/dcadll_vc2010.vcxproj.user | 3 +
+ vc_solution/dcaenc_vc2010.sln | 59 ++++
+ vc_solution/dcaenc_vc2010.vcxproj | 206 +++++++++++++
+ vc_solution/dcaenc_vc2010.vcxproj.filters | 48 +++
+ vc_solution/dcaenc_vc2010.vcxproj.user | 3 +
+ vc_solution/dcalib_vc2010.vcxproj | 114 +++++++
+ vc_solution/dcalib_vc2010.vcxproj.filters | 45 +++
+ vc_solution/dcalib_vc2010.vcxproj.user | 3 +
+ vc_solution/gentables.vcxproj | 125 ++++++++
+ vc_solution/gentables.vcxproj.filters | 33 ++
+ vc_solution/lib/EncodePointer.lib | Bin 0 -> 1058 bytes
+ vc_solution/lib/msvcrt_vc6.lib | Bin 0 -> 235942 bytes
+ wavfile.c | 467 +++++++++++++++++++----------
+ wavfile.h | 6 +-
+ xgetopt.c | 206 +++++++++++++
+ xgetopt.h | 29 ++
+ 37 files changed, 2644 insertions(+), 259 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index 2f63d9a..de6fa6a 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -29,3 +29,10 @@ libtool
+ ltmain.sh
+ missing
+ stamp-h1
++vc_solution/ipch/
++vc_solution/Win32/
++vc_solution/x64/
++vc_solution/*.opensdf
++vc_solution/*.sdf
++vc_solution/*.vcxproj.user
++vc_solution/*.suo
+diff --git a/Makefile.am b/Makefile.am
+index f89fe04..7e21572 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -14,19 +14,19 @@ nodist_libdcaenc_la_SOURCES = math_tables.c
+ libdcaenc_la_LDFLAGS = -version-info 0:0:0 \
+ -export-symbols $(top_srcdir)/dcaenc.sym
+
+-if HAVE_ALSA
+-plugin_LTLIBRARIES = libasound_module_pcm_dca.la
+-plugindir = $(libdir)/alsa-lib
+-
+-libasound_module_pcm_dca_la_SOURCES = alsaplugin.c dcaenc.h
+-libasound_module_pcm_dca_la_LIBADD = libdcaenc.la @ALSA_LIBS@
+-libasound_module_pcm_dca_la_LDFLAGS = -no-undefined -avoid-version
+-
+-alsaconfdir = $(datadir)/alsa/pcm
+-alsaconf_DATA = dca.conf
+-endif
+-
+-dcaenc_SOURCES = main.c wavfile.c dcaenc.h wavfile.h
++#if HAVE_ALSA
++#plugin_LTLIBRARIES = libasound_module_pcm_dca.la
++#plugindir = $(libdir)/alsa-lib
++#
++#libasound_module_pcm_dca_la_SOURCES = alsaplugin.c dcaenc.h
++#libasound_module_pcm_dca_la_LIBADD = libdcaenc.la @ALSA_LIBS@
++#libasound_module_pcm_dca_la_LDFLAGS = -no-undefined -avoid-version
++#
++#alsaconfdir = $(datadir)/alsa/pcm
++#alsaconf_DATA = dca.conf
++#endif
++
++dcaenc_SOURCES = main.c wavfile.c unicode_support.c xgetopt.c dcaenc.h wavfile.h unicode_support.h xgetopt.h
+ dcaenc_LDADD = libdcaenc.la
+
+ gentables_SOURCES = gentables.c \
+diff --git a/compiler_info.h b/compiler_info.h
+new file mode 100644
+index 0000000..01b1cc9
+--- /dev/null
++++ b/compiler_info.h
+@@ -0,0 +1,61 @@
++/*
++ * This file is part of dcaenc.
++ *
++ * Copyright (c) 2008-2011 Alexander E. Patrakov <patrakov@gmail.com>
++ *
++ * dcaenc is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * dcaenc 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with dcaenc; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef COMPILER_INFO_H
++#define COMPILER_INFO_H
++
++#ifndef _T
++#define __T(X) #X
++#define _T(X) __T(X)
++#endif
++
++#if defined(__INTEL_COMPILER)
++ #if (__INTEL_COMPILER >= 1200)
++ #define __COMPILER__ "ICL 12.x"
++ #elif (__INTEL_COMPILER >= 1100)
++ #define __COMPILER__ = "ICL 11.x"
++ #elif (__INTEL_COMPILER >= 1000)
++ #define __COMPILER__ = "ICL 10.x"
++ #else
++ #define __COMPILER__ "ICL Unknown"
++ #endif
++#elif defined(_MSC_VER)
++ #if (_MSC_VER == 1600)
++ #if (_MSC_FULL_VER >= 160040219)
++ #define __COMPILER__ "MSVC 2010-SP1"
++ #else
++ #define __COMPILER__ "MSVC 2010"
++ #endif
++ #elif (_MSC_VER == 1500)
++ #if (_MSC_FULL_VER >= 150030729)
++ #define __COMPILER__ "MSVC 2008-SP1"
++ #else
++ #define __COMPILER__ "MSVC 2008"
++ #endif
++ #else
++ #define __COMPILER__ "MSVC Unknown"
++ #endif
++#elif defined(__GNUC__)
++ #define __COMPILER__ "GNU GCC " _T(__GNUC__) "." _T(__GNUC_MINOR__)
++#else
++ #define __COMPILER__ "Unknown"
++#endif
++
++#endif
+diff --git a/config_msvc.h b/config_msvc.h
+new file mode 100644
+index 0000000..d72ce68
+--- /dev/null
++++ b/config_msvc.h
+@@ -0,0 +1,101 @@
++/* config.h. Generated from config.h.in by configure. */
++/* config.h.in. Generated from configure.ac by autoheader. */
++
++/* Define to 1 if you have the <dlfcn.h> header file. */
++/* #undef HAVE_DLFCN_H */
++
++/* Define to 1 if you have the <inttypes.h> header file. */
++/* #undef HAVE_INTTYPES_H */
++
++/* Define to 1 if you have the `asound' library (-lasound). */
++/* #undef HAVE_LIBASOUND */
++
++/* Define to 1 if you have the <memory.h> header file. */
++#define HAVE_MEMORY_H 1
++
++/* Define to 1 if you have the <stdint.h> header file. */
++#define HAVE_STDINT_H 1
++
++/* Define to 1 if you have the <stdlib.h> header file. */
++#define HAVE_STDLIB_H 1
++
++/* Define to 1 if you have the <strings.h> header file. */
++/* #undef HAVE_STRINGS_H */
++
++/* Define to 1 if you have the <string.h> header file. */
++#define HAVE_STRING_H 1
++
++/* Define to 1 if you have the <sys/stat.h> header file. */
++#define HAVE_SYS_STAT_H 1
++
++/* Define to 1 if you have the <sys/types.h> header file. */
++#define HAVE_SYS_TYPES_H 1
++
++/* Define to 1 if you have the <unistd.h> header file. */
++/* #undef HAVE_UNISTD_H */
++
++/* Define to the sub-directory in which libtool stores uninstalled libraries.
++ */
++#define LT_OBJDIR ".libs/"
++
++/* Name of package */
++#define PACKAGE "dcaenc"
++
++/* Define to the address where bug reports for this package should be sent. */
++#define PACKAGE_BUGREPORT "patrakov@gmail.com"
++
++/* Define to the full name of this package. */
++#define PACKAGE_NAME "dcaenc"
++
++/* Define to the full name and version of this package. */
++#define PACKAGE_STRING "dcaenc 1"
++
++/* Define to the one symbol short name of this package. */
++#define PACKAGE_TARNAME "dcaenc"
++
++/* Define to the home page for this package. */
++#define PACKAGE_URL "http://aepatrakov.narod.ru/dcaenc/"
++
++/* Define to the version of this package. */
++#define PACKAGE_VERSION "1"
++
++/* Define to 1 if you have the ANSI C header files. */
++#define STDC_HEADERS 1
++
++/* Version number of package */
++#define VERSION "1"
++
++/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
++ #define below would cause a syntax error. */
++/* #undef _UINT32_T */
++
++/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
++ #define below would cause a syntax error. */
++/* #undef _UINT8_T */
++
++/* Define to `__inline__' or `__inline' if that's what the C compiler
++ calls it, or to nothing if 'inline' is not supported under any name. */
++/* #ifndef __cplusplus */
++#define inline __inline
++/* #endif */
++
++/* Define to the type of a signed integer type of width exactly 32 bits if
++ such a type exists and the standard includes do not define it. */
++/* #undef int32_t */
++
++/* Define to the type of a signed integer type of width exactly 64 bits if
++ such a type exists and the standard includes do not define it. */
++/* #undef int64_t */
++
++/* Define to `unsigned int' if <sys/types.h> does not define. */
++/* #undef size_t */
++
++/* Define to the type of an unsigned integer type of width exactly 32 bits if
++ such a type exists and the standard includes do not define it. */
++/* #undef uint32_t */
++
++/* Define to the type of an unsigned integer type of width exactly 8 bits if
++ such a type exists and the standard includes do not define it. */
++/* #undef uint8_t */
+diff --git a/configure.ac b/configure.ac
+index db25f0a..78c0c07 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -13,7 +13,7 @@ LT_INIT([disable-static])
+
+ # Checks for programs.
+ AC_PROG_CC
+-PKG_PROG_PKG_CONFIG
++#PKG_PROG_PKG_CONFIG
+
+ # Checks for libraries.
+ AC_ARG_ENABLE([alsa],
+@@ -21,15 +21,15 @@ AC_ARG_ENABLE([alsa],
+
+ ac_save_LIBS="$LIBS"
+
+-if test "x$enable_alsa" != "xno"; then
+- PKG_CHECK_MODULES([ALSA], [alsa >= 1.0.11], [HAVE_ALSA=yes], [HAVE_ALSA=no])
+- AC_CHECK_LIB(asound, snd_pcm_extplug_create,,
+- [HAVE_ALSA=no], -ldl)
+- if test "x$enable_alsa" = "xyes" -a "x$HAVE_ALSA" = "xno"; then
+- AC_MSG_ERROR([ALSA libraries not found])
+- fi
+-fi
+-AM_CONDITIONAL(HAVE_ALSA, test "x$enable_alsa" != "xno" -a "x$HAVE_ALSA" = "xyes")
++#if test "x$enable_alsa" != "xno"; then
++# PKG_CHECK_MODULES([ALSA], [alsa >= 1.0.11], [HAVE_ALSA=yes], [HAVE_ALSA=no])
++# AC_CHECK_LIB(asound, snd_pcm_extplug_create,,
++# [HAVE_ALSA=no], -ldl)
++# if test "x$enable_alsa" = "xyes" -a "x$HAVE_ALSA" = "xno"; then
++# AC_MSG_ERROR([ALSA libraries not found])
++# fi
++#fi
++#AM_CONDITIONAL(HAVE_ALSA, test "x$enable_alsa" != "xno" -a "x$HAVE_ALSA" = "xyes")
+ LIBS="$ac_save_LIBS"
+
+ # Checks for header files.
+diff --git a/dcaenc.c b/dcaenc.c
+index 5e762ce..bf0eacf 100644
+--- a/dcaenc.c
++++ b/dcaenc.c
+@@ -20,6 +20,7 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <assert.h>
++#include "config.h"
+ #include "dcaenc.h"
+ #include "dcaenc_private.h"
+ #include "int_data.h"
+@@ -30,10 +31,9 @@
+ #define div_round_up(a, b) (((a) + (b) - 1) / (b))
+ #define round_up(a, b) ((((a) + (b) - 1) / (b)) * (b))
+
+-dcaenc_context dcaenc_create(int sample_rate, int channel_config,
+- int approx_bitrate, int flags)
++dcaenc_context dcaenc_create(int sample_rate, int channel_config, int approx_bitrate, int flags)
+ {
+- int i, frame_bits, bit_step, fir, useful_bitrate;
++ int i, frame_bits, bit_step, fir, useful_bitrate, min_frame_bits;
+ dcaenc_context result;
+
+ i = 0;
+@@ -60,7 +60,7 @@ dcaenc_context dcaenc_create(int sample_rate, int channel_config,
+ /* Round frame_bits up to the next permitted value */
+ frame_bits = round_up(frame_bits, bit_step);
+
+- int min_frame_bits = 132 + (493 + 28 * 32) * channels_table[channel_config];
++ min_frame_bits = 132 + (493 + 28 * 32) * channels_table[channel_config];
+ if (flags & DCAENC_FLAG_LFE)
+ min_frame_bits += 72;
+
+@@ -108,19 +108,19 @@ int dcaenc_output_size(dcaenc_context c)
+ return c->frame_bits / ((c->flags & DCAENC_FLAG_28BIT) ? 7 : 8);
+ }
+
+-static inline const int32_t *pcm_sample(dcaenc_context c,
+- const int32_t *container,
+- int sample, int channel)
++inline static const int32_t *pcm_sample(dcaenc_context c,
++ const int32_t *container,
++ int sample, int channel)
+ {
+ return &container[sample * c->channels + channel];
+ }
+
+-static inline int32_t half32(int32_t a)
++inline static int32_t half32(int32_t a)
+ {
+ return (a + 1) >> 1;
+ }
+
+-static inline int32_t mul32(int32_t a, int32_t b)
++inline static int32_t mul32(int32_t a, int32_t b)
+ {
+ int64_t r = (int64_t)a * b + 0x80000000ULL;
+ return r >> 32;
+@@ -148,7 +148,7 @@ static void dcaenc_subband_transform(dcaenc_context c, const int32_t *input)
+ accum[i] = 0;
+
+ for (k = 0, i = hist_start, j = 0;
+- i < 512; k = (k + 1) & 63, i++, j++)
++ i < 512; k = (k + 1) & 63, i++, j++)
+ accum[k] += mul32(hist[i], c->band_interpolation[j]);
+ for (i = 0; i < hist_start; k = (k + 1) & 63, i++, j++)
+ accum[k] += mul32(hist[i], c->band_interpolation[j]);
+@@ -204,7 +204,7 @@ static void dcaenc_lfe_downsample(dcaenc_context c, const int32_t *input)
+ /* Copy in 64 new samples from input */
+ for (i = 0; i < 64; i++)
+ hist[i + hist_start] = *pcm_sample(c, input,
+- lfes * 64 + i, c->channels - 1);
++ lfes * 64 + i, c->channels - 1);
+
+ hist_start = (hist_start + 64) & 511;
+ }
+@@ -313,7 +313,7 @@ static int32_t add_cb(int32_t a, int32_t b)
+
+ /* accepts anything, out_cb[i] can only grow */
+ static void adjust_jnd(int samplerate_index,
+- const int32_t in[512], int32_t out_cb[256])
++ const int32_t in[512], int32_t out_cb[256])
+ {
+ int i, j;
+ int32_t power[256];
+@@ -336,7 +336,7 @@ static void adjust_jnd(int samplerate_index,
+ denom = add_cb(denom, power[j] + auf[samplerate_index][i][j]);
+ for (j = 0; j < 256; j++)
+ out_cb_unnorm[j] = add_cb(out_cb_unnorm[j],
+- -denom + auf[samplerate_index][i][j]);
++ -denom + auf[samplerate_index][i][j]);
+ }
+
+ for (j = 0; j < 256; j++)
+@@ -345,11 +345,11 @@ static void adjust_jnd(int samplerate_index,
+
+
+ typedef void (*walk_band_t)(dcaenc_context c, int band1, int band2, int f,
+- int32_t spectrum1, int32_t spectrum2, int channel,
+- int32_t * arg);
++ int32_t spectrum1, int32_t spectrum2, int channel,
++ int32_t * arg);
+
+ static void walk_band_low(dcaenc_context c, int band, int channel,
+- walk_band_t walk, int32_t * arg)
++ walk_band_t walk, int32_t * arg)
+ {
+ int f;
+ if (band == 0) {
+@@ -358,12 +358,12 @@ static void walk_band_low(dcaenc_context c, int band, int channel,
+ } else {
+ for (f = 0; f < 8; f++)
+ walk(c, band, band - 1, 8 * band - 4 + f,
+- c->band_spectrum[7 - f], c->band_spectrum[f], channel, arg);
++ c->band_spectrum[7 - f], c->band_spectrum[f], channel, arg);
+ }
+ }
+
+ static void walk_band_high(dcaenc_context c, int band, int channel,
+- walk_band_t walk, int32_t * arg)
++ walk_band_t walk, int32_t * arg)
+ {
+ int f;
+ if (band == 31) {
+@@ -372,12 +372,12 @@ static void walk_band_high(dcaenc_context c, int band, int channel,
+ } else {
+ for (f = 0; f < 8; f++)
+ walk(c, band, band + 1, 8 * band + 4 + f,
+- c->band_spectrum[f], c->band_spectrum[7 - f], channel, arg);
++ c->band_spectrum[f], c->band_spectrum[7 - f], channel, arg);
+ }
+ }
+
+ static void walk_whole_spectrum(dcaenc_context c, int channel,
+- walk_band_t walk, int32_t * arg)
++ walk_band_t walk, int32_t * arg)
+ {
+ int band;
+ for (band = 0; band < 32; band++)
+@@ -453,10 +453,14 @@ static void dcaenc_find_peaks(dcaenc_context c)
+ }
+
+ static const int snr_fudge = 128;
++static const int USED_1ABITS = 1;
++static const int USED_NABITS = 2;
++static const int USED_26ABITS = 4;
+
+-static void init_quantization_noise(dcaenc_context c, int noise)
++static int init_quantization_noise(dcaenc_context c, int noise)
+ {
+ int ch, band;
++ int ret = 0;
+
+ c->consumed_bits = 132 + 493 * c->fullband_channels;
+ if (c->flags & DCAENC_FLAG_LFE)
+@@ -472,10 +476,19 @@ static void init_quantization_noise(dcaenc_context c, int noise)
+ - c->band_masking_cb[band]
+ - noise;
+
+- c->abits[band][ch] = (snr_cb >= 1312) ? 26
+- : (snr_cb >= 222) ? (8 + mul32(snr_cb - 222, 69000000))
+- : (snr_cb >= 0) ? (2 + mul32(snr_cb, 106000000))
+- : 1;
++ if (snr_cb >= 1312) {
++ c->abits[band][ch] = 26;
++ ret |= USED_26ABITS;
++ } else if (snr_cb >= 222) {
++ c->abits[band][ch] = 8 + mul32(snr_cb - 222, 69000000);
++ ret |= USED_NABITS;
++ } else if (snr_cb >= 0) {
++ c->abits[band][ch] = 2 + mul32(snr_cb, 106000000);
++ ret |= USED_NABITS;
++ } else {
++ c->abits[band][ch] = 1;
++ ret |= USED_1ABITS;
++ }
+ }
+ }
+
+@@ -484,36 +497,41 @@ static void init_quantization_noise(dcaenc_context c, int noise)
+ c->consumed_bits += bit_consumption[c->abits[band][ch]];
+ }
+
++ return ret;
+ }
+
+ static void dcaenc_assign_bits(dcaenc_context c)
+ {
+ /* Find the bounds where the binary search should work */
+- int low, high;
++ int low, high, down, used_abits;
+ init_quantization_noise(c, c->worst_quantization_noise);
+ low = high = c->worst_quantization_noise;
++ used_abits = 0;
+ if (c->consumed_bits > c->frame_bits) {
+ while (c->consumed_bits > c->frame_bits) {
++ assert(("Too low bitrate should have been rejected in dcaenc_create", used_abits != USED_1ABITS));
+ low = high;
+ high += snr_fudge;
+- init_quantization_noise(c, high);
++ used_abits = init_quantization_noise(c, high);
+ }
+ } else {
+ while (c->consumed_bits <= c->frame_bits) {
+ high = low;
++ if (used_abits == USED_26ABITS)
++ goto out; /* The requested bitrate is too high, pad with zeros */
+ low -= snr_fudge;
+- init_quantization_noise(c, low);
++ used_abits = init_quantization_noise(c, low);
+ }
+ }
+
+ /* Now do a binary search between low and high to see what fits */
+- int down;
+ for (down = snr_fudge >> 1; down; down >>= 1) {
+ init_quantization_noise(c, high - down);
+ if (c->consumed_bits <= c->frame_bits)
+ high -= down;
+ }
+ init_quantization_noise(c, high);
++out:
+ c->worst_quantization_noise = high;
+ if (high > c->worst_noise_ever)
+ c->worst_noise_ever = high;
+@@ -538,8 +556,9 @@ static void bitstream_init(dcaenc_context c, uint8_t *output)
+
+ static void bitstream_put(dcaenc_context c, uint32_t bits, int nbits)
+ {
++ int max_bits;
+ assert(bits < (1 << nbits));
+- int max_bits = (c->flags & DCAENC_FLAG_28BIT) ? 28 : 32;
++ max_bits = (c->flags & DCAENC_FLAG_28BIT) ? 28 : 32;
+ c->wrote += nbits;
+ bits &= ~(0xffffffff << nbits);
+ if (nbits + c->wbits >= max_bits) {
+@@ -599,7 +618,7 @@ static int32_t dcaenc_quantize_value(int32_t value, softfloat quant)
+ static int32_t dcaenc_quantize(dcaenc_context c, int sample, int band, int ch)
+ {
+ int32_t result = dcaenc_quantize_value(c->subband_samples[sample][band][ch],
+- c->quant[band][ch]);
++ c->quant[band][ch]);
+
+ assert(result <= (quant_levels[c->abits[band][ch]] - 1) / 2);
+ assert(result >= -(quant_levels[c->abits[band][ch]] / 2));
+@@ -608,11 +627,12 @@ static int32_t dcaenc_quantize(dcaenc_context c, int sample, int band, int ch)
+
+ static int dcaenc_calc_one_scale(int32_t peak_cb, int abits, softfloat *quant)
+ {
+- assert(peak_cb <= 0);
+- assert(peak_cb >= -2047);
+- int32_t peak = cb_to_level[-peak_cb];
+ int our_nscale, try_remove;
++ int32_t peak;
+ softfloat our_quant;
++ assert(peak_cb <= 0);
++ assert(peak_cb >= -2047);
++ peak = cb_to_level[-peak_cb];
+ our_nscale = 127;
+
+ for (try_remove = 64; try_remove > 0; try_remove >>= 1) {
+diff --git a/dcaenc.h b/dcaenc.h
+index 17f01f3..f62a58b 100644
+--- a/dcaenc.h
++++ b/dcaenc.h
+@@ -48,11 +48,23 @@ typedef struct dcaenc_context_s *dcaenc_context;
+ #define DCAENC_CHANNELS_4FRONT_4REAR 14
+ #define DCAENC_CHANNELS_5FRONT_3REAR 15
+
+-dcaenc_context dcaenc_create(int sample_rate, int channel_config, int approx_bitrate, int flags);
+-int dcaenc_bitrate(dcaenc_context c);
+-int dcaenc_input_size(dcaenc_context c);
+-int dcaenc_output_size(dcaenc_context c);
+-int dcaenc_convert_s32(dcaenc_context c, const int32_t *input, uint8_t *output);
+-int dcaenc_destroy(dcaenc_context c, uint8_t *output);
++#if defined(_MSC_VER) || defined(__INTEL_COMPILER)
++ #if defined(DCADLL_VC2010_EXPORTS)
++ #define MAKE_DLL __declspec(dllexport)
++ #elif defined(DCADLL_VC2010_IMPORTS)
++ #define MAKE_DLL __declspec(dllimport)
++ #else
++ #define MAKE_DLL
++ #endif
++#else
++ #define MAKE_DLL
++#endif
++
++MAKE_DLL dcaenc_context dcaenc_create(int sample_rate, int channel_config, int approx_bitrate, int flags);
++MAKE_DLL int dcaenc_bitrate(dcaenc_context c);
++MAKE_DLL int dcaenc_input_size(dcaenc_context c);
++MAKE_DLL int dcaenc_output_size(dcaenc_context c);
++MAKE_DLL int dcaenc_convert_s32(dcaenc_context c, const int32_t *input, uint8_t *output);
++MAKE_DLL int dcaenc_destroy(dcaenc_context c, uint8_t *output);
+
+ #endif
+diff --git a/delphi/DcaEncAPI.pas b/delphi/DcaEncAPI.pas
+new file mode 100644
+index 0000000..7cc0735
+--- /dev/null
++++ b/delphi/DcaEncAPI.pas
+@@ -0,0 +1,44 @@
++unit DcaEncAPI;
++
++interface
++
++uses Windows, SysUtils;
++
++const
++ DCAENC_FLAG_28BIT = 1;
++ DCAENC_FLAG_BIGENDIAN = 2;
++ DCAENC_FLAG_LFE = 4;
++ DCAENC_FLAG_PERFECT_QMF = 8;
++ DCAENC_FLAG_IEC_WRAP = 16;
++
++ DCAENC_CHANNELS_MONO = 0;
++ DCAENC_CHANNELS_DUAL_MONO = 1;
++ DCAENC_CHANNELS_STEREO = 2;
++ DCAENC_CHANNELS_STEREO_SUMDIFF = 3;
++ DCAENC_CHANNELS_STEREO_TOTAL = 4;
++ DCAENC_CHANNELS_3FRONT = 5;
++ DCAENC_CHANNELS_2FRONT_1REAR = 6;
++ DCAENC_CHANNELS_3FRONT_1REAR = 7;
++ DCAENC_CHANNELS_2FRONT_2REAR = 8;
++ DCAENC_CHANNELS_3FRONT_2REAR = 9;
++ DCAENC_CHANNELS_4FRONT_2REAR = 10;
++ DCAENC_CHANNELS_3FRONT_2REAR_1OV = 11;
++ DCAENC_CHANNELS_3FRONT_3REAR = 12;
++ DCAENC_CHANNELS_5FRONT_2REAR = 13;
++ DCAENC_CHANNELS_4FRONT_4REAR = 14;
++ DCAENC_CHANNELS_5FRONT_3REAR = 15;
++
++type
++ TDcaEncContext = Pointer;
++
++function dcaenc_create(sample_rate, channel_config, approx_bitrate, flags: integer): TDcaEncContext; cdecl; external 'dcaenc-0.dll';
++function dcaenc_bitrate(c : TDcaEncContext): integer; cdecl; external 'dcaenc-0.dll';
++function dcaenc_input_size(c : TDcaEncContext): integer; cdecl; external 'dcaenc-0.dll';
++function dcaenc_output_size(c : TDcaEncContext): integer; cdecl; external 'dcaenc-0.dll';
++function dcaenc_convert_s32(c : TDcaEncContext; input: PLongInt; output: PByte): integer; cdecl; external 'dcaenc-0.dll';
++function dcaenc_destroy(c : TDcaEncContext; output: PByte): integer; cdecl; external 'dcaenc-0.dll';
++
++implementation
++
++end.
++
+diff --git a/delphi/DcaEncTest.cfg b/delphi/DcaEncTest.cfg
+new file mode 100644
+index 0000000..30e6ed7
+--- /dev/null
++++ b/delphi/DcaEncTest.cfg
+@@ -0,0 +1,38 @@
++-$A8
++-$B-
++-$C+
++-$D+
++-$E-
++-$F-
++-$G+
++-$H+
++-$I+
++-$J-
++-$K-
++-$L+
++-$M-
++-$N+
++-$O+
++-$P+
++-$Q-
++-$R-
++-$S-
++-$T-
++-$U-
++-$V+
++-$W-
++-$X+
++-$YD
++-$Z1
++-cg
++-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
++-H+
++-W+
++-M
++-$M16384,1048576
++-K$00400000
++-LE"e:\delphi 7\Projects\Bpl"
++-LN"e:\delphi 7\Projects\Bpl"
++-w-UNSAFE_TYPE
++-w-UNSAFE_CODE
++-w-UNSAFE_CAST
+diff --git a/delphi/DcaEncTest.dof b/delphi/DcaEncTest.dof
+new file mode 100644
+index 0000000..2b75114
+--- /dev/null
++++ b/delphi/DcaEncTest.dof
+@@ -0,0 +1,136 @@
++[FileVersion]
++Version=7.0
++[Compiler]
++A=8
++B=0
++C=1
++D=1
++E=0
++F=0
++G=1
++H=1
++I=1
++J=0
++K=0
++L=1
++M=0
++N=1
++O=1
++P=1
++Q=0
++R=0
++S=0
++T=0
++U=0
++V=1
++W=0
++X=1
++Y=1
++Z=1
++ShowHints=1
++ShowWarnings=1
++UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
++NamespacePrefix=
++SymbolDeprecated=1
++SymbolLibrary=1
++SymbolPlatform=1
++UnitLibrary=1
++UnitPlatform=1
++UnitDeprecated=1
++HResultCompat=1
++HidingMember=1
++HiddenVirtual=1
++Garbage=1
++BoundsError=1
++ZeroNilCompat=1
++StringConstTruncated=1
++ForLoopVarVarPar=1
++TypedConstVarPar=1
++AsgToTypedConst=1
++CaseLabelRange=1
++ForVariable=1
++ConstructingAbstract=1
++ComparisonFalse=1
++ComparisonTrue=1
++ComparingSignedUnsigned=1
++CombiningSignedUnsigned=1
++UnsupportedConstruct=1
++FileOpen=1
++FileOpenUnitSrc=1
++BadGlobalSymbol=1
++DuplicateConstructorDestructor=1
++InvalidDirective=1
++PackageNoLink=1
++PackageThreadVar=1
++ImplicitImport=1
++HPPEMITIgnored=1
++NoRetVal=1
++UseBeforeDef=1
++ForLoopVarUndef=1
++UnitNameMismatch=1
++NoCFGFileFound=1
++MessageDirective=1
++ImplicitVariants=1
++UnicodeToLocale=1
++LocaleToUnicode=1
++ImagebaseMultiple=1
++SuspiciousTypecast=1
++PrivatePropAccessor=1
++UnsafeType=0
++UnsafeCode=0
++UnsafeCast=0
++[Linker]
++MapFile=0
++OutputObjs=0
++ConsoleApp=1
++DebugInfo=0
++RemoteSymbols=0
++MinStackSize=16384
++MaxStackSize=1048576
++ImageBase=4194304
++ExeDescription=
++[Directories]
++OutputDir=
++UnitOutputDir=
++PackageDLLOutputDir=
++PackageDCPOutputDir=
++SearchPath=
++Packages=vcl;rtl;vclx;indy;vclie;xmlrtl;inetdbbde;inet;inetdbxpress;dbrtl;soaprtl;dsnap;VclSmp;dbexpress;vcldb;dbxcds;inetdb;bdertl;vcldbx;adortl;teeui;teedb;tee;ibxpress;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;JclDeveloperTools;Jcl;JclVcl;JclContainers;JvCore;JvSystem;JvStdCtrls;JvAppFrm;JvBands;JvDB;JvDlgs;JvBDE;JvControls;JvCmp;JvCrypt;JvCustom;JvDocking;JvDotNetCtrls;JvGlobus;JvHMI;JvJans;JvManagedThreads;JvMM;JvNet;JvPageComps;JvPascalInterpreter;JvPluginSystem;JvPrintPreview;JvRuntimeDesign;JvTimeFramework;JvWizards;JvXPCtrls
++Conditionals=
++DebugSourceDirs=
++UsePackages=0
++[Parameters]
++RunParams=
++HostApplication=
++Launcher=
++UseLauncher=0
++DebugCWD=
++[Language]
++ActiveLang=
++ProjectLang=
++RootDir=
++[Version Info]
++IncludeVerInfo=0
++AutoIncBuild=0
++MajorVer=1
++MinorVer=0
++Release=0
++Build=0
++Debug=0
++PreRelease=0
++Special=0
++Private=0
++DLL=0
++Locale=1031
++CodePage=1252
++[Version Info Keys]
++CompanyName=
++FileDescription=
++FileVersion=1.0.0.0
++InternalName=
++LegalCopyright=
++LegalTrademarks=
++OriginalFilename=
++ProductName=
++ProductVersion=1.0.0.0
++Comments=
+diff --git a/delphi/DcaEncTest.dpr b/delphi/DcaEncTest.dpr
+new file mode 100644
+index 0000000..613e628
+--- /dev/null
++++ b/delphi/DcaEncTest.dpr
+@@ -0,0 +1,15 @@
++program DcaEncTest;
++
++uses
++ Forms,
++ DcaEncTestForm in 'DcaEncTestForm.pas' {Form1},
++ DcaEncAPI in 'DcaEncAPI.pas';
++
++{$R *.res}
++
++begin
++ Application.Initialize;
++ Application.Title := 'DCA Enc';
++ Application.CreateForm(TForm1, Form1);
++ Application.Run;
++end.
+diff --git a/delphi/DcaEncTest.res b/delphi/DcaEncTest.res
+new file mode 100644
+index 0000000..1e4099b
+Binary files /dev/null and b/delphi/DcaEncTest.res differ
+diff --git a/delphi/DcaEncTestForm.dfm b/delphi/DcaEncTestForm.dfm
+new file mode 100644
+index 0000000..5fb08d1
+--- /dev/null
++++ b/delphi/DcaEncTestForm.dfm
+@@ -0,0 +1,35 @@
++object Form1: TForm1
++ Left = 307
++ Top = 231
++ BorderIcons = [biSystemMenu, biMinimize]
++ BorderStyle = bsDialog
++ Caption = 'DCA Enc Test'
++ ClientHeight = 74
++ ClientWidth = 729
++ Color = clBtnFace
++ Font.Charset = DEFAULT_CHARSET
++ Font.Color = clWindowText
++ Font.Height = -11
++ Font.Name = 'MS Sans Serif'
++ Font.Style = []
++ OldCreateOrder = False
++ OnCloseQuery = FormCloseQuery
++ PixelsPerInch = 96
++ TextHeight = 13
++ object Button1: TButton
++ Left = 8
++ Top = 8
++ Width = 169
++ Height = 25
++ Caption = 'Begin Test'
++ TabOrder = 0
++ OnClick = Button1Click
++ end
++ object ProgressBar1: TProgressBar
++ Left = 8
++ Top = 48
++ Width = 713
++ Height = 17
++ TabOrder = 1
++ end
++end
+diff --git a/delphi/DcaEncTestForm.pas b/delphi/DcaEncTestForm.pas
+new file mode 100644
+index 0000000..ae42a14
+--- /dev/null
++++ b/delphi/DcaEncTestForm.pas
+@@ -0,0 +1,111 @@
++unit DcaEncTestForm;
++
++interface
++
++uses
++ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
++ Dialogs, StdCtrls, DcaEncAPI, ComCtrls;
++
++type
++ TForm1 = class(TForm)
++ Button1: TButton;
++ ProgressBar1: TProgressBar;
++ procedure Button1Click(Sender: TObject);
++ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
++ private
++ { Private-Deklarationen }
++ public
++ { Public-Deklarationen }
++ end;
++
++var
++ Form1: TForm1;
++
++implementation
++
++{$R *.dfm}
++
++procedure TForm1.Button1Click(Sender: TObject);
++var
++ Context: TDcaEncContext;
++ InputBuffer: array of LongInt;
++ OutputBuffer: array of Byte;
++ SamplesInInput: Integer;
++ MaxBytesInOutput: Integer;
++ BytesReturned: Cardinal;
++ BytesWritten: Cardinal;
++ i: Integer;
++ h: THandle;
++const
++ ChannelsInInput: Integer = 2;
++ EncodeSteps: Integer = 10240;
++begin
++ Button1.Enabled := False;
++ ProgressBar1.Position := 0;
++ Application.ProcessMessages;
++
++ //Create DCA Enc context
++ Context := dcaenc_create(44100, DCAENC_CHANNELS_STEREO, 768000, DCAENC_FLAG_BIGENDIAN);
++
++ //Context created successfully?
++ if(Context = nil) then
++ begin
++ ShowMessage('Failed to create context!');
++ Exit;
++ end;
++
++ //Detect input/output size
++ SamplesInInput := dcaenc_input_size(Context);
++ MaxBytesInOutput := dcaenc_output_size(Context);
++
++ //Some feedback
++ ShowMessage('SamplesInInput = ' + IntToStr(SamplesInInput));
++ ShowMessage('MaxBytesInOutput = ' + IntToStr(MaxBytesInOutput));
++
++ //Allocate buffers
++ SetLength(InputBuffer, SamplesInInput * ChannelsInInput);
++ SetLength(OutputBuffer, MaxBytesInOutput);
++
++ //ZeroBuffers
++ ZeroMemory(@InputBuffer[0], SizeOf(LongInt) * SamplesInInput * ChannelsInInput);
++ ZeroMemory(@OutputBuffer[0], SizeOf(Byte) * MaxBytesInOutput);
++
++ //Create an output file
++ h := CreateFile('Test.dts', GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
++ if(h = INVALID_HANDLE_VALUE) then
++ begin
++ ShowMessage('Failed to create output file!');
++ Exit;
++ end;
++
++ //Encode loop
++ for i := 0 to EncodeSteps do
++ begin
++ // TODO: Load the next 'SamplesInInput' samples into 'InputBuffer' here!
++ // Be aware that samples have to be 32-Bit Signed for DCAEnc.
++
++ BytesReturned := dcaenc_convert_s32(Context, @InputBuffer[0], @OutputBuffer[0]);
++ WriteFile(h, OutputBuffer[0], BytesReturned, BytesWritten, nil);
++ ProgressBar1.Position := Round((i / EncodeSteps) * 100.0);
++ Application.ProcessMessages;
++ end;
++
++ //Finalize Encode
++ BytesReturned := dcaenc_destroy(Context, @OutputBuffer[0]);
++ WriteFile(h, OutputBuffer[0], BytesReturned, BytesWritten, nil);
++
++ //Close output
++ CloseHandle(h);
++
++ //We are done!
++ ShowMessage('Encode has completed :-)');
++ Button1.Enabled := True;
++ Application.ProcessMessages;
++end;
++
++procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
++begin
++ CanClose := Button1.Enabled;
++end;
++
++end.
+diff --git a/dllmain.cpp b/dllmain.cpp
+new file mode 100644
+index 0000000..cd5e470
+--- /dev/null
++++ b/dllmain.cpp
+@@ -0,0 +1,19 @@
++// dllmain.cpp : Defines the entry point for the DLL application.
++#include <Windows.h>
++
++BOOL APIENTRY DllMain( HMODULE hModule,
++ DWORD ul_reason_for_call,
++ LPVOID lpReserved
++ )
++{
++ switch (ul_reason_for_call)
++ {
++ case DLL_PROCESS_ATTACH:
++ case DLL_THREAD_ATTACH:
++ case DLL_THREAD_DETACH:
++ case DLL_PROCESS_DETACH:
++ break;
++ }
++ return TRUE;
++}
++
+diff --git a/main.c b/main.c
+index dcc7034..829fd2b 100644
+--- a/main.c
++++ b/main.c
+@@ -20,62 +20,373 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
++
+ #include "config.h"
++
+ #include "dcaenc.h"
+ #include "wavfile.h"
++#include "unicode_support.h"
++#include "xgetopt.h"
++#include "compiler_info.h"
++
++//extern const int32_t prototype_filter[512];
+
+-extern const int32_t prototype_filter[512];
++static char status[4] = {'|','/','-','\\'};
++static const int AUTO_SELECT = -1;
+
+-int main(int argc, char *argv[])
++#define BUFFSIZE_SPL 512
++#define BUFFSIZE_CHN 6
++#define BUFFSIZE_OUT 16384
++
++static int dcaenc_main(int argc, char *argv[])
+ {
+ dcaenc_context c;
+- int32_t data[512 * 6];
+- uint8_t output[16384];
++ int32_t data[BUFFSIZE_SPL * BUFFSIZE_CHN];
++ uint8_t output[BUFFSIZE_OUT];
+ wavfile * f;
+ FILE * outfile;
++ const char *error_msg;
++ unsigned int samples_total;
++ unsigned int samples_read;
++ unsigned int samples_read_total;
++ unsigned int current_pos;
++ double percent_done;
+ int bitrate;
+ int wrote;
+- int samples_total;
++ int counter;
++ int status_idx;
++ int show_ver;
++ int show_help;
++ int ignore_len;
++ int enc_flags;
++ int channel_config;
++ int has_lfe;
++ xgetopt_t opt;
++ char t;
++ char *file_input;
++ char *file_output;
++
++ static const int channel_map[6] = {DCAENC_CHANNELS_MONO, DCAENC_CHANNELS_STEREO, DCAENC_CHANNELS_3FRONT,
++ DCAENC_CHANNELS_2FRONT_2REAR, DCAENC_CHANNELS_3FRONT_2REAR, DCAENC_CHANNELS_3FRONT_2REAR};
++
++ fprintf(stderr, "%s-%s [%s]\n", PACKAGE_NAME, PACKAGE_VERSION, __DATE__);
++ fprintf(stderr, "Copyright (c) 2008-2011 Alexander E. Patrakov <patrakov@gmail.com>\n\n");
++ fprintf(stderr, "This program is free software: you can redistribute it and/or modify\n");
++ fprintf(stderr, "it under the terms of the GNU General Public License <http://www.gnu.org/>.\n");
++ fprintf(stderr, "Note that this program is distributed with ABSOLUTELY NO WARRANTY.\n\n");
++
++ // ----------------------------
++
++ file_input = NULL;
++ file_output = NULL;
++ bitrate = 0;
++ enc_flags = DCAENC_FLAG_BIGENDIAN;
++ channel_config = AUTO_SELECT;
++ has_lfe = 0;
++ show_ver = 0;
++ ignore_len = 0;
++ show_help = 0;
++
++ memset(&opt, 0, sizeof(xgetopt_t));
++ while((t = xgetopt(argc, argv, "i:o:b:c:fhlev", &opt)) != EOF)
++ {
++ switch(t)
++ {
++ case 'i':
++ file_input = opt.optarg;
++ break;
++ case 'o':
++ file_output = opt.optarg;
++ break;
++ case 'b':
++ bitrate = (int)(atof(opt.optarg) * 1000.0f);
++ if(bitrate > 6144000 || bitrate < 32000)
++ {
++ fprintf(stderr, "Bitrate must be between 32 and 6144 kbps!\n");
++ return 1;
++ }
++ break;
++ case 'c':
++ channel_config = atoi(opt.optarg) - 1;
++ if((channel_config < 0) || (channel_config > 15))
++ {
++ fprintf(stderr, "Bad channel configuration. Must be between 1 and 16!\n");
++ return 1;
++ }
++ break;
++ case 'f':
++ has_lfe = 1;
++ break;
++ case 'h':
++ show_help = 1;
++ break;
++ case 'l':
++ ignore_len = 1;
++ break;
++ case 'e':
++ enc_flags = enc_flags & (~DCAENC_FLAG_BIGENDIAN);
++ break;
++ case 'v':
++ show_ver = 1;
++ break;
++ case '?':
++ fprintf(stderr, "Unknown commandline option or missing argument: %s\n", argv[opt.optind-1]);
++ return 1;
++ }
++ }
+
+- static const int channel_map[6] = {DCAENC_CHANNELS_MONO, DCAENC_CHANNELS_STEREO, 0,
+- DCAENC_CHANNELS_2FRONT_2REAR, DCAENC_CHANNELS_3FRONT_2REAR, DCAENC_CHANNELS_3FRONT_2REAR };
+-
+- if (argc != 4) {
+- if (argc == 2 && !strcmp(argv[1], "--version")) {
+- printf(PACKAGE_NAME "-" PACKAGE_VERSION "\n");
+- printf(PACKAGE_URL "\n");
+- return 0;
+- } else {
+- printf("Usage: dcaenc input.wav output.dts bits_per_second\n");
+- return 1;
+- }
++ // ----------------------------
++
++ if(!file_input || !file_output || bitrate < 1 || show_ver || show_help)
++ {
++ if(show_ver)
++ {
++ fprintf(stderr, PACKAGE_NAME "-" PACKAGE_VERSION "\n");
++ fprintf(stderr, "Compiled on " __DATE__ " at " __TIME__ " using " __COMPILER__ ".\n");
++ fprintf(stderr, PACKAGE_URL "\n");
++ return 0;
++ }
++ else if(show_help)
++ {
++ fprintf(stderr, "Usage:\n dcaenc -i <input.wav> -o <output.dts> -b <bitrate_kbps>\n\n");
++ fprintf(stderr, "Optional:\n");
++ fprintf(stderr, " -l Ignore input length, can be useful when reading from stdin\n");
++ fprintf(stderr, " -e Switch output endianess to Little Endian (default is: Big Endian)\n");
++ fprintf(stderr, " -h Print the help screen that your are looking at right now\n");
++ fprintf(stderr, " -c Overwrite the channel configuration (default is: Auto Selection)\n");
++ fprintf(stderr, " -f Add an additional LFE channel (default: used for 6ch input)\n");
++ fprintf(stderr, " -v Show version info\n\n");
++ fprintf(stderr, "Remarks:\n");
++ fprintf(stderr, " * Input or output file name can be \"-\" for stdin/stdout.\n");
++ fprintf(stderr, " * The bitrate is specified in kilobits per second and may be rounded up.\n");
++ fprintf(stderr, " - Use Float value for bitrates that are not a multiple of 1 kbps.\n");
++ fprintf(stderr, " * Supported input sample rates:\n");
++ fprintf(stderr, " - 32000\n");
++ fprintf(stderr, " - 44100\n");
++ fprintf(stderr, " - 48000\n");
++ fprintf(stderr, " - or those divided by 2 or 4\n");
++ fprintf(stderr, " * Supported channel modes:\n");
++ fprintf(stderr, " - 1: MONO\n");
++ fprintf(stderr, " - 2: DUAL_MONO\n");
++ fprintf(stderr, " - 3: STEREO\n");
++ fprintf(stderr, " - 4: STEREO_SUMDIFF\n");
++ fprintf(stderr, " - 5: STEREO_TOTAL\n");
++ fprintf(stderr, " - 6: 3FRONT\n");
++ fprintf(stderr, " - 7: 2FRONT_1REAR\n");
++ fprintf(stderr, " - 8: 3FRONT_1REAR\n");
++ fprintf(stderr, " - 9: 2FRONT_2REAR\n");
++ fprintf(stderr, " - 10: 3FRONT_2REAR\n");
++ fprintf(stderr, " - 11: 4FRONT_2REAR\n");
++ fprintf(stderr, " - 12: 3FRONT_2REAR_1OV\n");
++ fprintf(stderr, " - 13: 3FRONT_3REAR\n");
++ fprintf(stderr, " - 14: 5FRONT_2REAR\n");
++ fprintf(stderr, " - 15: 4FRONT_4REAR\n");
++ fprintf(stderr, " - 16: 5FRONT_3REAR\n");
++ fprintf(stderr, " * Supported bitrates:\n");
++ fprintf(stderr, " - mono @ 8 kHz: 32-2048 kbps\n");
++ fprintf(stderr, " - mono @ 12 kHz: 48-3072 kbps\n");
++ fprintf(stderr, " - mono @ 16 kHz: 48-3842 kbps\n");
++ fprintf(stderr, " - mono @ 22.05 kHz: 65-3842 kbps\n");
++ fprintf(stderr, " - mono @ 24 kHz: 71-3842 kbps\n");
++ fprintf(stderr, " - mono @ 32 kHz: 95-3842 kbps\n");
++ fprintf(stderr, " - mono @ 44.1 kHz: 130-3842 kbps\n");
++ fprintf(stderr, " - mono @ 48 kHz: 142-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 8 kHz: 96-2048 kbps\n");
++ fprintf(stderr, " - stereo @ 12 kHz: 96-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 16 kHz: 96-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 22.05 kHz: 128-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 24 kHz: 192-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 32 kHz: 192-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 44.1 kHz: 256-3842 kbps\n");
++ fprintf(stderr, " - stereo @ 48 kHz: 271-3842 kbps\n");
++ fprintf(stderr, " - 5.1 @ 8 kHz: 112-2048 kbps\n");
++ fprintf(stderr, " - 5.1 @ 12 kHz: 168-3072 kbps\n");
++ fprintf(stderr, " - 5.1 @ 16 kHz: 224-3842 kbps\n");
++ fprintf(stderr, " - 5.1 @ 22.05 kHz: 308-3842 kbps\n");
++ fprintf(stderr, " - 5.1 @ 32 kHz: 447-3842 kbps\n");
++ fprintf(stderr, " - 5.1 @ 44.1 kHz: 615-3842 kbps\n");
++ fprintf(stderr, " - 5.1 @ 48 kHz: 670-3842 kbps\n");
++
++ return 0;
++ }
++ else
++ {
++ fprintf(stderr, "Required arguments are missing. Use '-h' option for help!\n");
++ return 1;
++ }
+ }
+- f = wavfile_open(argv[1]);
++
++ fprintf(stderr, "Source: %s\n", file_input);
++ fprintf(stderr, "Output: %s\n", file_output);
++ fprintf(stderr, "KBit/s: %d.%03d\n\n", bitrate / 1000, bitrate % 1000);
++
++ // ----------------------------
++
++ f = wavfile_open(file_input, &error_msg, ignore_len);
+ if (!f) {
+- printf("Could not open or parse %s\n", argv[1]);
+- return 1;
++ fprintf(stderr, "Could not open or parse \"%s\".\n", file_input);
++ fprintf(stderr, "Error: %s!\n", error_msg);
++ return 1;
+ }
+- bitrate = atoi(argv[3]);
+
+ samples_total = f->samples_left;
+- c = dcaenc_create(f->sample_rate, channel_map[f->channels - 1], bitrate, f->channels == 6 ? DCAENC_FLAG_LFE : 0);
++
++ if(channel_config == AUTO_SELECT)
++ {
++ channel_config = channel_map[f->channels - 1];
++ if(f->channels == 6) has_lfe = 1;
++ }
++
++ if(has_lfe)
++ {
++ enc_flags = enc_flags | DCAENC_FLAG_LFE;
++ }
++
++ switch(f->channels - (has_lfe ? 1 : 0))
++ {
++ case 1:
++ if(!(channel_config == DCAENC_CHANNELS_MONO))
++ {
++ fprintf(stderr, "Invalid channel configuration for input audio!\n");
++ return 1;
++ }
++ break;
++ case 2:
++ if(!(channel_config == DCAENC_CHANNELS_DUAL_MONO || channel_config == DCAENC_CHANNELS_STEREO ||
++ channel_config == DCAENC_CHANNELS_STEREO_SUMDIFF || channel_config == DCAENC_CHANNELS_STEREO_TOTAL))
++ {
++ fprintf(stderr, "Invalid channel configuration for input audio!\n");
++ return 1;
++ }
++ break;
++ case 4:
++ if(!(channel_config == DCAENC_CHANNELS_3FRONT_1REAR || channel_config == DCAENC_CHANNELS_2FRONT_2REAR))
++ {
++ fprintf(stderr, "Invalid channel configuration for input audio!\n");
++ return 1;
++ }
++ break;
++ case 5:
++ if(!(channel_config == DCAENC_CHANNELS_3FRONT_2REAR))
++ {
++ fprintf(stderr, "Invalid channel configuration for input audio!\n");
++ return 1;
++ }
++ break;
++ case 6:
++ if(!(channel_config == DCAENC_CHANNELS_3FRONT_3REAR || channel_config == DCAENC_CHANNELS_4FRONT_2REAR ||
++ channel_config == DCAENC_CHANNELS_3FRONT_2REAR_1OV))
++ {
++ fprintf(stderr, "Invalid channel configuration for input audio!\n");
++ return 1;
++ }
++ break;
++ }
++
++ // ----------------------------
++
++ c = dcaenc_create(f->sample_rate, channel_config, bitrate, enc_flags);
+
+ if (!c) {
+- printf("Wrong bitrate or sample rate\n");
+- return 1;
++ fprintf(stderr, "Insufficient bitrate or unsupported sample rate!\n");
++ return 1;
++ }
++
++ if((((size_t)(dcaenc_output_size(c))) > BUFFSIZE_OUT) || (((size_t)(dcaenc_input_size(c))) > BUFFSIZE_SPL))
++ {
++ fprintf(stderr, "Internal error, buffers are too small!\n", file_output);
++ return 1;
+ }
+- outfile = fopen(argv[2], "wb");
+- if (!outfile) {
+- printf("Could not open %s\n", argv[2]);
+- return 1;
++
++ outfile = strcmp(file_output, "-") ? fopen_utf8(file_output, "wb") : stdout;
++ if(!outfile) {
++ fprintf(stderr, "Could not open \"%s\" for writing!\n", file_output);
++ return 1;
+ }
+- while (wavfile_read_s32(f, data)) {
++
++ fflush(stdout);
++ fflush(stderr);
++
++ // ----------------------------
++
++ counter = 0;
++ samples_read_total = 0;
++ status_idx = 0;
++
++ while(samples_read = wavfile_read_s32(f, data, BUFFSIZE_SPL))
++ {
++ samples_read_total += samples_read;
+ wrote = dcaenc_convert_s32(c, data, output);
+ fwrite(output, 1, wrote, outfile);
++
++ if(counter == 0)
++ {
++ current_pos = samples_read_total / f->sample_rate;
++
++ if((samples_total > 0) && (samples_total < UNKNOWN_SIZE))
++ {
++ percent_done = ((double)(samples_total - f->samples_left)) / ((double)(samples_total));
++ fprintf(stderr, "Encoding... %d:%02d [%3.1f%%]\r", current_pos / 60, current_pos % 60, percent_done * 100.0);
++ fflush(stderr);
++ }
++ else
++ {
++ fprintf(stderr, "Encoding... %d:%02d [%c]\r", current_pos / 60, current_pos % 60, status[(status_idx = (status_idx+1) % 4)]);
++ fflush(stderr);
++ }
++ }
++
++ counter = (counter+1) % 125;
+ }
++
++ fprintf(stderr, "Encoding... %d:%02d [%3.1f%%]\n", (samples_read_total / f->sample_rate) / 60, (samples_read_total / f->sample_rate) % 60, 100.0);
++ fflush(stderr);
++
+ wrote = dcaenc_destroy(c, output);
+ fwrite(output, 1, wrote, outfile);
+- fclose(outfile);
++ if(outfile != stdout)
++ {
++ fclose(outfile);
++ }
+ wavfile_close(f);
++
++ fprintf(stderr, "Done.\n");
+ return 0;
+ }
++
++#ifdef _WIN32
++
++#include <Windows.h>
++#include <io.h>
++#include <fcntl.h>
++
++int main( int argc, char **argv )
++{
++ int dcaenc_argc;
++ char **dcaenc_argv;
++ UINT old_cp;
++ int exit_code;
++
++ _setmode(_fileno(stdin), _O_BINARY);
++ _setmode(_fileno(stdout), _O_BINARY);
++
++ old_cp = GetConsoleOutputCP();
++ SetConsoleOutputCP(CP_UTF8);
++
++ init_commandline_arguments_utf8(&dcaenc_argc, &dcaenc_argv);
++ exit_code = dcaenc_main(dcaenc_argc, dcaenc_argv);
++ free_commandline_arguments_utf8(&dcaenc_argc, &dcaenc_argv);
++
++ SetConsoleOutputCP(old_cp);
++ return exit_code;
++}
++
++#else //_WIN32
++
++int main( int argc, char **argv )
++{
++ return dcaenc_main(argc, argv);
++}
++
++#endif //_WIN32
+\ No newline at end of file
+diff --git a/math_tables.h b/math_tables.h
+index ce2e6c4..2b97618 100644
+--- a/math_tables.h
++++ b/math_tables.h
+@@ -17,12 +17,18 @@ extern const int32_t cb_to_add[256];
+
+ extern const int quant_levels_cb[27];
+
+-static inline int32_t cos_t(int x)
++#ifdef _MSC_VER
++#define INLINE __forceinline
++#else
++#define INLINE inline
++#endif
++
++INLINE static int32_t cos_t(int x)
+ {
+ return cos_table[x & 2047];
+ }
+
+-static inline int32_t sin_t(int x)
++INLINE static int32_t sin_t(int x)
+ {
+ return cos_t(x - 512);
+ }
+diff --git a/unicode_support.c b/unicode_support.c
+new file mode 100644
+index 0000000..283325c
+--- /dev/null
++++ b/unicode_support.c
+@@ -0,0 +1,225 @@
++/*
++ * This file is part of dcaenc.
++ *
++ * Copyright (c) 2008-2011 Alexander E. Patrakov <patrakov@gmail.com>
++ *
++ * dcaenc is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * dcaenc 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with dcaenc; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include "unicode_support.h"
++
++#ifdef _WIN32
++
++#include <windows.h>
++#include <sys/stat.h>
++#include <stdio.h>
++#include <wchar.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++char *utf16_to_ansi(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_ACP, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_ACP, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ if(Buffer)
++ {
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = (char**) malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ if(NULL == *argv)
++ {
++ fprintf(stderr, "\nFATAL: Malloc failed\n\n");
++ exit(-1);
++ }
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ if(NULL == (*argv)[i])
++ {
++ fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n");
++ exit(-1);
++ }
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i = 0;
++
++ if(*argv != NULL)
++ {
++ for(i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ free((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ free(*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
++
++/* int stat_utf8(const char *path_utf8, struct stat *buf)
++{
++ int ret = -1;
++
++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8);
++ if(path_utf16)
++ {
++ ret = wstat(path_utf16, buf);
++ free(path_utf16);
++ }
++
++ return ret;
++} */
++
++int rename_utf8(const char *oldname_utf8, const char *newname_utf8)
++{
++ int ret = -1;
++
++ wchar_t *oldname_utf16 = utf8_to_utf16(oldname_utf8);
++ wchar_t *newname_utf16 = utf8_to_utf16(newname_utf8);
++
++ if(oldname_utf16 && newname_utf16)
++ {
++ _wunlink(newname_utf16);
++ ret = _wrename(oldname_utf16, newname_utf16);
++ }
++
++ if(newname_utf16) free(newname_utf16);
++ if(oldname_utf16) free(oldname_utf16);
++
++ return ret;
++}
++
++char *path_utf8_to_ansi(const char *psz_filename_utf8, int b_create)
++{
++ char *short_path = NULL;
++ wchar_t *psz_filename_utf16 = NULL;
++
++ if(!psz_filename_utf8)
++ {
++ return NULL;
++ }
++
++ psz_filename_utf16 = utf8_to_utf16(psz_filename_utf8);
++ if(psz_filename_utf16)
++ {
++ char *psz_filename_ansi = NULL;
++ if(b_create)
++ {
++ FILE *fh = _wfopen(psz_filename_utf16, L"a+");
++ if(fh) fclose(fh);
++ }
++ psz_filename_ansi = utf16_to_ansi(psz_filename_utf16);
++ if(psz_filename_ansi)
++ {
++ if(strcmp(psz_filename_ansi, psz_filename_utf8))
++ {
++ wchar_t short_name_utf16[MAX_PATH];
++ DWORD result = GetShortPathNameW(psz_filename_utf16, short_name_utf16, MAX_PATH);
++ if((result > 0) && (result < MAX_PATH))
++ {
++ short_path = utf16_to_ansi(short_name_utf16);
++ free(psz_filename_ansi);
++ }
++ else
++ {
++ short_path = psz_filename_ansi; /*if GetShortPathName() failed, use the ANSI version*/
++ }
++ }
++ else
++ {
++ short_path = psz_filename_ansi; /*don't convert plain ASCII filenames to "short" path*/
++ }
++ }
++ free(psz_filename_utf16);
++ }
++
++ return short_path;
++}
++
++#endif //_WIN32
+diff --git a/unicode_support.h b/unicode_support.h
+new file mode 100644
+index 0000000..96d9ec1
+--- /dev/null
++++ b/unicode_support.h
+@@ -0,0 +1,51 @@
++/*
++ * This file is part of dcaenc.
++ *
++ * Copyright (c) 2008-2011 Alexander E. Patrakov <patrakov@gmail.com>
++ *
++ * dcaenc is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * dcaenc 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with dcaenc; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef _WIN32
++#ifndef _INC_STAT
++struct stat;
++#endif
++char *utf16_to_utf8(const wchar_t *input);
++char *utf16_to_ansi(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++int rename_utf8(const char *oldname_utf8, const char *newname_utf8);
++char *path_utf8_to_ansi(const char *psz_filename_utf8, int b_create);
++#else
++#define fopen_utf8(NAME, MODE) fopen(NAME, MODE)
++#define rename_utf8(OLD, NEW) rename(OLD, NEW)
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+\ No newline at end of file
+diff --git a/vc_solution/dcadll_vc2010.vcxproj b/vc_solution/dcadll_vc2010.vcxproj
+new file mode 100644
+index 0000000..807df23
+--- /dev/null
++++ b/vc_solution/dcadll_vc2010.vcxproj
+@@ -0,0 +1,126 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\dcaenc.c" />
++ <ClCompile Include="..\dllmain.cpp" />
++ <ClCompile Include="..\math_tables.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\dcaenc.h" />
++ <ClInclude Include="..\dcaenc_private.h" />
++ <ClInclude Include="..\float_data.h" />
++ <ClInclude Include="..\int_data.h" />
++ <ClInclude Include="..\math_tables.h" />
++ <ClInclude Include="..\softfloat.h" />
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>dcadll_vc2010</RootNamespace>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>Unicode</CharacterSet>
++ <PlatformToolset>Windows7.1SDK</PlatformToolset>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <LinkIncremental>true</LinkIncremental>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\dll\</IntDir>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <TargetName>dcaenc-0</TargetName>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <LinkIncremental>false</LinkIncremental>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\dll\</IntDir>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <TargetName>dcaenc-0</TargetName>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCADLL_VC2010_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <ImportLibrary>$(TargetDir)$(TargetName)_imp.lib</ImportLibrary>
++ </Link>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ </PreBuildEvent>
++ <PreBuildEvent>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>Full</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCADLL_VC2010_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++ <OmitFramePointers>true</OmitFramePointers>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
++ <FloatingPointModel>Fast</FloatingPointModel>
++ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
++ <BufferSecurityCheck>false</BufferSecurityCheck>
++ <CreateHotpatchableImage>false</CreateHotpatchableImage>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>false</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <ImportLibrary>$(TargetDir)$(TargetName).dll.lib</ImportLibrary>
++ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
++ <AdditionalDependencies>$(SolutionDir)lib\EncodePointer.lib;$(SolutionDir)lib\msvcrt_vc6.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ <MinimumRequiredVersion>5.0</MinimumRequiredVersion>
++ <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
++ <NoEntryPoint>true</NoEntryPoint>
++ </Link>
++ <ProjectReference />
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ </PreBuildEvent>
++ <PreBuildEvent>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcadll_vc2010.vcxproj.filters b/vc_solution/dcadll_vc2010.vcxproj.filters
+new file mode 100644
+index 0000000..d98bb04
+--- /dev/null
++++ b/vc_solution/dcadll_vc2010.vcxproj.filters
+@@ -0,0 +1,48 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup>
++ <Filter Include="Source Files">
++ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
++ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
++ </Filter>
++ <Filter Include="Header Files">
++ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
++ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
++ </Filter>
++ <Filter Include="Resource Files">
++ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
++ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
++ </Filter>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\dllmain.cpp">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\dcaenc.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\math_tables.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\softfloat.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\dcaenc.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\dcaenc_private.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\float_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\int_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\math_tables.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ </ItemGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcadll_vc2010.vcxproj.user b/vc_solution/dcadll_vc2010.vcxproj.user
+new file mode 100644
+index 0000000..ace9a86
+--- /dev/null
++++ b/vc_solution/dcadll_vc2010.vcxproj.user
+@@ -0,0 +1,3 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcaenc_vc2010.sln b/vc_solution/dcaenc_vc2010.sln
+new file mode 100644
+index 0000000..2b49e18
+--- /dev/null
++++ b/vc_solution/dcaenc_vc2010.sln
+@@ -0,0 +1,59 @@
++
++Microsoft Visual Studio Solution File, Format Version 11.00
++# Visual Studio 2010
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dcaenc_vc2010", "dcaenc_vc2010.vcxproj", "{F90211C8-0718-46F1-AD58-683FA005BFA5}"
++ ProjectSection(ProjectDependencies) = postProject
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866} = {282DDEDF-52A5-442E-90DE-94ABEC4B4866}
++ EndProjectSection
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dcalib_vc2010", "dcalib_vc2010.vcxproj", "{B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}"
++ ProjectSection(ProjectDependencies) = postProject
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866} = {282DDEDF-52A5-442E-90DE-94ABEC4B4866}
++ EndProjectSection
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dcadll_vc2010", "dcadll_vc2010.vcxproj", "{8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}"
++ ProjectSection(ProjectDependencies) = postProject
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866} = {282DDEDF-52A5-442E-90DE-94ABEC4B4866}
++ EndProjectSection
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gentables", "gentables.vcxproj", "{282DDEDF-52A5-442E-90DE-94ABEC4B4866}"
++EndProject
++Global
++ GlobalSection(SolutionConfigurationPlatforms) = preSolution
++ Debug|Win32 = Debug|Win32
++ Debug|x64 = Debug|x64
++ Release|Win32 = Release|Win32
++ Release|x64 = Release|x64
++ EndGlobalSection
++ GlobalSection(ProjectConfigurationPlatforms) = postSolution
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Debug|Win32.ActiveCfg = Debug|Win32
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Debug|Win32.Build.0 = Debug|Win32
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Debug|x64.ActiveCfg = Debug|x64
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Debug|x64.Build.0 = Debug|x64
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Release|Win32.ActiveCfg = Release|Win32
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Release|Win32.Build.0 = Release|Win32
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Release|x64.ActiveCfg = Release|x64
++ {F90211C8-0718-46F1-AD58-683FA005BFA5}.Release|x64.Build.0 = Release|x64
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Debug|Win32.ActiveCfg = Debug|Win32
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Debug|Win32.Build.0 = Debug|Win32
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Debug|x64.ActiveCfg = Debug|Win32
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Release|Win32.ActiveCfg = Release|Win32
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Release|Win32.Build.0 = Release|Win32
++ {B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}.Release|x64.ActiveCfg = Release|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Debug|Win32.ActiveCfg = Debug|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Debug|Win32.Build.0 = Debug|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Debug|x64.ActiveCfg = Debug|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Release|Win32.ActiveCfg = Release|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Release|Win32.Build.0 = Release|Win32
++ {8AFCA1B5-C8F1-4F56-91F7-80415FFEB663}.Release|x64.ActiveCfg = Release|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Debug|Win32.ActiveCfg = Debug|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Debug|Win32.Build.0 = Debug|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Debug|x64.ActiveCfg = Debug|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Release|Win32.ActiveCfg = Release|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Release|Win32.Build.0 = Release|Win32
++ {282DDEDF-52A5-442E-90DE-94ABEC4B4866}.Release|x64.ActiveCfg = Release|Win32
++ EndGlobalSection
++ GlobalSection(SolutionProperties) = preSolution
++ HideSolutionNode = FALSE
++ EndGlobalSection
++EndGlobal
+diff --git a/vc_solution/dcaenc_vc2010.vcxproj b/vc_solution/dcaenc_vc2010.vcxproj
+new file mode 100644
+index 0000000..39cb22b
+--- /dev/null
++++ b/vc_solution/dcaenc_vc2010.vcxproj
+@@ -0,0 +1,206 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Debug|x64">
++ <Configuration>Debug</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|x64">
++ <Configuration>Release</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\compiler_info.h" />
++ <ClInclude Include="..\unicode_support.h" />
++ <ClInclude Include="..\wavfile.h" />
++ <ClInclude Include="..\xgetopt.h" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\alsaplugin.c">
++ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++ </ClCompile>
++ <ClCompile Include="..\main.c" />
++ <ClCompile Include="..\unicode_support.c" />
++ <ClCompile Include="..\wavfile.c" />
++ <ClCompile Include="..\xgetopt.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ProjectReference Include="dcalib_vc2010.vcxproj">
++ <Project>{b4ad2963-8469-4dbd-bd26-fad4fe303f8f}</Project>
++ </ProjectReference>
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{F90211C8-0718-46F1-AD58-683FA005BFA5}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>dcaenc_vc2010</RootNamespace>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>Unicode</CharacterSet>
++ <PlatformToolset>Windows7.1SDK</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>Unicode</CharacterSet>
++ <PlatformToolset>Windows7.1SDK</PlatformToolset>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <LinkIncremental>true</LinkIncremental>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <LinkIncremental>true</LinkIncremental>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <LinkIncremental>false</LinkIncremental>
++ <TargetName>dcaenc</TargetName>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <LinkIncremental>false</LinkIncremental>
++ <TargetName>dcaenc</TargetName>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\</IntDir>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <ClCompile>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>Full</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <MultiProcessorCompilation>true</MultiProcessorCompilation>
++ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++ <OmitFramePointers>true</OmitFramePointers>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <BufferSecurityCheck>false</BufferSecurityCheck>
++ <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
++ <FloatingPointModel>Fast</FloatingPointModel>
++ <CreateHotpatchableImage>false</CreateHotpatchableImage>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>false</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <MinimumRequiredVersion>5.0</MinimumRequiredVersion>
++ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
++ <AdditionalDependencies>$(SolutionDir)lib\EncodePointer.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ </Link>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>Full</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <MultiProcessorCompilation>true</MultiProcessorCompilation>
++ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++ <OmitFramePointers>true</OmitFramePointers>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <BufferSecurityCheck>false</BufferSecurityCheck>
++ <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
++ <FloatingPointModel>Fast</FloatingPointModel>
++ <CreateHotpatchableImage>false</CreateHotpatchableImage>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>false</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <MinimumRequiredVersion>
++ </MinimumRequiredVersion>
++ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
++ </Link>
++ </ItemDefinitionGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcaenc_vc2010.vcxproj.filters b/vc_solution/dcaenc_vc2010.vcxproj.filters
+new file mode 100644
+index 0000000..9af5b8d
+--- /dev/null
++++ b/vc_solution/dcaenc_vc2010.vcxproj.filters
+@@ -0,0 +1,48 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup>
++ <Filter Include="Source Files">
++ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
++ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
++ </Filter>
++ <Filter Include="Header Files">
++ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
++ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
++ </Filter>
++ <Filter Include="Resource Files">
++ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
++ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
++ </Filter>
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\unicode_support.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\wavfile.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\xgetopt.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\compiler_info.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\alsaplugin.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\main.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\unicode_support.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\wavfile.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\xgetopt.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ </ItemGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcaenc_vc2010.vcxproj.user b/vc_solution/dcaenc_vc2010.vcxproj.user
+new file mode 100644
+index 0000000..ace9a86
+--- /dev/null
++++ b/vc_solution/dcaenc_vc2010.vcxproj.user
+@@ -0,0 +1,3 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcalib_vc2010.vcxproj b/vc_solution/dcalib_vc2010.vcxproj
+new file mode 100644
+index 0000000..5216233
+--- /dev/null
++++ b/vc_solution/dcalib_vc2010.vcxproj
+@@ -0,0 +1,114 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{B4AD2963-8469-4DBD-BD26-FAD4FE303F8F}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>dcalib_vc2010</RootNamespace>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>Unicode</CharacterSet>
++ <PlatformToolset>Windows7.1SDK</PlatformToolset>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\lib\</IntDir>
++ <TargetName>dcaenc-static-0</TargetName>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\lib\</IntDir>
++ <TargetName>dcaenc-static-0</TargetName>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>Full</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++ <OmitFramePointers>true</OmitFramePointers>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <FloatingPointModel>Fast</FloatingPointModel>
++ <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
++ <CreateHotpatchableImage>false</CreateHotpatchableImage>
++ <BufferSecurityCheck>false</BufferSecurityCheck>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ </Link>
++ <Lib>
++ <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
++ </Lib>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemGroup>
++ <ClCompile Include="..\dcaenc.c" />
++ <ClCompile Include="..\math_tables.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\dcaenc.h" />
++ <ClInclude Include="..\dcaenc_private.h" />
++ <ClInclude Include="..\float_data.h" />
++ <ClInclude Include="..\int_data.h" />
++ <ClInclude Include="..\math_tables.h" />
++ <ClInclude Include="..\softfloat.h" />
++ </ItemGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcalib_vc2010.vcxproj.filters b/vc_solution/dcalib_vc2010.vcxproj.filters
+new file mode 100644
+index 0000000..b2d7092
+--- /dev/null
++++ b/vc_solution/dcalib_vc2010.vcxproj.filters
+@@ -0,0 +1,45 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup>
++ <Filter Include="Source Files">
++ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
++ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
++ </Filter>
++ <Filter Include="Header Files">
++ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
++ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
++ </Filter>
++ <Filter Include="Resource Files">
++ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
++ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
++ </Filter>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\dcaenc.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ <ClCompile Include="..\math_tables.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\dcaenc.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\dcaenc_private.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\math_tables.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\int_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\softfloat.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\float_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ </ItemGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/dcalib_vc2010.vcxproj.user b/vc_solution/dcalib_vc2010.vcxproj.user
+new file mode 100644
+index 0000000..ace9a86
+--- /dev/null
++++ b/vc_solution/dcalib_vc2010.vcxproj.user
+@@ -0,0 +1,3 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/gentables.vcxproj b/vc_solution/gentables.vcxproj
+new file mode 100644
+index 0000000..85b4751
+--- /dev/null
++++ b/vc_solution/gentables.vcxproj
+@@ -0,0 +1,125 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{282DDEDF-52A5-442E-90DE-94ABEC4B4866}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>gentables</RootNamespace>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>Unicode</CharacterSet>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <LinkIncremental>true</LinkIncremental>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\gen\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <LinkIncremental>false</LinkIncremental>
++ <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
++ <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\tmp\gen\</IntDir>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ <CustomBuildStep>
++ <Command>
++ </Command>
++ </CustomBuildStep>
++ <CustomBuildStep>
++ <Message>
++ </Message>
++ </CustomBuildStep>
++ <PostBuildEvent>
++ <Command>"$(OutDir)\gentables.exe" > "$(SolutionDir)..\math_tables.c"</Command>
++ <Message>Generating Tables</Message>
++ </PostBuildEvent>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ </Link>
++ <CustomBuildStep>
++ <Command>
++ </Command>
++ </CustomBuildStep>
++ <CustomBuildStep>
++ <Message>
++ </Message>
++ </CustomBuildStep>
++ <PostBuildEvent>
++ <Command>"$(OutDir)\gentables.exe" > "$(SolutionDir)..\math_tables.c"</Command>
++ <Message>Generating Tables</Message>
++ </PostBuildEvent>
++ <PreBuildEvent>
++ <Command>copy /Y "$(SolutionDir)..\config_msvc.h" "$(SolutionDir)..\config.h"</Command>
++ <Message>Create: "$(SolutionDir)config.h"</Message>
++ </PreBuildEvent>
++ </ItemDefinitionGroup>
++ <ItemGroup>
++ <None Include="ReadMe.txt" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\float_data.h" />
++ <ClInclude Include="..\int_data.h" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\gentables.c" />
++ </ItemGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/gentables.vcxproj.filters b/vc_solution/gentables.vcxproj.filters
+new file mode 100644
+index 0000000..754afe3
+--- /dev/null
++++ b/vc_solution/gentables.vcxproj.filters
+@@ -0,0 +1,33 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup>
++ <Filter Include="Source Files">
++ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
++ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
++ </Filter>
++ <Filter Include="Header Files">
++ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
++ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
++ </Filter>
++ <Filter Include="Resource Files">
++ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
++ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
++ </Filter>
++ </ItemGroup>
++ <ItemGroup>
++ <None Include="ReadMe.txt" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\int_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ <ClInclude Include="..\float_data.h">
++ <Filter>Header Files</Filter>
++ </ClInclude>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\gentables.c">
++ <Filter>Source Files</Filter>
++ </ClCompile>
++ </ItemGroup>
++</Project>
+\ No newline at end of file
+diff --git a/vc_solution/lib/EncodePointer.lib b/vc_solution/lib/EncodePointer.lib
+new file mode 100644
+index 0000000..c035792
+Binary files /dev/null and b/vc_solution/lib/EncodePointer.lib differ
+diff --git a/vc_solution/lib/msvcrt_vc6.lib b/vc_solution/lib/msvcrt_vc6.lib
+new file mode 100644
+index 0000000..26f03fe
+Binary files /dev/null and b/vc_solution/lib/msvcrt_vc6.lib differ
+diff --git a/wavfile.c b/wavfile.c
+index 950a08d..7f35e2f 100644
+--- a/wavfile.c
++++ b/wavfile.c
+@@ -23,189 +23,332 @@
+ #include <string.h>
+ #include <stdio.h>
+ #include "wavfile.h"
++#include "unicode_support.h"
+
+-static uint32_t find_chunk(FILE * file, const uint8_t chunk_id[4])
++#ifdef _M_X64
++#define SIZE2UINT32(X) (uint32_t)(((X) > UINT32_MAX) ? UINT32_MAX : (X))
++#define SIZE2INT(X) (uint32_t)(((X) > INT_MAX) ? INT_MAX : (X))
++#else
++#define SIZE2UINT32(X) (X)
++#define SIZE2INT(X) (X)
++#endif
++
++#define BUFFSIZE_SAMPLES 512
++#define BUFFSIZE_BYTES (BUFFSIZE_SAMPLES * 6 * 4)
++
++static const char *g_error_msg[13] =
+ {
+- uint8_t buffer[8];
+- while (1) {
+- size_t chunksize;
+- size_t s = fread(buffer, 1, 8, file);
+- if (s < 8)
+- return 0;
+- chunksize = (uint32_t)buffer[4] | ((uint32_t)buffer[5] << 8) |
+- ((uint32_t)buffer[6] << 16) | ((uint32_t)buffer[7] << 24);
+- if (!memcmp(buffer, chunk_id, 4))
+- return chunksize;
+- fseek(file, chunksize, SEEK_CUR);
+- }
++ /* 0*/ "Success",
++ /* 1*/ "Failed to open file",
++ /* 2*/ "RIFF header not found",
++ /* 3*/ "WAVE chunk not found",
++ /* 4*/ "Format chunk not found",
++ /* 5*/ "Failed to read Format chunk",
++ /* 6*/ "Invalid or unsupported format tag",
++ /* 7*/ "Unsupported number of channels (only 1, 2, 3, 4, 5 and 6)",
++ /* 8*/ "Unsupported bits per sample (only 16 and 32 for now)",
++ /* 9*/ "Inconsistent block alignment",
++ /*10*/ "Inconsistent average bitrate",
++ /*11*/ "Data chunk not found",
++ /*12*/ "Data chunk size is invalid"
++};
++
++static int find_chunk(FILE * file, const uint8_t chunk_id[4], size_t *chunk_size)
++{
++ uint8_t buffer[8];
++ *chunk_size = 0;
++
++ while (1) {
++ size_t chunksize;
++ size_t s = fread(buffer, 1, 8, file);
++ if (s < 8)
++ return 0;
++ chunksize = (uint32_t)buffer[4] | ((uint32_t)buffer[5] << 8) |
++ ((uint32_t)buffer[6] << 16) | ((uint32_t)buffer[7] << 24);
++
++ if(!memcmp(buffer, chunk_id, 4))
++ {
++ *chunk_size = chunksize;
++ return 1;
++ }
++
++ if((chunksize % 2) == 1) chunksize++; //Skip extra "unused" byte at the end of odd-size chunks
++
++ if(fseek(file, SIZE2UINT32(chunksize), SEEK_CUR))
++ {
++ while(chunksize > 8)
++ {
++ s = fread(buffer, 1, 8, file);
++ if (s < 8)
++ return 0;
++ chunksize -= 8;
++ }
++ s = fread(buffer, 1, chunksize, file);
++ if (s < chunksize)
++ return 0;
++ }
++ }
+ }
+
+-wavfile * wavfile_open(const char * filename)
++wavfile * wavfile_open(const char * filename, const char ** error_msg, const int ignore_len)
+ {
+- wavfile *result;
+- size_t s;
+- uint8_t buffer[8];
+- uint8_t *fmt;
+- uint32_t v;
+- uint32_t avg_bps;
+- uint32_t block_align;
+- static const uint8_t riff[4] = {'R', 'I', 'F', 'F'};
+- static const uint8_t wave[4] = { 'W', 'A', 'V', 'E'};
+- static const uint8_t fmt_[4] = {'f', 'm', 't', ' '};
+- static const uint8_t data[4] = {'d', 'a', 't', 'a'};
+-
+- result = (wavfile *)calloc(1, sizeof(wavfile));
+- if (!result)
+- goto err0;
+-
+- result->file = fopen(filename, "rb");
+- if (!result->file)
+- goto err1;
+-
+- s = fread(buffer, 1, 8, result->file);
+- if (s < 8)
+- goto err2;
+-
+- if (memcmp(buffer, riff, 4))
+- goto err2;
+-
+- /* TODO: check size (in buffer[4..8]) */
+- s = fread(buffer, 1, 4, result->file);
+- if (s < 4)
+- goto err2;
+-
+- if (memcmp(buffer, wave, 4))
+- goto err2;
+-
+- s = find_chunk(result->file, fmt_);
+- if (s != 16 && s != 40)
+- goto err2;
+-
+- fmt = (uint8_t*)malloc(s);
+- if (!fmt)
+- goto err2;
+-
+- if (fread(fmt, 1, s, result->file) != s)
+- goto err3;
+-
+- /* wFormatTag */
+- v = (uint32_t)fmt[0] | ((uint32_t)fmt[1] << 8);
+- if (v != 1 && v != 0xfffe)
+- goto err3;
+-
+- /* wChannels */
+- v = (uint32_t)fmt[2] | ((uint32_t)fmt[3] << 8);
+- if (v != 1 && v != 2 && v != 4 && v != 5 && v !=6)
+- goto err3;
+- result->channels = v;
+- /* dwSamplesPerSec */
+- result->sample_rate = (uint32_t)fmt[4] | ((uint32_t)fmt[5] << 8) |
+- ((uint32_t)fmt[6] << 16) | ((uint32_t)fmt[7] << 24);
+-
+- /* dwAvgBytesPerSec */
+- avg_bps = (uint32_t)fmt[8] | ((uint32_t)fmt[9] << 8) |
+- ((uint32_t)fmt[10] << 16) | ((uint32_t)fmt[11] << 24);
+-
+- /* wBlockAlign */
+- block_align = (uint32_t)fmt[12] | ((uint32_t)fmt[13] << 8);
+-
+- /* wBitsPerSample */
+- result->bits_per_sample = (uint32_t)fmt[14] | ((uint32_t)fmt[15] << 8);
+- if (result->bits_per_sample != 16 && result->bits_per_sample != 32)
+- goto err3;
+-
+- if (block_align != result->channels * (result->bits_per_sample / 8))
+- goto err3;
+-
+- if (avg_bps != block_align * result->sample_rate)
+- goto err3;
+-
+- v = find_chunk(result->file, data);
+- if (v == 0 || v % block_align != 0)
+- goto err3;
+-
+- result->samples_left = v / block_align;
+- free(fmt);
+- return result;
+-
+- err3:
++ wavfile *result;
++ size_t s;
++ uint8_t buffer[8];
++ uint8_t *fmt;
++ size_t v;
++ uint32_t avg_bps;
++ uint32_t block_align;
++ static const uint8_t riff[4] = {'R', 'I', 'F', 'F'};
++ static const uint8_t wave[4] = { 'W', 'A', 'V', 'E'};
++ static const uint8_t fmt_[4] = {'f', 'm', 't', ' '};
++ static const uint8_t data[4] = {'d', 'a', 't', 'a'};
++
++ result = (wavfile *)calloc(1, sizeof(wavfile));
++ if (!result)
++ goto err0;
++
++ result->file = strcmp(filename, "-") ? fopen_utf8(filename, "rb") : stdin;
++ if (!result->file)
++ {
++ *error_msg = g_error_msg[1];
++ goto err1;
++ }
++
++ s = fread(buffer, 1, 8, result->file);
++ if (s < 8)
++ {
++ *error_msg = g_error_msg[2];
++ goto err2;
++ }
++
++ if (memcmp(buffer, riff, 4))
++ {
++ *error_msg = g_error_msg[2];
++ goto err2;
++ }
++
++ /* TODO: check size (in buffer[4..8]) */
++ s = fread(buffer, 1, 4, result->file);
++ if (s < 4)
++ {
++ *error_msg = g_error_msg[3];
++ goto err2;
++ }
++
++ if (memcmp(buffer, wave, 4))
++ {
++ *error_msg = g_error_msg[3];
++ goto err2;
++ }
++
++ if(!find_chunk(result->file, fmt_, &s))
++ {
++ *error_msg = g_error_msg[4];
++ goto err2;
++ }
++ if((s < 16) || (s > 40))
++ {
++ *error_msg = g_error_msg[4];
++ goto err2;
++ }
++
++ fmt = (uint8_t*)malloc(s);
++ if(!fmt)
++ {
++ *error_msg = g_error_msg[5];
++ goto err2;
++ }
++
++ if(fread(fmt, 1, s, result->file) != s)
++ {
++ *error_msg = g_error_msg[5];
++ goto err3;
++ }
++
++ /* skip unused byte (for odd-size chunks) */
++ if((s % 2) == 1)
++ {
++ char dummy[1];
++ if(fread(&dummy, 1, 1, result->file) != 1)
++ {
++ *error_msg = g_error_msg[5];
++ goto err3;
++ }
++ }
++
++ /* wFormatTag */
++ v = (uint32_t)fmt[0] | ((uint32_t)fmt[1] << 8);
++ if(v != 1 && v != 0xfffe)
++ {
++ *error_msg = g_error_msg[6];
++ goto err3;
++ }
++
++ /* wChannels */
++ v = (uint32_t)fmt[2] | ((uint32_t)fmt[3] << 8);
++ if((v < 1) || (v > 6))
++ {
++ *error_msg = g_error_msg[7];
++ goto err3;
++ }
++ result->channels = SIZE2UINT32(v);
++
++ /* dwSamplesPerSec */
++ result->sample_rate = (uint32_t)fmt[4] | ((uint32_t)fmt[5] << 8) |
++ ((uint32_t)fmt[6] << 16) | ((uint32_t)fmt[7] << 24);
++
++ /* dwAvgBytesPerSec */
++ avg_bps = (uint32_t)fmt[8] | ((uint32_t)fmt[9] << 8) |
++ ((uint32_t)fmt[10] << 16) | ((uint32_t)fmt[11] << 24);
++
++ /* wBlockAlign */
++ block_align = (uint32_t)fmt[12] | ((uint32_t)fmt[13] << 8);
++
++ /* wBitsPerSample */
++ result->bits_per_sample = (uint32_t)fmt[14] | ((uint32_t)fmt[15] << 8);
++ if(result->bits_per_sample != 16 && result->bits_per_sample != 32)
++ {
++ *error_msg = g_error_msg[8];
++ goto err3;
++ }
++
++ if(block_align != result->channels * (result->bits_per_sample / 8))
++ {
++ *error_msg = g_error_msg[9];
++ goto err3;
++ }
++
++ if(avg_bps != block_align * result->sample_rate)
++ {
++ *error_msg = g_error_msg[10];
++ goto err3;
++ }
++
++ if(!find_chunk(result->file, data, &v))
++ {
++ *error_msg = g_error_msg[11];
++ goto err3;
++ }
++ if(((v == 0) || (v % block_align != 0)) && (!ignore_len))
++ {
++ *error_msg = g_error_msg[12];
++ goto err3;
++ }
++
++ result->samples_left = SIZE2UINT32(ignore_len ? UNKNOWN_SIZE : (v / block_align));
+ free(fmt);
+- err2:
+- fclose(result->file);
+- err1:
++ *error_msg = g_error_msg[0];
++ return result;
++
++ err3:
++ free(fmt);
++ err2:
++ if(result->file != stdin) fclose(result->file);
++ err1:
+ free(result);
+- err0:
++ err0:
+ return NULL;
+ }
+
+ void wavfile_close(wavfile * f)
+ {
+- fclose(f->file);
+- free(f);
++ if(f->file != stdin)
++ {
++ fclose(f->file);
++ }
++ free(f);
+ }
+
+ static int32_t get_s32_sample(const wavfile * f, const uint8_t *buffer, int sample, int channel)
+ {
+- int offset = (f->bits_per_sample / 8) * (f->channels * sample + channel);
+- uint32_t v;
+- switch (f->bits_per_sample) {
++ int offset = (f->bits_per_sample / 8) * (f->channels * sample + channel);
++ uint32_t v;
++ switch (f->bits_per_sample)
++ {
+ case 16:
+- v = (uint32_t)buffer[offset + 0] | ((uint32_t)buffer[offset + 1] << 8);
+- return v << 16;
+- break;
++ v = (uint32_t)buffer[offset + 0] | ((uint32_t)buffer[offset + 1] << 8);
++ return v << 16;
++ break;
+ case 32:
+- v = (uint32_t)buffer[offset + 0] | ((uint32_t)buffer[offset + 1] << 8) |
++ v = (uint32_t)buffer[offset + 0] | ((uint32_t)buffer[offset + 1] << 8) |
+ ((uint32_t)buffer[offset + 2] << 16) | ((uint32_t)buffer[offset + 3] << 24);
+- return v;
+- break;
++ return v;
++ break;
+ default:
+- return 0;
+- }
++ return 0;
++ }
+ }
+
+-int wavfile_read_s32(wavfile * f, int32_t *samples)
++int wavfile_read_s32(wavfile * f, int32_t *samples, size_t sample_count)
+ {
+- uint8_t buffer[512 * 6 * 4];
+- int32_t smpte_sample[6];
+- int samples_to_read;
+- int bytes_to_read;
+- unsigned int i, ch;
+-
+- memset(buffer, 0, 512 * 6 * 4);
+- samples_to_read = f->samples_left < 512 ? f->samples_left : 512;
+- bytes_to_read = samples_to_read * f->channels * (f->bits_per_sample / 8);
+- f->samples_left -= samples_to_read;
+- if (fread(buffer, 1, bytes_to_read, f->file) != bytes_to_read) {
+- f->samples_left = 0;
+- }
+-
+- for (i = 0; i < 512; i++) {
+- for (ch = 0; ch < f->channels; ch++)
+- smpte_sample[ch] = get_s32_sample(f, buffer, i, ch);
+- switch(f->channels) {
+- case 1:
+- case 2:
+- case 4:
+- for (ch = 0; ch < f->channels; ch++)
+- *(samples++) = smpte_sample[ch];
+- break;
+- case 5:
+- *(samples++) = smpte_sample[2];
+- *(samples++) = smpte_sample[0];
+- *(samples++) = smpte_sample[1];
+- *(samples++) = smpte_sample[3];
+- *(samples++) = smpte_sample[4];
+- break;
+- case 6:
+- *(samples++) = smpte_sample[2];
+- *(samples++) = smpte_sample[0];
+- *(samples++) = smpte_sample[1];
+- *(samples++) = smpte_sample[4];
+- *(samples++) = smpte_sample[5];
+- *(samples++) = smpte_sample[3];
+- break;
+- }
+- }
+-
+- return f->samples_left;
++ uint8_t buffer[BUFFSIZE_BYTES];
++ int32_t smpte_sample[6];
++ int samples_to_read;
++ int bytes_to_read;
++ int bytes_read;
++ unsigned int i, ch;
++
++ if(sample_count != BUFFSIZE_SAMPLES)
++ {
++ fprintf(stderr, "Only 512 samples currently supported!\n");
++ return 0;
++ }
++
++ if(f->samples_left < 1)
++ {
++ return 0;
++ }
++
++ memset(buffer, 0, BUFFSIZE_BYTES);
++ samples_to_read = (f->samples_left < BUFFSIZE_SAMPLES) ? f->samples_left : BUFFSIZE_SAMPLES;
++ bytes_to_read = samples_to_read * f->channels * (f->bits_per_sample / 8);
++ if(f->samples_left != UNKNOWN_SIZE) {
++ f->samples_left -= samples_to_read;
++ }
++
++ bytes_read = SIZE2INT(fread(buffer, 1, bytes_to_read, f->file));
++ if(bytes_read != bytes_to_read) {
++ f->samples_left = 0;
++ }
++
++ for (i = 0; i < BUFFSIZE_SAMPLES; i++)
++ {
++ for (ch = 0; ch < f->channels; ch++)
++ smpte_sample[ch] = get_s32_sample(f, buffer, i, ch);
++ switch(f->channels)
++ {
++ case 1:
++ case 2:
++ case 4:
++ for (ch = 0; ch < f->channels; ch++)
++ *(samples++) = smpte_sample[ch];
++ break;
++ case 3:
++ *(samples++) = smpte_sample[2];
++ *(samples++) = smpte_sample[0];
++ *(samples++) = smpte_sample[1];
++ break;
++ case 5:
++ *(samples++) = smpte_sample[2];
++ *(samples++) = smpte_sample[0];
++ *(samples++) = smpte_sample[1];
++ *(samples++) = smpte_sample[3];
++ *(samples++) = smpte_sample[4];
++ break;
++ case 6:
++ *(samples++) = smpte_sample[2];
++ *(samples++) = smpte_sample[0];
++ *(samples++) = smpte_sample[1];
++ *(samples++) = smpte_sample[4];
++ *(samples++) = smpte_sample[5];
++ *(samples++) = smpte_sample[3];
++ break;
++ default:
++ fprintf(stderr, "FIXME: Unexpected channel number!\n");
++ exit(1);
++ }
++ }
++
++ return bytes_read / (f->channels * (f->bits_per_sample / 8));
+ }
+diff --git a/wavfile.h b/wavfile.h
+index b8945e2..418e55f 100644
+--- a/wavfile.h
++++ b/wavfile.h
+@@ -23,6 +23,8 @@
+
+ #include <stdio.h>
+
++#define UNKNOWN_SIZE 0xFFFFFFFF
++
+ typedef struct {
+ FILE * file;
+ unsigned int channels;
+@@ -31,8 +33,8 @@ typedef struct {
+ unsigned int samples_left;
+ } wavfile;
+
+-wavfile * wavfile_open(const char * filename);
+-int wavfile_read_s32(wavfile * f, int32_t * samples);
++wavfile * wavfile_open(const char * filename, const char ** error_msg, const int ignore_len);
++int wavfile_read_s32(wavfile * f, int32_t *samples, size_t sample_count);
+ void wavfile_close(wavfile * f);
+
+ #endif
+diff --git a/xgetopt.c b/xgetopt.c
+new file mode 100644
+index 0000000..507b44d
+--- /dev/null
++++ b/xgetopt.c
+@@ -0,0 +1,206 @@
++// XGetopt.cpp Version 1.2
++//
++// Author: Hans Dietrich
++// hdietrich2@hotmail.com
++//
++// Description:
++// XGetopt.cpp implements getopt(), a function to parse command lines.
++//
++// History
++// Version 1.2 - 2003 May 17
++// - Added Unicode support
++//
++// Version 1.1 - 2002 March 10
++// - Added example to XGetopt.cpp module header
++//
++// This software is released into the public domain.
++// You are free to use it in any way you like.
++//
++// This software is provided "as is" with no expressed
++// or implied warranty. I accept no liability for any
++// damage or loss of business that this software may cause.
++//
++///////////////////////////////////////////////////////////////////////////////
++
++///////////////////////////////////////////////////////////////////////////////
++#include <stdio.h>
++#include <string.h>
++///////////////////////////////////////////////////////////////////////////////
++
++#include "xgetopt.h"
++
++///////////////////////////////////////////////////////////////////////////////
++//
++// X G e t o p t . c p p
++//
++//
++// NAME
++// getopt -- parse command line options
++//
++// SYNOPSIS
++// int getopt(int argc, char *argv[], char *optstring)
++//
++// extern char *optarg;
++// extern int optind;
++//
++// DESCRIPTION
++// The getopt() function parses the command line arguments. Its
++// arguments argc and argv are the argument count and array as
++// passed into the application on program invocation. In the case
++// of Visual C++ programs, argc and argv are available via the
++// variables __argc and __argv (double underscores), respectively.
++// getopt returns the next option letter in argv that matches a
++// letter in optstring. (Note: Unicode programs should use
++// __targv instead of __argv. Also, all character and string
++// literals should be enclosed in _T( ) ).
++//
++// optstring is a string of recognized option letters; if a letter
++// is followed by a colon, the option is expected to have an argument
++// that may or may not be separated from it by white space. optarg
++// is set to point to the start of the option argument on return from
++// getopt.
++//
++// Option letters may be combined, e.g., "-ab" is equivalent to
++// "-a -b". Option letters are case sensitive.
++//
++// getopt places in the external variable optind the argv index
++// of the next argument to be processed. optind is initialized
++// to 0 before the first call to getopt.
++//
++// When all options have been processed (i.e., up to the first
++// non-option argument), getopt returns EOF, optarg will point
++// to the argument, and optind will be set to the argv index of
++// the argument. If there are no non-option arguments, optarg
++// will be set to NULL.
++//
++// The special option "--" may be used to delimit the end of the
++// options; EOF will be returned, and "--" (and everything after it)
++// will be skipped.
++//
++// RETURN VALUE
++// For option letters contained in the string optstring, getopt
++// will return the option letter. getopt returns a question mark (?)
++// when it encounters an option letter not included in optstring.
++// EOF is returned when processing is finished.
++//
++// BUGS
++// 1) Long options are not supported.
++// 2) The GNU double-colon extension is not supported.
++// 3) The environment variable POSIXLY_CORRECT is not supported.
++// 4) The + syntax is not supported.
++// 5) The automatic permutation of arguments is not supported.
++// 6) This implementation of getopt() returns EOF if an error is
++// encountered, instead of -1 as the latest standard requires.
++//
++// EXAMPLE
++// BOOL CMyApp::ProcessCommandLine(int argc, char *argv[])
++// {
++// int c;
++//
++// while ((c = getopt(argc, argv, _T("aBn:"))) != EOF)
++// {
++// switch (c)
++// {
++// case _T('a'):
++// TRACE(_T("option a\n"));
++// //
++// // set some flag here
++// //
++// break;
++//
++// case _T('B'):
++// TRACE( _T("option B\n"));
++// //
++// // set some other flag here
++// //
++// break;
++//
++// case _T('n'):
++// TRACE(_T("option n: value=%d\n"), atoi(optarg));
++// //
++// // do something with value here
++// //
++// break;
++//
++// case _T('?'):
++// TRACE(_T("ERROR: illegal option %s\n"), argv[optind-1]);
++// return FALSE;
++// break;
++//
++// default:
++// TRACE(_T("WARNING: no handler for option %c\n"), c);
++// return FALSE;
++// break;
++// }
++// }
++// //
++// // check for non-option args here
++// //
++// return TRUE;
++// }
++//
++///////////////////////////////////////////////////////////////////////////////
++
++int xgetopt(int argc, char *argv[], char *optstring, xgetopt_t *ctx)
++{
++ char c, *cp;
++
++ if (ctx->optind == 0)
++ ctx->next = NULL;
++
++ ctx->optarg = NULL;
++
++ if (ctx->next == NULL || *ctx->next == '\0')
++ {
++ if (ctx->optind == 0)
++ ctx->optind++;
++
++ if (ctx->optind >= argc || argv[ctx->optind][0] != '-' || argv[ctx->optind][1] == '\0')
++ {
++ ctx->optarg = NULL;
++ if (ctx->optind < argc)
++ ctx->optarg = argv[ctx->optind];
++ return EOF;
++ }
++
++ if (strcmp(argv[ctx->optind], "--") == 0)
++ {
++ ctx->optind++;
++ ctx->optarg = NULL;
++ if (ctx->optind < argc)
++ ctx->optarg = argv[ctx->optind];
++ return EOF;
++ }
++
++ ctx->next = argv[ctx->optind];
++ ctx->next++; // skip past -
++ ctx->optind++;
++ }
++
++ c = *ctx->next++;
++ cp = strchr(optstring, c);
++
++ if (cp == NULL || c == ':')
++ return '?';
++
++ cp++;
++ if (*cp == ':')
++ {
++ if (*ctx->next != '\0')
++ {
++ ctx->optarg = ctx->next;
++ ctx->next = NULL;
++ }
++ else if (ctx->optind < argc)
++ {
++ ctx->optarg = argv[ctx->optind];
++ ctx->optind++;
++ }
++ else
++ {
++ return '?';
++ }
++ }
++
++ return c;
++}
+diff --git a/xgetopt.h b/xgetopt.h
+new file mode 100644
+index 0000000..f9371b9
+--- /dev/null
++++ b/xgetopt.h
+@@ -0,0 +1,29 @@
++// XGetopt.h Version 1.2
++//
++// Author: Hans Dietrich
++// hdietrich2@hotmail.com
++//
++// This software is released into the public domain.
++// You are free to use it in any way you like.
++//
++// This software is provided "as is" with no expressed
++// or implied warranty. I accept no liability for any
++// damage or loss of business that this software may cause.
++//
++///////////////////////////////////////////////////////////////////////////////
++
++#ifndef XGETOPT_H
++#define XGETOPT_H
++
++typedef struct
++{
++ int optind;
++ int opterr;
++ char *optarg;
++ char *next;
++}
++xgetopt_t;
++
++int xgetopt(int argc, char *argv[], char *optstring, xgetopt_t *ctx);
++
++#endif //XGETOPT_H
--- /dev/null
+ common/mp4ff/mp4ff.vcproj | 6 ++-
+ frontend/audio.c | 12 +++++-
+ frontend/faad.sln | 14 ++----
+ frontend/faad.vcproj | 22 ++++++----
+ frontend/main.c | 82 +++++++++++++++++++++++++++++-------
+ frontend/unicode_support.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
+ frontend/unicode_support.h | 21 +++++++++
+ libfaad/common.h | 1 +
+ libfaad/libfaad.sln | 6 +-
+ libfaad/libfaad.vcproj | 11 ++++-
+ 10 files changed, 230 insertions(+), 43 deletions(-)
+
+diff --git a/common/mp4ff/mp4ff.vcproj b/common/mp4ff/mp4ff.vcproj
+index 70fd4a0..7ed6158 100644
+--- a/common/mp4ff/mp4ff.vcproj
++++ b/common/mp4ff/mp4ff.vcproj
+@@ -1,9 +1,10 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8,00"
++ Version="9,00"
+ Name="mp4ff"
+ ProjectGUID="{F470BB4A-7675-4D6A-B310-41F33AC6F987}"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -44,8 +45,9 @@
+ InlineFunctionExpansion="1"
+ PreprocessorDefinitions="USE_TAGGING"
+ StringPooling="true"
+- RuntimeLibrary="2"
++ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile=".\Release/mp4ff.pch"
+ AssemblerListingLocation=".\Release/"
+diff --git a/frontend/audio.c b/frontend/audio.c
+index 067ac20..ad92118 100644
+--- a/frontend/audio.c
++++ b/frontend/audio.c
+@@ -36,12 +36,16 @@
+ #include <fcntl.h>
+ #include <math.h>
+ #include <neaacdec.h>
++
+ #include "audio.h"
++#include "unicode_support.h"
+
+
+ audio_file *open_audio_file(char *infile, int samplerate, int channels,
+ int outputFormat, int fileType, long channelMask)
+ {
++ wchar_t *fileNameW;
++
+ audio_file *aufile = malloc(sizeof(audio_file));
+
+ aufile->outputFormat = outputFormat;
+@@ -78,7 +82,13 @@ audio_file *open_audio_file(char *infile, int samplerate, int channels,
+ aufile->toStdio = 1;
+ } else {
+ aufile->toStdio = 0;
+- aufile->sndfile = fopen(infile, "wb");
++ aufile->sndfile = NULL;
++ fileNameW = utf8_to_utf16(infile);
++ if(fileNameW)
++ {
++ aufile->sndfile = _wfopen(fileNameW, L"wb");
++ free(fileNameW);
++ }
+ }
+
+ if (aufile->sndfile == NULL)
+diff --git a/frontend/faad.sln b/frontend/faad.sln
+index a47200b..3ccdf0f 100644
+--- a/frontend/faad.sln
++++ b/frontend/faad.sln
+@@ -1,15 +1,11 @@
+
+-Microsoft Visual Studio Solution File, Format Version 9.00
+-# Visual Studio 2005
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faad", "faad.vcproj", "{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}"
+- ProjectSection(ProjectDependencies) = postProject
+- {F470BB4A-7675-4D6A-B310-41F33AC6F987} = {F470BB4A-7675-4D6A-B310-41F33AC6F987}
+- {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} = {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}
+- EndProjectSection
++Microsoft Visual Studio Solution File, Format Version 11.00
++# Visual Studio 2010
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faad", "faad.vcxproj", "{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\libfaad\libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\libfaad\libfaad.vcxproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mp4ff", "..\common\mp4ff\mp4ff.vcproj", "{F470BB4A-7675-4D6A-B310-41F33AC6F987}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mp4ff", "..\common\mp4ff\mp4ff.vcxproj", "{F470BB4A-7675-4D6A-B310-41F33AC6F987}"
+ EndProject
+ Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+diff --git a/frontend/faad.vcproj b/frontend/faad.vcproj
+index b187293..185f64c 100644
+--- a/frontend/faad.vcproj
++++ b/frontend/faad.vcproj
+@@ -1,9 +1,10 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="faad"
+ ProjectGUID="{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -78,6 +79,8 @@
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\Debug/faad.pdb"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+@@ -98,9 +101,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -133,15 +133,16 @@
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=""
+- Optimization="1"
++ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories="../include,../common/mp4ff,../common/faad"
+ PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE"
+ StringPooling="true"
+- RuntimeLibrary="2"
++ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile=".\Release/faad.pch"
+ AssemblerListingLocation=".\Release/"
+@@ -170,6 +171,8 @@
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+@@ -190,9 +193,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -216,6 +216,10 @@
+ RelativePath=".\main.c"
+ >
+ </File>
++ <File
++ RelativePath=".\unicode_support.c"
++ >
++ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+diff --git a/frontend/main.c b/frontend/main.c
+index a3bb68d..8aa9bfa 100644
+--- a/frontend/main.c
++++ b/frontend/main.c
+@@ -47,6 +47,7 @@
+ #include <mp4ff.h>
+
+ #include "audio.h"
++#include "unicode_support.h"
+
+ #ifndef min
+ #define min(a,b) ( (a) < (b) ? (a) : (b) )
+@@ -69,6 +70,8 @@ static void faad_fprintf(FILE *stream, const char *fmt, ...)
+ vfprintf(stream, fmt, ap);
+
+ va_end(ap);
++
++ fflush(stream);
+ }
+ }
+
+@@ -427,11 +430,19 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std
+
+ aac_buffer b;
+
++ wchar_t *fileNameW;
++
+ memset(&b, 0, sizeof(aac_buffer));
+
+ if (adts_out)
+ {
+- adtsFile = fopen(adts_fn, "wb");
++ adtsFile = NULL;
++ fileNameW = utf8_to_utf16(adts_fn);
++ if(fileNameW)
++ {
++ adtsFile = _wfopen(fileNameW, L"wb");
++ free(fileNameW);
++ }
+ if (adtsFile == NULL)
+ {
+ faad_fprintf(stderr, "Error opening file: %s\n", adts_fn);
+@@ -439,7 +450,13 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std
+ }
+ }
+
+- b.infile = fopen(aacfile, "rb");
++ b.infile = NULL;
++ fileNameW = utf8_to_utf16(aacfile);
++ if(fileNameW)
++ {
++ b.infile = _wfopen(fileNameW, L"rb");
++ free(fileNameW);
++ }
+ if (b.infile == NULL)
+ {
+ /* unable to open file */
+@@ -634,7 +651,7 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std
+ if (percent > old_percent)
+ {
+ old_percent = percent;
+- sprintf(percents, "%d%% decoding %s.", percent, aacfile);
++ sprintf(percents, "[%d%%] decoding %s.", percent, aacfile);
+ faad_fprintf(stderr, "%s\r", percents);
+ #ifdef _WIN32
+ SetConsoleTitle(percents);
+@@ -746,11 +763,19 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std
+ unsigned int framesize;
+ unsigned long timescale;
+
++ wchar_t *fileNameW;
+
+ /* initialise the callback structure */
+ mp4ff_callback_t *mp4cb = malloc(sizeof(mp4ff_callback_t));
+
+- mp4File = fopen(mp4file, "rb");
++ mp4File = NULL;
++ fileNameW = utf8_to_utf16(mp4file);
++ if(fileNameW)
++ {
++ mp4File = _wfopen(fileNameW, L"rb");
++ free(fileNameW);
++ }
++
+ mp4cb->read = read_callback;
+ mp4cb->seek = seek_callback;
+ mp4cb->user_data = mp4File;
+@@ -767,7 +792,13 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std
+
+ if (adts_out)
+ {
+- adtsFile = fopen(adts_fn, "wb");
++ adtsFile = NULL;
++ fileNameW = utf8_to_utf16(adts_fn);
++ if(fileNameW)
++ {
++ adtsFile = _wfopen(fileNameW, L"wb");
++ free(fileNameW);
++ }
+ if (adtsFile == NULL)
+ {
+ faad_fprintf(stderr, "Error opening file: %s\n", adts_fn);
+@@ -973,8 +1004,9 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std
+ if (percent > old_percent)
+ {
+ old_percent = percent;
+- sprintf(percents, "%d%% decoding %s.", percent, mp4file);
++ sprintf(percents, "[%d%%] decoding %s.", percent, mp4file);
+ faad_fprintf(stderr, "%s\r", percents);
++
+ #ifdef _WIN32
+ SetConsoleTitle(percents);
+ #endif
+@@ -1011,7 +1043,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std
+ return frameInfo.error;
+ }
+
+-int main(int argc, char *argv[])
++int faad_main(int argc, char *argv[])
+ {
+ int result;
+ int infoOnly = 0;
+@@ -1028,12 +1060,13 @@ int main(int argc, char *argv[])
+ int mp4file = 0;
+ int noGapless = 0;
+ char *fnp;
+- char aacFileName[255];
+- char audioFileName[255];
+- char adtsFileName[255];
++ char *aacFileName = NULL; //[255];
++ char *audioFileName = NULL; //[255];
++ char *adtsFileName = NULL; //[255];
+ unsigned char header[8];
+ float length = 0;
+ FILE *hMP4File;
++ wchar_t *fileNameW;
+
+ /* System dependant types */
+ #ifdef _WIN32
+@@ -1044,7 +1077,6 @@ int main(int argc, char *argv[])
+
+ unsigned long cap = NeAACDecGetCapabilities();
+
+-
+ /* begin process command line */
+ progName = argv[0];
+ while (1) {
+@@ -1078,14 +1110,14 @@ int main(int argc, char *argv[])
+ if (optarg)
+ {
+ outfile_set = 1;
+- strcpy(audioFileName, optarg);
++ audioFileName = strdup(optarg);
+ }
+ break;
+ case 'a':
+ if (optarg)
+ {
+ adts_out = 1;
+- strcpy(adtsFileName, optarg);
++ adtsFileName = strdup(optarg);
+ }
+ break;
+ case 's':
+@@ -1205,7 +1237,7 @@ int main(int argc, char *argv[])
+ #endif
+
+ /* point to the specified file name */
+- strcpy(aacFileName, argv[optind]);
++ aacFileName = strdup(argv[optind]);
+
+ #ifdef _WIN32
+ begin = GetTickCount();
+@@ -1218,7 +1250,7 @@ int main(int argc, char *argv[])
+ */
+ if(!writeToStdio && !outfile_set)
+ {
+- strcpy(audioFileName, aacFileName);
++ audioFileName = strdup(aacFileName);
+
+ fnp = (char *)strrchr(audioFileName,'.');
+
+@@ -1230,7 +1262,13 @@ int main(int argc, char *argv[])
+
+ /* check for mp4 file */
+ mp4file = 0;
+- hMP4File = fopen(aacFileName, "rb");
++ hMP4File = NULL;
++ fileNameW = utf8_to_utf16(aacFileName);
++ if(fileNameW)
++ {
++ hMP4File = _wfopen(fileNameW, L"rb");
++ free(fileNameW);
++ }
+ if (!hMP4File)
+ {
+ faad_fprintf(stderr, "Error opening file: %s\n", aacFileName);
+@@ -1268,3 +1306,15 @@ int main(int argc, char *argv[])
+
+ return 0;
+ }
++
++int wmain(int argc, wchar_t **argv_utf16)
++{
++ int result = 0;
++ char **argv_utf8 = NULL;
++
++ init_commandline_arguments_utf8(argc, &argv_utf8, argv_utf16);
++ result = faad_main(argc, argv_utf8);
++ free_commandline_arguments_utf8(argc, &argv_utf8);
++
++ return result;
++}
+diff --git a/frontend/unicode_support.c b/frontend/unicode_support.c
+new file mode 100644
+index 0000000..21ecd5c
+--- /dev/null
++++ b/frontend/unicode_support.c
+@@ -0,0 +1,98 @@
++#include "unicode_support.h"
++
++#include <stdio.h>
++#include <windows.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++
++ if(!Buffer)
++ {
++ fprintf(stderr, "Error in utf16_to_utf8: Memory allocation failed!\n");
++ return NULL;
++ }
++
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++
++ if(!Buffer)
++ {
++ fprintf(stderr, "Error in utf8_to_utf16: Memory allocation failed!\n");
++ return NULL;
++ }
++
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16)
++{
++ int i = 0;
++
++ *argv_utf8 = (char**) malloc(argc * sizeof(char*));
++ if(!(*argv_utf8))
++ {
++ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n");
++ exit(-1);
++ }
++
++ for(i = 0; i < argc; i++)
++ {
++ (*argv_utf8)[i] = utf16_to_utf8(argv_utf16[i]);
++ if(!(*argv_utf8)[i])
++ {
++ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n");
++ exit(-1);
++ }
++ }
++}
++
++void free_commandline_arguments_utf8(int argc, char ***argv_utf8)
++{
++ int i = 0;
++
++ if(*argv_utf8 != NULL)
++ {
++ for(i = 0; i < argc; i++)
++ {
++ if((*argv_utf8)[i] != NULL)
++ {
++ free((*argv_utf8)[i]);
++ (*argv_utf8)[i] = NULL;
++ }
++ }
++ free(*argv_utf8);
++ *argv_utf8 = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
+diff --git a/frontend/unicode_support.h b/frontend/unicode_support.h
+new file mode 100644
+index 0000000..cc13fd9
+--- /dev/null
++++ b/frontend/unicode_support.h
+@@ -0,0 +1,21 @@
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++char *utf16_to_utf8(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16);
++void free_commandline_arguments_utf8(int argc, char ***argv_utf8);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+\ No newline at end of file
+diff --git a/libfaad/common.h b/libfaad/common.h
+index d3b21c3..6796ded 100644
+--- a/libfaad/common.h
++++ b/libfaad/common.h
+@@ -346,6 +346,7 @@ char *strchr(), *strrchr();
+
+ #ifdef __ICL /* only Intel C compiler has fmath ??? */
+
++ #error Deine Mudda!
+ #include <mathf.h>
+
+ #define sin sinf
+diff --git a/libfaad/libfaad.sln b/libfaad/libfaad.sln
+index 88087f6..a22c0f4 100644
+--- a/libfaad/libfaad.sln
++++ b/libfaad/libfaad.sln
+@@ -1,6 +1,6 @@
+-Microsoft Visual Studio Solution File, Format Version 9.00
+-# Visual C++ Express 2005
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}"
++Microsoft Visual Studio Solution File, Format Version 11.00
++# Visual Studio 2010
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "libfaad.vcxproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}"
+ EndProject
+ Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+diff --git a/libfaad/libfaad.vcproj b/libfaad/libfaad.vcproj
+index 6401c9b..2adcf81 100644
+--- a/libfaad/libfaad.vcproj
++++ b/libfaad/libfaad.vcproj
+@@ -1,9 +1,11 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="libfaad"
+ ProjectGUID="{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}"
++ RootNamespace="libfaad"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -41,13 +43,16 @@
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=""
+- Optimization="2"
++ Optimization="3"
+ InlineFunctionExpansion="1"
++ EnableIntrinsicFunctions="true"
++ FavorSizeOrSpeed="1"
+ AdditionalIncludeDirectories="../include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB"
+ StringPooling="true"
+- RuntimeLibrary="2"
++ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile=".\Release/libfaad.pch"
+ AssemblerListingLocation=".\Release/"
--- /dev/null
+ FLAC.sln | 311 ++++++++------------
+ .../c/decode/file/example_c_decode_file.vcproj | 13 +-
+ examples/c/decode/file/main.c | 2 +-
+ .../c/encode/file/example_c_encode_file.vcproj | 13 +-
+ examples/c/encode/file/main.c | 2 +-
+ .../cpp/decode/file/example_cpp_decode_file.vcproj | 13 +-
+ examples/cpp/decode/file/main.cpp | 2 +-
+ .../cpp/encode/file/example_cpp_encode_file.vcproj | 13 +-
+ examples/cpp/encode/file/main.cpp | 2 +-
+ include/ogg/ogg.h | 209 +++++++++++++
+ include/ogg/os_types.h | 148 ++++++++++
+ include/share/utf8.h | 3 +
+ src/flac/analyze.c | 3 +-
+ src/flac/decode.c | 7 +-
+ src/flac/encode.c | 5 +-
+ src/flac/flac.vcproj | 23 +-
+ src/flac/foreign_metadata.c | 15 +-
+ src/flac/iffscan.c | 4 +-
+ src/flac/iffscan.vcproj | 15 +-
+ src/flac/main.c | 19 +-
+ src/flac/unicode_support.c | 87 ++++++
+ src/flac/unicode_support.h | 21 ++
+ src/flac/vorbiscomment.c | 7 +-
+ src/libFLAC++/libFLAC++_dynamic.vcproj | 15 +-
+ src/libFLAC++/libFLAC++_static.vcproj | 5 +-
+ src/libFLAC/libFLAC_dynamic.vcproj | 16 +-
+ src/libFLAC/libFLAC_static.vcproj | 11 +-
+ src/libFLAC/metadata_iterators.c | 12 +-
+ src/libFLAC/stream_decoder.c | 2 +-
+ src/libFLAC/stream_encoder.c | 2 +-
+ src/metaflac/metaflac.vcproj | 19 +-
+ .../flac_mac/flac_mac.vcproj | 15 +-
+ .../flac_ren/flac_ren.vcproj | 15 +-
+ src/plugin_common/plugin_common_static.vcproj | 5 +-
+ src/plugin_winamp2/in_flac.vcproj | 15 +-
+ src/share/getopt/getopt_static.vcproj | 5 +-
+ src/share/grabbag/grabbag_static.vcproj | 5 +-
+ src/share/grabbag/picture.c | 2 +-
+ .../replaygain_analysis_static.vcproj | 5 +-
+ .../replaygain_synthesis_static.vcproj | 5 +-
+ src/share/utf8/utf8.c | 1 -
+ src/share/utf8/utf8_static.vcproj | 5 +-
+ src/test_grabbag/cuesheet/test_cuesheet.vcproj | 15 +-
+ src/test_grabbag/picture/test_picture.vcproj | 15 +-
+ src/test_libFLAC++/test_libFLAC++.vcproj | 15 +-
+ src/test_libFLAC/test_libFLAC.vcproj | 15 +-
+ .../test_libs_common_static.vcproj | 5 +-
+ src/test_seeking/test_seeking.vcproj | 15 +-
+ src/test_streams/test_streams.vcproj | 15 +-
+ 49 files changed, 836 insertions(+), 356 deletions(-)
+
+diff --git a/FLAC.sln b/FLAC.sln
+index a753408..4d1181c 100644
+--- a/FLAC.sln
++++ b/FLAC.sln
+@@ -1,140 +1,140 @@
+
+-Microsoft Visual Studio Solution File, Format Version 9.00
+-# Visual C++ Express 2005
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "example_c_decode_file", "examples\c\decode\file\example_c_decode_file.vcproj", "{4cefbd00-c215-11db-8314-0800200c9a66}"
++Microsoft Visual Studio Solution File, Format Version 10.00
++# Visual Studio 2008
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_c_decode_file", "examples\c\decode\file\example_c_decode_file.vcproj", "{4CEFBD00-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "example_c_encode_file", "examples\c\encode\file\example_c_encode_file.vcproj", "{4cefbd01-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_c_encode_file", "examples\c\encode\file\example_c_encode_file.vcproj", "{4CEFBD01-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "example_cpp_decode_file", "examples\cpp\decode\file\example_cpp_decode_file.vcproj", "{4cefbe00-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_cpp_decode_file", "examples\cpp\decode\file\example_cpp_decode_file.vcproj", "{4CEFBE00-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
+- {4cefbc86-c215-11db-8314-0800200c9a66} = {4cefbc86-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
++ {4CEFBC86-C215-11DB-8314-0800200C9A66} = {4CEFBC86-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "example_cpp_encode_file", "examples\cpp\encode\file\example_cpp_encode_file.vcproj", "{4cefbe01-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_cpp_encode_file", "examples\cpp\encode\file\example_cpp_encode_file.vcproj", "{4CEFBE01-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
+- {4cefbc86-c215-11db-8314-0800200c9a66} = {4cefbc86-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
++ {4CEFBC86-C215-11DB-8314-0800200C9A66} = {4CEFBC86-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "flac", "src\flac\flac.vcproj", "{4cefbc7d-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flac", "src\flac\flac.vcproj", "{4CEFBC7D-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
+- {4cefbc89-c215-11db-8314-0800200c9a66} = {4cefbc89-c215-11db-8314-0800200c9a66}
+- {4cefbc92-c215-11db-8314-0800200c9a66} = {4cefbc92-c215-11db-8314-0800200c9a66}
+- {4cefbc80-c215-11db-8314-0800200c9a66} = {4cefbc80-c215-11db-8314-0800200c9a66}
+- {4cefbc8a-c215-11db-8314-0800200c9a66} = {4cefbc8a-c215-11db-8314-0800200c9a66}
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
++ {4CEFBC89-C215-11DB-8314-0800200C9A66} = {4CEFBC89-C215-11DB-8314-0800200C9A66}
++ {4CEFBC92-C215-11DB-8314-0800200C9A66} = {4CEFBC92-C215-11DB-8314-0800200C9A66}
++ {4CEFBC80-C215-11DB-8314-0800200C9A66} = {4CEFBC80-C215-11DB-8314-0800200C9A66}
++ {4CEFBC8A-C215-11DB-8314-0800200C9A66} = {4CEFBC8A-C215-11DB-8314-0800200C9A66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "iffscan", "src\flac\iffscan.vcproj", "{4cefbc94-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iffscan", "src\flac\iffscan.vcproj", "{4CEFBC94-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "flac_mac", "src\monkeys_audio_utilities\flac_mac\flac_mac.vcproj", "{4cefbc7e-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flac_mac", "src\monkeys_audio_utilities\flac_mac\flac_mac.vcproj", "{4CEFBC7E-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "flac_ren", "src\monkeys_audio_utilities\flac_ren\flac_ren.vcproj", "{4cefbc7f-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flac_ren", "src\monkeys_audio_utilities\flac_ren\flac_ren.vcproj", "{4CEFBC7F-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "flacdiff", "src\utils\flacdiff\flacdiff.vcproj", "{4cefbc93-c215-11db-8314-0800200c9a66}"
++Project("{4CEFBC7C-C215-11DB-8314-0800200C9A66}") = "flacdiff", "src\utils\flacdiff\flacdiff.vcproj", "{4CEFBC93-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc86-c215-11db-8314-0800200c9a66} = {4cefbc86-c215-11db-8314-0800200c9a66}
++ {4CEFBC86-C215-11DB-8314-0800200C9A66} = {4CEFBC86-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "flactimer", "src\utils\flactimer\flactimer.vcproj", "{4cefbc95-c215-11db-8314-0800200c9a66}"
++Project("{4CEFBC7C-C215-11DB-8314-0800200C9A66}") = "flactimer", "src\utils\flactimer\flactimer.vcproj", "{4CEFBC95-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "getopt_static", "src\share\getopt\getopt_static.vcproj", "{4cefbc80-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "getopt_static", "src\share\getopt\getopt_static.vcproj", "{4CEFBC80-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "grabbag_static", "src\share\grabbag\grabbag_static.vcproj", "{4cefbc81-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grabbag_static", "src\share\grabbag\grabbag_static.vcproj", "{4CEFBC81-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
+- {4cefbc89-c215-11db-8314-0800200c9a66} = {4cefbc89-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
++ {4CEFBC89-C215-11DB-8314-0800200C9A66} = {4CEFBC89-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "in_flac", "src\plugin_winamp2\in_flac.vcproj", "{4cefbc82-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_flac", "src\plugin_winamp2\in_flac.vcproj", "{4CEFBC82-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
+- {4cefbc8a-c215-11db-8314-0800200c9a66} = {4cefbc8a-c215-11db-8314-0800200c9a66}
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
+- {4cefbc88-c215-11db-8314-0800200c9a66} = {4cefbc88-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
++ {4CEFBC8A-C215-11DB-8314-0800200C9A66} = {4CEFBC8A-C215-11DB-8314-0800200C9A66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
++ {4CEFBC88-C215-11DB-8314-0800200C9A66} = {4CEFBC88-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "libFLAC_dynamic", "src\libFLAC\libFLAC_dynamic.vcproj", "{4cefbc83-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libFLAC_dynamic", "src\libFLAC\libFLAC_dynamic.vcproj", "{4CEFBC83-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "libFLAC_static", "src\libFLAC\libFLAC_static.vcproj", "{4cefbc84-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libFLAC_static", "src\libFLAC\libFLAC_static.vcproj", "{4CEFBC84-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "libFLAC++_dynamic", "src\libFLAC++\libFLAC++_dynamic.vcproj", "{4cefbc85-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libFLAC++_dynamic", "src\libFLAC++\libFLAC++_dynamic.vcproj", "{4CEFBC85-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc83-c215-11db-8314-0800200c9a66} = {4cefbc83-c215-11db-8314-0800200c9a66}
++ {4CEFBC83-C215-11DB-8314-0800200C9A66} = {4CEFBC83-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "libFLAC++_static", "src\libFLAC++\libFLAC++_static.vcproj", "{4cefbc86-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libFLAC++_static", "src\libFLAC++\libFLAC++_static.vcproj", "{4CEFBC86-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "metaflac", "src\metaflac\metaflac.vcproj", "{4cefbc87-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "metaflac", "src\metaflac\metaflac.vcproj", "{4CEFBC87-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
+- {4cefbc80-c215-11db-8314-0800200c9a66} = {4cefbc80-c215-11db-8314-0800200c9a66}
+- {4cefbc92-c215-11db-8314-0800200c9a66} = {4cefbc92-c215-11db-8314-0800200c9a66}
+- {4cefbc89-c215-11db-8314-0800200c9a66} = {4cefbc89-c215-11db-8314-0800200c9a66}
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
++ {4CEFBC80-C215-11DB-8314-0800200C9A66} = {4CEFBC80-C215-11DB-8314-0800200C9A66}
++ {4CEFBC92-C215-11DB-8314-0800200C9A66} = {4CEFBC92-C215-11DB-8314-0800200C9A66}
++ {4CEFBC89-C215-11DB-8314-0800200C9A66} = {4CEFBC89-C215-11DB-8314-0800200C9A66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "plugin_common_static", "src\plugin_common\plugin_common_static.vcproj", "{4cefbc88-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_common_static", "src\plugin_common\plugin_common_static.vcproj", "{4CEFBC88-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "replaygain_analysis_static", "src\share\replaygain_analysis\replaygain_analysis_static.vcproj", "{4cefbc89-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "replaygain_analysis_static", "src\share\replaygain_analysis\replaygain_analysis_static.vcproj", "{4CEFBC89-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "replaygain_synthesis_static", "src\share\replaygain_synthesis\replaygain_synthesis_static.vcproj", "{4cefbc8a-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "replaygain_synthesis_static", "src\share\replaygain_synthesis\replaygain_synthesis_static.vcproj", "{4CEFBC8A-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_cuesheet", "src\test_grabbag\cuesheet\test_cuesheet.vcproj", "{4cefbc8b-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_cuesheet", "src\test_grabbag\cuesheet\test_cuesheet.vcproj", "{4CEFBC8B-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_libFLAC", "src\test_libFLAC\test_libFLAC.vcproj", "{4cefbc8c-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_libFLAC", "src\test_libFLAC\test_libFLAC.vcproj", "{4CEFBC8C-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc8e-c215-11db-8314-0800200c9a66} = {4cefbc8e-c215-11db-8314-0800200c9a66}
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC8E-C215-11DB-8314-0800200C9A66} = {4CEFBC8E-C215-11DB-8314-0800200C9A66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_libFLAC++", "src\test_libFLAC++\test_libFLAC++.vcproj", "{4cefbc8d-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_libFLAC++", "src\test_libFLAC++\test_libFLAC++.vcproj", "{4CEFBC8D-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc86-c215-11db-8314-0800200c9a66} = {4cefbc86-c215-11db-8314-0800200c9a66}
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
+- {4cefbc8e-c215-11db-8314-0800200c9a66} = {4cefbc8e-c215-11db-8314-0800200c9a66}
++ {4CEFBC86-C215-11DB-8314-0800200C9A66} = {4CEFBC86-C215-11DB-8314-0800200C9A66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
++ {4CEFBC8E-C215-11DB-8314-0800200C9A66} = {4CEFBC8E-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_libs_common_static", "src\test_libs_common\test_libs_common_static.vcproj", "{4cefbc8e-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_libs_common_static", "src\test_libs_common\test_libs_common_static.vcproj", "{4CEFBC8E-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_picture", "src\test_grabbag\picture\test_picture.vcproj", "{4cefbc8f-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_picture", "src\test_grabbag\picture\test_picture.vcproj", "{4CEFBC8F-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc81-c215-11db-8314-0800200c9a66} = {4cefbc81-c215-11db-8314-0800200c9a66}
++ {4CEFBC81-C215-11DB-8314-0800200C9A66} = {4CEFBC81-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_seeking", "src\test_seeking\test_seeking.vcproj", "{4cefbc90-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_seeking", "src\test_seeking\test_seeking.vcproj", "{4CEFBC90-C215-11DB-8314-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+- {4cefbc84-c215-11db-8314-0800200c9a66} = {4cefbc84-c215-11db-8314-0800200c9a66}
++ {4CEFBC84-C215-11DB-8314-0800200C9A66} = {4CEFBC84-C215-11DB-8314-0800200C9A66}
+ EndProjectSection
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "test_streams", "src\test_streams\test_streams.vcproj", "{4cefbc91-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_streams", "src\test_streams\test_streams.vcproj", "{4CEFBC91-C215-11DB-8314-0800200C9A66}"
+ EndProject
+-Project("{4cefbc7c-c215-11db-8314-0800200c9a66}") = "utf8_static", "src\share\utf8\utf8_static.vcproj", "{4cefbc92-c215-11db-8314-0800200c9a66}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utf8_static", "src\share\utf8\utf8_static.vcproj", "{4CEFBC92-C215-11DB-8314-0800200C9A66}"
+ EndProject
+ Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+@@ -142,122 +142,61 @@ Global
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+- {4cefbc7d-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc7d-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc7d-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc7d-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc7e-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc7e-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc7e-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc7e-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc7f-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc7f-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc7f-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc7f-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc80-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc80-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc80-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc80-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc81-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc81-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc81-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc81-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc82-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc82-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc82-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc82-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc83-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc83-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc83-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc83-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc84-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc84-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc84-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc84-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc85-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc85-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc85-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc85-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc86-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc86-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc86-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc86-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc87-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc87-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc87-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc87-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc88-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc88-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc88-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc88-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc89-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc89-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc89-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc89-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8a-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8a-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8a-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8a-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8b-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8b-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8b-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8b-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8c-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8c-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8c-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8c-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8d-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8d-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8d-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8d-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8e-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8e-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8e-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8e-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc8f-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc8f-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc8f-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc8f-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc90-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc90-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc90-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc90-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc91-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc91-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc91-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc91-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc92-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc92-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc92-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc92-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc93-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc93-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc93-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc93-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc94-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc94-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc94-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc94-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbc95-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbc95-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbc95-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbc95-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbd00-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbd00-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbd00-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbd00-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbd01-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbd01-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbd01-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbd01-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbe00-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbe00-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbe00-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbe00-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
+- {4cefbe01-c215-11db-8314-0800200c9a66}.Debug|Win32.ActiveCfg = Debug|Win32
+- {4cefbe01-c215-11db-8314-0800200c9a66}.Debug|Win32.Build.0 = Debug|Win32
+- {4cefbe01-c215-11db-8314-0800200c9a66}.Release|Win32.ActiveCfg = Release|Win32
+- {4cefbe01-c215-11db-8314-0800200c9a66}.Release|Win32.Build.0 = Release|Win32
++ {4CEFBD00-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBD00-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBD01-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBD01-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBE00-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBE00-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBE01-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBE01-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC7D-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC7D-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC7D-C215-11DB-8314-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
++ {4CEFBC94-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC94-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC7E-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC7E-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC7F-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC7F-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC80-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC80-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC81-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC81-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC82-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC82-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC83-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC83-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC85-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC85-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC86-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC86-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC87-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC87-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC88-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC88-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC89-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC89-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8A-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8A-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8B-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8B-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8C-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8C-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8D-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8D-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8E-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8E-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC8F-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC8F-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC90-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC90-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC91-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC91-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
++ {4CEFBC92-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
++ {4CEFBC92-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+diff --git a/examples/c/decode/file/example_c_decode_file.vcproj b/examples/c/decode/file/example_c_decode_file.vcproj
+index dc338fc..348a749 100644
+--- a/examples/c/decode/file/example_c_decode_file.vcproj
++++ b/examples/c/decode/file/example_c_decode_file.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="example_c_decode_file"
+ ProjectGUID="{4cefbd00-c215-11db-8314-0800200c9a66}"
+ RootNamespace="example_c_decode_file"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -151,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/examples/c/decode/file/main.c b/examples/c/decode/file/main.c
+index 20fafa2..6f160a4 100644
+--- a/examples/c/decode/file/main.c
++++ b/examples/c/decode/file/main.c
+@@ -76,7 +76,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+
+- if((fout = fopen(argv[2], "wb")) == NULL) {
++ if((fout = fopen_utf8(argv[2], "wb")) == NULL) {
+ fprintf(stderr, "ERROR: opening %s for output\n", argv[2]);
+ return 1;
+ }
+diff --git a/examples/c/encode/file/example_c_encode_file.vcproj b/examples/c/encode/file/example_c_encode_file.vcproj
+index 8a45a4d..319b8bd 100644
+--- a/examples/c/encode/file/example_c_encode_file.vcproj
++++ b/examples/c/encode/file/example_c_encode_file.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="example_c_encode_file"
+ ProjectGUID="{4cefbd01-c215-11db-8314-0800200c9a66}"
+ RootNamespace="example_c_encode_file"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -151,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/examples/c/encode/file/main.c b/examples/c/encode/file/main.c
+index d1037e3..148e045 100644
+--- a/examples/c/encode/file/main.c
++++ b/examples/c/encode/file/main.c
+@@ -59,7 +59,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+
+- if((fin = fopen(argv[1], "rb")) == NULL) {
++ if((fin = fopen_utf8(argv[1], "rb")) == NULL) {
+ fprintf(stderr, "ERROR: opening %s for output\n", argv[1]);
+ return 1;
+ }
+diff --git a/examples/cpp/decode/file/example_cpp_decode_file.vcproj b/examples/cpp/decode/file/example_cpp_decode_file.vcproj
+index cace46f..eda36e1 100644
+--- a/examples/cpp/decode/file/example_cpp_decode_file.vcproj
++++ b/examples/cpp/decode/file/example_cpp_decode_file.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="example_cpp_decode_file"
+ ProjectGUID="{4cefbe00-c215-11db-8314-0800200c9a66}"
+ RootNamespace="example_cpp_decode_file"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -151,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/examples/cpp/decode/file/main.cpp b/examples/cpp/decode/file/main.cpp
+index 5614050..20749c5 100644
+--- a/examples/cpp/decode/file/main.cpp
++++ b/examples/cpp/decode/file/main.cpp
+@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+
+- if((fout = fopen(argv[2], "wb")) == NULL) {
++ if((fout = fopen_utf8(argv[2], "wb")) == NULL) {
+ fprintf(stderr, "ERROR: opening %s for output\n", argv[2]);
+ return 1;
+ }
+diff --git a/examples/cpp/encode/file/example_cpp_encode_file.vcproj b/examples/cpp/encode/file/example_cpp_encode_file.vcproj
+index 7efab70..19d6314 100644
+--- a/examples/cpp/encode/file/example_cpp_encode_file.vcproj
++++ b/examples/cpp/encode/file/example_cpp_encode_file.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="example_cpp_encode_file"
+ ProjectGUID="{4cefbe01-c215-11db-8314-0800200c9a66}"
+ RootNamespace="example_cpp_encode_file"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -151,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/examples/cpp/encode/file/main.cpp b/examples/cpp/encode/file/main.cpp
+index 22448bb..29ce2a0 100644
+--- a/examples/cpp/encode/file/main.cpp
++++ b/examples/cpp/encode/file/main.cpp
+@@ -64,7 +64,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+
+- if((fin = fopen(argv[1], "rb")) == NULL) {
++ if((fin = fopen_utf8(argv[1], "rb")) == NULL) {
+ fprintf(stderr, "ERROR: opening %s for output\n", argv[1]);
+ return 1;
+ }
+diff --git a/include/ogg/ogg.h b/include/ogg/ogg.h
+new file mode 100644
+index 0000000..cea5c16
+--- /dev/null
++++ b/include/ogg/ogg.h
+@@ -0,0 +1,209 @@
++/********************************************************************
++ * *
++ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
++ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
++ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
++ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
++ * *
++ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
++ * by the Xiph.Org Foundation http://www.xiph.org/ *
++ * *
++ ********************************************************************
++
++ function: toplevel libogg include
++ last mod: $Id: ogg.h 17571 2010-10-27 13:28:20Z xiphmont $
++
++ ********************************************************************/
++#ifndef _OGG_H
++#define _OGG_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stddef.h>
++#include <ogg/os_types.h>
++
++typedef struct {
++ void *iov_base;
++ size_t iov_len;
++} ogg_iovec_t;
++
++typedef struct {
++ long endbyte;
++ int endbit;
++
++ unsigned char *buffer;
++ unsigned char *ptr;
++ long storage;
++} oggpack_buffer;
++
++/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/
++
++typedef struct {
++ unsigned char *header;
++ long header_len;
++ unsigned char *body;
++ long body_len;
++} ogg_page;
++
++/* ogg_stream_state contains the current encode/decode state of a logical
++ Ogg bitstream **********************************************************/
++
++typedef struct {
++ unsigned char *body_data; /* bytes from packet bodies */
++ long body_storage; /* storage elements allocated */
++ long body_fill; /* elements stored; fill mark */
++ long body_returned; /* elements of fill returned */
++
++
++ int *lacing_vals; /* The values that will go to the segment table */
++ ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact
++ this way, but it is simple coupled to the
++ lacing fifo */
++ long lacing_storage;
++ long lacing_fill;
++ long lacing_packet;
++ long lacing_returned;
++
++ unsigned char header[282]; /* working space for header encode */
++ int header_fill;
++
++ int e_o_s; /* set when we have buffered the last packet in the
++ logical bitstream */
++ int b_o_s; /* set after we've written the initial page
++ of a logical bitstream */
++ long serialno;
++ long pageno;
++ ogg_int64_t packetno; /* sequence number for decode; the framing
++ knows where there's a hole in the data,
++ but we need coupling so that the codec
++ (which is in a separate abstraction
++ layer) also knows about the gap */
++ ogg_int64_t granulepos;
++
++} ogg_stream_state;
++
++/* ogg_packet is used to encapsulate the data and metadata belonging
++ to a single raw Ogg/Vorbis packet *************************************/
++
++typedef struct {
++ unsigned char *packet;
++ long bytes;
++ long b_o_s;
++ long e_o_s;
++
++ ogg_int64_t granulepos;
++
++ ogg_int64_t packetno; /* sequence number for decode; the framing
++ knows where there's a hole in the data,
++ but we need coupling so that the codec
++ (which is in a separate abstraction
++ layer) also knows about the gap */
++} ogg_packet;
++
++typedef struct {
++ unsigned char *data;
++ int storage;
++ int fill;
++ int returned;
++
++ int unsynced;
++ int headerbytes;
++ int bodybytes;
++} ogg_sync_state;
++
++/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
++
++extern void oggpack_writeinit(oggpack_buffer *b);
++extern int oggpack_writecheck(oggpack_buffer *b);
++extern void oggpack_writetrunc(oggpack_buffer *b,long bits);
++extern void oggpack_writealign(oggpack_buffer *b);
++extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits);
++extern void oggpack_reset(oggpack_buffer *b);
++extern void oggpack_writeclear(oggpack_buffer *b);
++extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
++extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits);
++extern long oggpack_look(oggpack_buffer *b,int bits);
++extern long oggpack_look1(oggpack_buffer *b);
++extern void oggpack_adv(oggpack_buffer *b,int bits);
++extern void oggpack_adv1(oggpack_buffer *b);
++extern long oggpack_read(oggpack_buffer *b,int bits);
++extern long oggpack_read1(oggpack_buffer *b);
++extern long oggpack_bytes(oggpack_buffer *b);
++extern long oggpack_bits(oggpack_buffer *b);
++extern unsigned char *oggpack_get_buffer(oggpack_buffer *b);
++
++extern void oggpackB_writeinit(oggpack_buffer *b);
++extern int oggpackB_writecheck(oggpack_buffer *b);
++extern void oggpackB_writetrunc(oggpack_buffer *b,long bits);
++extern void oggpackB_writealign(oggpack_buffer *b);
++extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits);
++extern void oggpackB_reset(oggpack_buffer *b);
++extern void oggpackB_writeclear(oggpack_buffer *b);
++extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
++extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits);
++extern long oggpackB_look(oggpack_buffer *b,int bits);
++extern long oggpackB_look1(oggpack_buffer *b);
++extern void oggpackB_adv(oggpack_buffer *b,int bits);
++extern void oggpackB_adv1(oggpack_buffer *b);
++extern long oggpackB_read(oggpack_buffer *b,int bits);
++extern long oggpackB_read1(oggpack_buffer *b);
++extern long oggpackB_bytes(oggpack_buffer *b);
++extern long oggpackB_bits(oggpack_buffer *b);
++extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b);
++
++/* Ogg BITSTREAM PRIMITIVES: encoding **************************/
++
++extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op);
++extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov,
++ int count, long e_o_s, ogg_int64_t granulepos);
++extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og);
++extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill);
++extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og);
++
++/* Ogg BITSTREAM PRIMITIVES: decoding **************************/
++
++extern int ogg_sync_init(ogg_sync_state *oy);
++extern int ogg_sync_clear(ogg_sync_state *oy);
++extern int ogg_sync_reset(ogg_sync_state *oy);
++extern int ogg_sync_destroy(ogg_sync_state *oy);
++extern int ogg_sync_check(ogg_sync_state *oy);
++
++extern char *ogg_sync_buffer(ogg_sync_state *oy, long size);
++extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes);
++extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
++extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
++extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
++extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
++extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
++
++/* Ogg BITSTREAM PRIMITIVES: general ***************************/
++
++extern int ogg_stream_init(ogg_stream_state *os,int serialno);
++extern int ogg_stream_clear(ogg_stream_state *os);
++extern int ogg_stream_reset(ogg_stream_state *os);
++extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);
++extern int ogg_stream_destroy(ogg_stream_state *os);
++extern int ogg_stream_check(ogg_stream_state *os);
++extern int ogg_stream_eos(ogg_stream_state *os);
++
++extern void ogg_page_checksum_set(ogg_page *og);
++
++extern int ogg_page_version(const ogg_page *og);
++extern int ogg_page_continued(const ogg_page *og);
++extern int ogg_page_bos(const ogg_page *og);
++extern int ogg_page_eos(const ogg_page *og);
++extern ogg_int64_t ogg_page_granulepos(const ogg_page *og);
++extern int ogg_page_serialno(const ogg_page *og);
++extern long ogg_page_pageno(const ogg_page *og);
++extern int ogg_page_packets(const ogg_page *og);
++
++extern void ogg_packet_clear(ogg_packet *op);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _OGG_H */
+diff --git a/include/ogg/os_types.h b/include/ogg/os_types.h
+new file mode 100644
+index 0000000..4438b30
+--- /dev/null
++++ b/include/ogg/os_types.h
+@@ -0,0 +1,148 @@
++/********************************************************************
++ * *
++ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
++ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
++ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
++ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
++ * *
++ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
++ * by the Xiph.Org Foundation http://www.xiph.org/ *
++ * *
++ ********************************************************************
++
++ function: #ifdef jail to whip a few platforms into the UNIX ideal.
++ last mod: $Id: os_types.h 17566 2010-10-26 10:56:31Z xiphmont $
++
++ ********************************************************************/
++#ifndef _OS_TYPES_H
++#define _OS_TYPES_H
++
++/* make it easy on the folks that want to compile the libs with a
++ different malloc than stdlib */
++#define _ogg_malloc malloc
++#define _ogg_calloc calloc
++#define _ogg_realloc realloc
++#define _ogg_free free
++
++#if defined(_WIN32)
++
++# if defined(__CYGWIN__)
++# include <stdint.h>
++ typedef int16_t ogg_int16_t;
++ typedef uint16_t ogg_uint16_t;
++ typedef int32_t ogg_int32_t;
++ typedef uint32_t ogg_uint32_t;
++ typedef int64_t ogg_int64_t;
++ typedef uint64_t ogg_uint64_t;
++# elif defined(__MINGW32__)
++# include <sys/types.h>
++ typedef short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++ typedef int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long ogg_int64_t;
++ typedef unsigned long long ogg_uint64_t;
++# elif defined(__MWERKS__)
++ typedef long long ogg_int64_t;
++ typedef int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++# else
++ /* MSVC/Borland */
++ typedef unsigned __int64 ogg_uint64_t;
++ typedef __int64 ogg_int64_t;
++ typedef __int32 ogg_int32_t;
++ typedef unsigned __int32 ogg_uint32_t;
++ typedef __int16 ogg_int16_t;
++ typedef unsigned __int16 ogg_uint16_t;
++# endif
++
++#elif defined(__MACOS__)
++
++# include <sys/types.h>
++ typedef SInt16 ogg_int16_t;
++ typedef UInt16 ogg_uint16_t;
++ typedef SInt32 ogg_int32_t;
++ typedef UInt32 ogg_uint32_t;
++ typedef SInt64 ogg_int64_t;
++
++#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
++
++# include <inttypes.h>
++ typedef int16_t ogg_int16_t;
++ typedef u_int16_t ogg_uint16_t;
++ typedef int32_t ogg_int32_t;
++ typedef u_int32_t ogg_uint32_t;
++ typedef int64_t ogg_int64_t;
++
++#elif defined(__HAIKU__)
++
++ /* Haiku */
++# include <sys/types.h>
++ typedef short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++ typedef int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long ogg_int64_t;
++
++#elif defined(__BEOS__)
++
++ /* Be */
++# include <inttypes.h>
++ typedef int16_t ogg_int16_t;
++ typedef u_int16_t ogg_uint16_t;
++ typedef int32_t ogg_int32_t;
++ typedef u_int32_t ogg_uint32_t;
++ typedef int64_t ogg_int64_t;
++
++#elif defined (__EMX__)
++
++ /* OS/2 GCC */
++ typedef short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++ typedef int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long ogg_int64_t;
++
++#elif defined (DJGPP)
++
++ /* DJGPP */
++ typedef short ogg_int16_t;
++ typedef int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long ogg_int64_t;
++
++#elif defined(R5900)
++
++ /* PS2 EE */
++ typedef long ogg_int64_t;
++ typedef int ogg_int32_t;
++ typedef unsigned ogg_uint32_t;
++ typedef short ogg_int16_t;
++
++#elif defined(__SYMBIAN32__)
++
++ /* Symbian GCC */
++ typedef signed short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++ typedef signed int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long int ogg_int64_t;
++
++#elif defined(__TMS320C6X__)
++
++ /* TI C64x compiler */
++ typedef signed short ogg_int16_t;
++ typedef unsigned short ogg_uint16_t;
++ typedef signed int ogg_int32_t;
++ typedef unsigned int ogg_uint32_t;
++ typedef long long int ogg_int64_t;
++
++#else
++
++# include <ogg/config_types.h>
++
++#endif
++
++#endif /* _OS_TYPES_H */
+diff --git a/include/share/utf8.h b/include/share/utf8.h
+index 7d6650d..ebb3cbe 100644
+--- a/include/share/utf8.h
++++ b/include/share/utf8.h
+@@ -18,6 +18,9 @@
+ * 2 : input was invalid (but still converted, using '#')
+ * 3 : unknown encoding (but still converted, using '?')
+ */
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
+
+ int utf8_encode(const char *from, char **to);
+ int utf8_decode(const char *from, char **to);
+diff --git a/src/flac/analyze.c b/src/flac/analyze.c
+index 47a5e76..85cc9ad 100644
+--- a/src/flac/analyze.c
++++ b/src/flac/analyze.c
+@@ -27,6 +27,7 @@
+ #include <string.h>
+ #include "FLAC/all.h"
+ #include "analyze.h"
++#include <unicode_support.h>
+
+ typedef struct {
+ FLAC__int32 residual;
+@@ -218,7 +219,7 @@ FLAC__bool dump_stats(const subframe_stats_t *stats, const char *filename)
+ const double s1 = stats->stddev, s2 = s1*2, s3 = s1*3, s4 = s1*4, s5 = s1*5, s6 = s1*6;
+ const double p = stats->buckets[stats->peak_index].count;
+
+- outfile = fopen(filename, "w");
++ outfile = fopen_utf8(filename, "w");
+
+ if(0 == outfile) {
+ fprintf(stderr, "ERROR opening %s: %s\n", filename, strerror(errno));
+diff --git a/src/flac/decode.c b/src/flac/decode.c
+index 1e537c0..bb53bcb 100644
+--- a/src/flac/decode.c
++++ b/src/flac/decode.c
+@@ -41,6 +41,7 @@
+ #include "share/grabbag.h"
+ #include "share/replaygain_synthesis.h"
+ #include "decode.h"
++#include <unicode_support.h>
+
+ typedef struct {
+ #if FLAC__HAS_OGG
+@@ -331,7 +332,7 @@ FLAC__bool DecoderSession_construct(DecoderSession *d, FLAC__bool is_ogg, FLAC__
+ d->fout = grabbag__file_get_binary_stdout();
+ }
+ else {
+- if(0 == (d->fout = fopen(outfilename, "wb"))) {
++ if(0 == (d->fout = fopen_utf8(outfilename, "wb"))) {
+ flac__utils_printf(stderr, 1, "%s: ERROR: can't open output file %s: %s\n", d->inbasefilename, outfilename, strerror(errno));
+ DecoderSession_destroy(d, /*error_occurred=*/true);
+ return false;
+@@ -890,7 +891,7 @@ FLAC__bool write_sane_extended(FILE *f, unsigned val)
+ FLAC__bool fixup_iff_headers(DecoderSession *d)
+ {
+ const char *fmt_desc = (d->is_wave_out? "WAVE" : "AIFF");
+- FILE *f = fopen(d->outfilename, "r+b"); /* stream is positioned at beginning of file */
++ FILE *f = fopen_utf8(d->outfilename, "r+b"); /* stream is positioned at beginning of file */
+
+ if(0 == f) {
+ flac__utils_printf(stderr, 1, "ERROR, couldn't open file %s while fixing up %s chunk size: %s\n", d->outfilename, fmt_desc, strerror(errno));
+@@ -1376,5 +1377,7 @@ void print_stats(const DecoderSession *decoder_session)
+ (unsigned)decoder_session->samples_processed
+ );
+ }
++
++ fflush(stderr);
+ }
+ }
+diff --git a/src/flac/encode.c b/src/flac/encode.c
+index 8d24349..c8267c3 100644
+--- a/src/flac/encode.c
++++ b/src/flac/encode.c
+@@ -43,6 +43,7 @@
+ #include "share/alloc.h"
+ #include "share/grabbag.h"
+ #include "encode.h"
++#include <unicode_support.h>
+
+ #ifdef min
+ #undef min
+@@ -2611,7 +2612,7 @@ FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_
+ return false;
+ }
+
+- if(0 == (f = fopen(cuesheet_filename, "r"))) {
++ if(0 == (f = fopen_utf8(cuesheet_filename, "r"))) {
+ flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
+ return false;
+ }
+@@ -2666,6 +2667,8 @@ void print_stats(const EncoderSession *encoder_session)
+ else {
+ flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=%0.3f", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5), ratio);
+ }
++
++ fflush(stderr);
+ }
+
+ void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
+diff --git a/src/flac/flac.vcproj b/src/flac/flac.vcproj
+index 0680364..ca82678 100644
+--- a/src/flac/flac.vcproj
++++ b/src/flac/flac.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="flac"
+ ProjectGUID="{4cefbc7d-c215-11db-8314-0800200c9a66}"
+ RootNamespace="flac"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__HAS_OGG;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -208,6 +209,10 @@
+ >
+ </File>
+ <File
++ RelativePath=".\unicode_support.h"
++ >
++ </File>
++ <File
+ RelativePath=".\utils.h"
+ >
+ </File>
+@@ -246,6 +251,10 @@
+ >
+ </File>
+ <File
++ RelativePath=".\unicode_support.c"
++ >
++ </File>
++ <File
+ RelativePath=".\utils.c"
+ >
+ </File>
+diff --git a/src/flac/foreign_metadata.c b/src/flac/foreign_metadata.c
+index 3fc5310..88e7c28 100644
+--- a/src/flac/foreign_metadata.c
++++ b/src/flac/foreign_metadata.c
+@@ -34,6 +34,7 @@
+ #include "FLAC/metadata.h"
+ #include "share/alloc.h"
+ #include "foreign_metadata.h"
++#include <unicode_support.h>
+
+ #ifdef min
+ #undef min
+@@ -488,7 +489,7 @@ void flac__foreign_metadata_delete(foreign_metadata_t *fm)
+ FLAC__bool flac__foreign_metadata_read_from_aiff(foreign_metadata_t *fm, const char *filename, const char **error)
+ {
+ FLAC__bool ok;
+- FILE *f = fopen(filename, "rb");
++ FILE *f = fopen_utf8(filename, "rb");
+ if(!f) {
+ if(error) *error = "can't open AIFF file for reading (000)";
+ return false;
+@@ -501,7 +502,7 @@ FLAC__bool flac__foreign_metadata_read_from_aiff(foreign_metadata_t *fm, const c
+ FLAC__bool flac__foreign_metadata_read_from_wave(foreign_metadata_t *fm, const char *filename, const char **error)
+ {
+ FLAC__bool ok;
+- FILE *f = fopen(filename, "rb");
++ FILE *f = fopen_utf8(filename, "rb");
+ if(!f) {
+ if(error) *error = "can't open WAVE file for reading (000)";
+ return false;
+@@ -525,12 +526,12 @@ FLAC__bool flac__foreign_metadata_write_to_flac(foreign_metadata_t *fm, const ch
+ FLAC__metadata_simple_iterator_delete(it);
+ return false;
+ }
+- if(0 == (fin = fopen(infilename, "rb"))) {
++ if(0 == (fin = fopen_utf8(infilename, "rb"))) {
+ if(error) *error = "can't open WAVE/AIFF file for reading (002)";
+ FLAC__metadata_simple_iterator_delete(it);
+ return false;
+ }
+- if(0 == (fout = fopen(outfilename, "r+b"))) {
++ if(0 == (fout = fopen_utf8(outfilename, "r+b"))) {
+ if(error) *error = "can't open FLAC file for updating (003)";
+ FLAC__metadata_simple_iterator_delete(it);
+ fclose(fin);
+@@ -557,7 +558,7 @@ FLAC__bool flac__foreign_metadata_read_from_flac(foreign_metadata_t *fm, const c
+ FLAC__metadata_simple_iterator_delete(it);
+ return false;
+ }
+- if(0 == (f = fopen(filename, "rb"))) {
++ if(0 == (f = fopen_utf8(filename, "rb"))) {
+ if(error) *error = "can't open FLAC file for reading (002)";
+ FLAC__metadata_simple_iterator_delete(it);
+ return false;
+@@ -572,11 +573,11 @@ FLAC__bool flac__foreign_metadata_write_to_iff(foreign_metadata_t *fm, const cha
+ {
+ FLAC__bool ok;
+ FILE *fin, *fout;
+- if(0 == (fin = fopen(infilename, "rb"))) {
++ if(0 == (fin = fopen_utf8(infilename, "rb"))) {
+ if(error) *error = "can't open FLAC file for reading (000)";
+ return false;
+ }
+- if(0 == (fout = fopen(outfilename, "r+b"))) {
++ if(0 == (fout = fopen_utf8(outfilename, "r+b"))) {
+ if(error) *error = "can't open WAVE/AIFF file for updating (001)";
+ fclose(fin);
+ return false;
+diff --git a/src/flac/iffscan.c b/src/flac/iffscan.c
+index d03b65b..46d11ef 100644
+--- a/src/flac/iffscan.c
++++ b/src/flac/iffscan.c
+@@ -64,7 +64,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+ fn = argv[1];
+- if(0 == (f = fopen(fn, "rb")) || fread(buf, 1, 4, f) != 4) {
++ if(0 == (f = fopen_utf8(fn, "rb")) || fread(buf, 1, 4, f) != 4) {
+ fprintf(stderr, "ERROR opening %s for reading\n", fn);
+ return 1;
+ }
+@@ -85,7 +85,7 @@ int main(int argc, char *argv[])
+ return 1;
+ }
+ }
+- if(0 == (f = fopen(fn, "rb"))) {
++ if(0 == (f = fopen_utf8(fn, "rb"))) {
+ fprintf(stderr, "ERROR opening %s for reading\n", fn);
+ return 1;
+ }
+diff --git a/src/flac/iffscan.vcproj b/src/flac/iffscan.vcproj
+index 0651666..a2c5a58 100644
+--- a/src/flac/iffscan.vcproj
++++ b/src/flac/iffscan.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="iffscan"
+ ProjectGUID="{4cefbc94-c215-11db-8314-0800200c9a66}"
+ RootNamespace="iffscan"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__HAS_OGG;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/flac/main.c b/src/flac/main.c
+index f3716a8..b662978 100644
+--- a/src/flac/main.c
++++ b/src/flac/main.c
+@@ -28,6 +28,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <time.h>
++#include <unicode_support.h>
+
+ #if !defined _MSC_VER && !defined __MINGW32__
+ /* unlink is in stdio.h in VC++ */
+@@ -294,7 +295,7 @@ static FLAC__int32 *align_reservoir[2] = { align_reservoir_0, align_reservoir_1
+ static unsigned align_reservoir_samples = 0; /* 0 .. 587 */
+
+
+-int main(int argc, char *argv[])
++int flac_main(int argc, char *argv[])
+ {
+ int retval = 0;
+
+@@ -1642,7 +1643,7 @@ int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_
+ }
+ else {
+ infilesize = grabbag__file_get_filesize(infilename);
+- if(0 == (encode_infile = fopen(infilename, "rb"))) {
++ if(0 == (encode_infile = fopen_utf8(infilename, "rb"))) {
+ flac__utils_printf(stderr, 1, "ERROR: can't open input file %s: %s\n", infilename, strerror(errno));
+ return 1;
+ }
+@@ -2179,3 +2180,17 @@ FLAC__int64 local__strtoll(const char *src, char **endptr)
+ return neg? -ret : ret;
+ }
+ #endif
++
++int main(int __argc, char **__argv)
++{
++ int argc;
++ char **argv;
++ int exit_code;
++
++ init_commandline_arguments_utf8(&argc, &argv);
++ exit_code = flac_main(argc, argv);
++ free_commandline_arguments_utf8(&argc, &argv);
++
++ return exit_code;
++}
++
+diff --git a/src/flac/unicode_support.c b/src/flac/unicode_support.c
+new file mode 100644
+index 0000000..d823d9c
+--- /dev/null
++++ b/src/flac/unicode_support.c
+@@ -0,0 +1,87 @@
++#include "unicode_support.h"
++
++#include <windows.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i = 0;
++
++ if(*argv != NULL)
++ {
++ for(i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ free((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ free(*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
+diff --git a/src/flac/unicode_support.h b/src/flac/unicode_support.h
+new file mode 100644
+index 0000000..97d639e
+--- /dev/null
++++ b/src/flac/unicode_support.h
+@@ -0,0 +1,21 @@
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++char *utf16_to_utf8(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+\ No newline at end of file
+diff --git a/src/flac/vorbiscomment.c b/src/flac/vorbiscomment.c
+index 6b35a1e..83c93eb 100644
+--- a/src/flac/vorbiscomment.c
++++ b/src/flac/vorbiscomment.c
+@@ -29,7 +29,8 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+-
++#include <unicode_support.h>
++#include <Windows.h>
+
+ /*
+ * This struct and the following 4 static functions are copied from
+@@ -125,7 +126,7 @@ static FLAC__bool set_vc_field(FLAC__StreamMetadata *block, const Argument_VcFie
+ if(0 == (data = malloc(size+1)))
+ die("out of memory allocating tag value");
+ data[size] = '\0';
+- if(0 == (f = fopen(field->field_value, "rb")) || fread(data, 1, size, f) != (size_t)size) {
++ if(0 == (f = fopen_utf8(field->field_value, "rb")) || fread(data, 1, size, f) != (size_t)size) {
+ free(data);
+ if(f)
+ fclose(f);
+@@ -169,7 +170,7 @@ static FLAC__bool set_vc_field(FLAC__StreamMetadata *block, const Argument_VcFie
+ }
+ else {
+ FLAC__bool needs_free = false;
+- if(raw) {
++ if(true) {
+ entry.entry = (FLAC__byte *)field->field;
+ }
+ else if(utf8_encode(field->field, &converted) >= 0) {
+diff --git a/src/libFLAC++/libFLAC++_dynamic.vcproj b/src/libFLAC++/libFLAC++_dynamic.vcproj
+index 01aa2ea..6e5f413 100644
+--- a/src/libFLAC++/libFLAC++_dynamic.vcproj
++++ b/src/libFLAC++/libFLAC++_dynamic.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="libFLAC++_dynamic"
+ ProjectGUID="{4cefbc85-c215-11db-8314-0800200c9a66}"
+ RootNamespace="libFLAC++_dynamic"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -64,6 +65,8 @@
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="2"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -85,9 +88,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -122,6 +122,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FLACPP_API_EXPORTS"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -145,6 +147,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -166,9 +170,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/libFLAC++/libFLAC++_static.vcproj b/src/libFLAC++/libFLAC++_static.vcproj
+index 9d75223..06377a4 100644
+--- a/src/libFLAC++/libFLAC++_static.vcproj
++++ b/src/libFLAC++/libFLAC++_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="libFLAC++_static"
+ ProjectGUID="{4cefbc86-c215-11db-8314-0800200c9a66}"
+ RootNamespace="libFLAC++_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -110,6 +111,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/libFLAC/libFLAC_dynamic.vcproj b/src/libFLAC/libFLAC_dynamic.vcproj
+index f8163ab..ae77c10 100644
+--- a/src/libFLAC/libFLAC_dynamic.vcproj
++++ b/src/libFLAC/libFLAC_dynamic.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="libFLAC_dynamic"
+ ProjectGUID="{4cefbc83-c215-11db-8314-0800200c9a66}"
+ RootNamespace="libFLAC_dynamic"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FLAC_API_EXPORTS;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\"1.2.0\""
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -436,6 +437,7 @@
+ </File>
+ <File
+ RelativePath=".\release_static\BuildLog.htm"
++ DeploymentContent="true"
+ >
+ </File>
+ <File
+diff --git a/src/libFLAC/libFLAC_static.vcproj b/src/libFLAC/libFLAC_static.vcproj
+index cdc1531..cdaef02 100644
+--- a/src/libFLAC/libFLAC_static.vcproj
++++ b/src/libFLAC/libFLAC_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="libFLAC_static"
+ ProjectGUID="{4cefbc84-c215-11db-8314-0800200c9a66}"
+ RootNamespace="libFLAC_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -108,9 +109,11 @@
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\include;..\..\include"
+- PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\"1.2.0\";FLAC__NO_DLL"
++ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\"1.2.1\";FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -157,11 +160,11 @@
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+- RelativePath=".\include\protected\all.h"
++ RelativePath=".\include\private\all.h"
+ >
+ </File>
+ <File
+- RelativePath=".\include\private\all.h"
++ RelativePath=".\include\protected\all.h"
+ >
+ </File>
+ <File
+diff --git a/src/libFLAC/metadata_iterators.c b/src/libFLAC/metadata_iterators.c
+index 15362f7..3571214 100644
+--- a/src/libFLAC/metadata_iterators.c
++++ b/src/libFLAC/metadata_iterators.c
+@@ -438,10 +438,10 @@ static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *it
+
+ FLAC__ASSERT(0 != iterator);
+
+- if(read_only || 0 == (iterator->file = fopen(iterator->filename, "r+b"))) {
++ if(read_only || 0 == (iterator->file = fopen_utf8(iterator->filename, "r+b"))) {
+ iterator->is_writable = false;
+ if(read_only || errno == EACCES) {
+- if(0 == (iterator->file = fopen(iterator->filename, "rb"))) {
++ if(0 == (iterator->file = fopen_utf8(iterator->filename, "rb"))) {
+ iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
+ return false;
+ }
+@@ -1380,7 +1380,7 @@ static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain)
+
+ FLAC__ASSERT(0 != chain->filename);
+
+- if(0 == (file = fopen(chain->filename, "r+b"))) {
++ if(0 == (file = fopen_utf8(chain->filename, "r+b"))) {
+ chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
+ return false;
+ }
+@@ -1405,7 +1405,7 @@ static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *t
+ FLAC__ASSERT(0 != chain->head);
+
+ /* copy the file prefix (data up to first metadata block */
+- if(0 == (f = fopen(chain->filename, "rb"))) {
++ if(0 == (f = fopen_utf8(chain->filename, "rb"))) {
+ chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
+ return false;
+ }
+@@ -1542,7 +1542,7 @@ static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename,
+
+ chain->is_ogg = is_ogg;
+
+- if(0 == (file = fopen(filename, "rb"))) {
++ if(0 == (file = fopen_utf8(filename, "rb"))) {
+ chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
+ return false;
+ }
+@@ -3240,7 +3240,7 @@ FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix
+ strcat(*tempfilename, tempfile_suffix);
+ }
+
+- if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) {
++ if(0 == (*tempfile = fopen_utf8(*tempfilename, "w+b"))) {
+ *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
+ return false;
+ }
+diff --git a/src/libFLAC/stream_decoder.c b/src/libFLAC/stream_decoder.c
+index 4d86fda..1e02948 100644
+--- a/src/libFLAC/stream_decoder.c
++++ b/src/libFLAC/stream_decoder.c
+@@ -628,7 +628,7 @@ static FLAC__StreamDecoderInitStatus init_file_internal_(
+ if(0 == write_callback || 0 == error_callback)
+ return decoder->protected_->state = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS;
+
+- file = filename? fopen(filename, "rb") : stdin;
++ file = filename? fopen_utf8(filename, "rb") : stdin;
+
+ if(0 == file)
+ return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE;
+diff --git a/src/libFLAC/stream_encoder.c b/src/libFLAC/stream_encoder.c
+index 6d9859c..2c1f1ad 100644
+--- a/src/libFLAC/stream_encoder.c
++++ b/src/libFLAC/stream_encoder.c
+@@ -1283,7 +1283,7 @@ static FLAC__StreamEncoderInitStatus init_file_internal_(
+ if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+ return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED;
+
+- file = filename? fopen(filename, "w+b") : stdout;
++ file = filename? fopen_utf8(filename, "w+b") : stdout;
+
+ if(file == 0) {
+ encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR;
+diff --git a/src/metaflac/metaflac.vcproj b/src/metaflac/metaflac.vcproj
+index 6da60fe..e2acb7d 100644
+--- a/src/metaflac/metaflac.vcproj
++++ b/src/metaflac/metaflac.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="metaflac"
+ ProjectGUID="{4cefbc87-c215-11db-8314-0800200c9a66}"
+ RootNamespace="metaflac"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__HAS_OGG;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -242,6 +243,10 @@
+ >
+ </File>
+ <File
++ RelativePath="..\flac\unicode_support.c"
++ >
++ </File>
++ <File
+ RelativePath=".\usage.c"
+ >
+ </File>
+diff --git a/src/monkeys_audio_utilities/flac_mac/flac_mac.vcproj b/src/monkeys_audio_utilities/flac_mac/flac_mac.vcproj
+index cc65f83..78fcf25 100644
+--- a/src/monkeys_audio_utilities/flac_mac/flac_mac.vcproj
++++ b/src/monkeys_audio_utilities/flac_mac/flac_mac.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="flac_mac"
+ ProjectGUID="{4cefbc7e-c215-11db-8314-0800200c9a66}"
+ RootNamespace="flac_mac"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -65,6 +66,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -86,9 +89,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -122,6 +122,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -147,6 +149,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -168,9 +172,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/monkeys_audio_utilities/flac_ren/flac_ren.vcproj b/src/monkeys_audio_utilities/flac_ren/flac_ren.vcproj
+index e6f274e..711fb9a 100644
+--- a/src/monkeys_audio_utilities/flac_ren/flac_ren.vcproj
++++ b/src/monkeys_audio_utilities/flac_ren/flac_ren.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="flac_ren"
+ ProjectGUID="{4cefbc7f-c215-11db-8314-0800200c9a66}"
+ RootNamespace="flac_ren"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -65,6 +66,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -86,9 +89,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -122,6 +122,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -147,6 +149,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -168,9 +172,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/plugin_common/plugin_common_static.vcproj b/src/plugin_common/plugin_common_static.vcproj
+index ee64d25..13bf3af 100644
+--- a/src/plugin_common/plugin_common_static.vcproj
++++ b/src/plugin_common/plugin_common_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="plugin_common_static"
+ ProjectGUID="{4cefbc88-c215-11db-8314-0800200c9a66}"
+ RootNamespace="plugin_common_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/plugin_winamp2/in_flac.vcproj b/src/plugin_winamp2/in_flac.vcproj
+index 553451c..10439dc 100644
+--- a/src/plugin_winamp2/in_flac.vcproj
++++ b/src/plugin_winamp2/in_flac.vcproj
+@@ -1,10 +1,11 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="in_flac"
+ ProjectGUID="{4cefbc82-c215-11db-8314-0800200c9a66}"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;IN_FLAC_EXPORTS;FLAC__NO_DLL;VERSION=\"1.2.0\";TAGZ_UNICODE"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -152,6 +154,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -173,9 +177,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/share/getopt/getopt_static.vcproj b/src/share/getopt/getopt_static.vcproj
+index 028c82d..cd04394 100644
+--- a/src/share/getopt/getopt_static.vcproj
++++ b/src/share/getopt/getopt_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="getopt_static"
+ ProjectGUID="{4cefbc80-c215-11db-8314-0800200c9a66}"
+ RootNamespace="getopt_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/share/grabbag/grabbag_static.vcproj b/src/share/grabbag/grabbag_static.vcproj
+index f548202..2483383 100644
+--- a/src/share/grabbag/grabbag_static.vcproj
++++ b/src/share/grabbag/grabbag_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="grabbag_static"
+ ProjectGUID="{4cefbc81-c215-11db-8314-0800200c9a66}"
+ RootNamespace="grabbag_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/share/grabbag/picture.c b/src/share/grabbag/picture.c
+index 0e37273..aaeadfb 100644
+--- a/src/share/grabbag/picture.c
++++ b/src/share/grabbag/picture.c
+@@ -362,7 +362,7 @@ FLAC__StreamMetadata *grabbag__picture_parse_specification(const char *spec, con
+ if(0 == buffer)
+ *error_message = error_messages[0];
+ else {
+- FILE *f = fopen(spec, "rb");
++ FILE *f = fopen_utf8(spec, "rb");
+ if(0 == f)
+ *error_message = error_messages[5];
+ else {
+diff --git a/src/share/replaygain_analysis/replaygain_analysis_static.vcproj b/src/share/replaygain_analysis/replaygain_analysis_static.vcproj
+index a6ffda2..c6b677f 100644
+--- a/src/share/replaygain_analysis/replaygain_analysis_static.vcproj
++++ b/src/share/replaygain_analysis/replaygain_analysis_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="replaygain_analysis_static"
+ ProjectGUID="{4cefbc89-c215-11db-8314-0800200c9a66}"
+ RootNamespace="replaygain_analysis_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/share/replaygain_synthesis/replaygain_synthesis_static.vcproj b/src/share/replaygain_synthesis/replaygain_synthesis_static.vcproj
+index 627ab49..8e49a83 100644
+--- a/src/share/replaygain_synthesis/replaygain_synthesis_static.vcproj
++++ b/src/share/replaygain_synthesis/replaygain_synthesis_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="replaygain_synthesis_static"
+ ProjectGUID="{4cefbc8a-c215-11db-8314-0800200c9a66}"
+ RootNamespace="replaygain_synthesis_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/share/utf8/utf8.c b/src/share/utf8/utf8.c
+index 303fe23..79eeb7d 100644
+--- a/src/share/utf8/utf8.c
++++ b/src/share/utf8/utf8.c
+@@ -34,7 +34,6 @@
+ #include "utf8.h"
+ #include "charset.h"
+
+-
+ #ifdef _WIN32
+
+ /* Thanks to Peter Harris <peter.harris@hummingbird.com> for this win32
+diff --git a/src/share/utf8/utf8_static.vcproj b/src/share/utf8/utf8_static.vcproj
+index bcc8ca3..ee90ccc 100644
+--- a/src/share/utf8/utf8_static.vcproj
++++ b/src/share/utf8/utf8_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="utf8_static"
+ ProjectGUID="{4cefbc92-c215-11db-8314-0800200c9a66}"
+ RootNamespace="utf8_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/test_grabbag/cuesheet/test_cuesheet.vcproj b/src/test_grabbag/cuesheet/test_cuesheet.vcproj
+index e916bee..be37242 100644
+--- a/src/test_grabbag/cuesheet/test_cuesheet.vcproj
++++ b/src/test_grabbag/cuesheet/test_cuesheet.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_cuesheet"
+ ProjectGUID="{4cefbc8b-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_cuesheet"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -66,6 +67,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -87,9 +90,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -124,6 +124,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -149,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -170,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/test_grabbag/picture/test_picture.vcproj b/src/test_grabbag/picture/test_picture.vcproj
+index bd300ec..fc2800f 100644
+--- a/src/test_grabbag/picture/test_picture.vcproj
++++ b/src/test_grabbag/picture/test_picture.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_picture"
+ ProjectGUID="{4cefbc8f-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_picture"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -66,6 +67,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -87,9 +90,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -124,6 +124,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -149,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -170,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/test_libFLAC++/test_libFLAC++.vcproj b/src/test_libFLAC++/test_libFLAC++.vcproj
+index ed392ab..18451ac 100644
+--- a/src/test_libFLAC++/test_libFLAC++.vcproj
++++ b/src/test_libFLAC++/test_libFLAC++.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_libFLAC++"
+ ProjectGUID="{4cefbc8d-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_libFLAC++"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -66,6 +67,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -87,9 +90,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -124,6 +124,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -149,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -170,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/test_libFLAC/test_libFLAC.vcproj b/src/test_libFLAC/test_libFLAC.vcproj
+index 47988e7..d62611b 100644
+--- a/src/test_libFLAC/test_libFLAC.vcproj
++++ b/src/test_libFLAC/test_libFLAC.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_libFLAC"
+ ProjectGUID="{4cefbc8c-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_libFLAC"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/test_libs_common/test_libs_common_static.vcproj b/src/test_libs_common/test_libs_common_static.vcproj
+index b1c9074..9d960ea 100644
+--- a/src/test_libs_common/test_libs_common_static.vcproj
++++ b/src/test_libs_common/test_libs_common_static.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_libs_common_static"
+ ProjectGUID="{4cefbc8e-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_libs_common_static"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -111,6 +112,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+diff --git a/src/test_seeking/test_seeking.vcproj b/src/test_seeking/test_seeking.vcproj
+index b4cf8ec..428c845 100644
+--- a/src/test_seeking/test_seeking.vcproj
++++ b/src/test_seeking/test_seeking.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_seeking"
+ ProjectGUID="{4cefbc90-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_seeking"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -67,6 +68,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -88,9 +91,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -125,6 +125,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__HAS_OGG;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -151,6 +153,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -172,9 +176,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+diff --git a/src/test_streams/test_streams.vcproj b/src/test_streams/test_streams.vcproj
+index fec5fac..0988966 100644
+--- a/src/test_streams/test_streams.vcproj
++++ b/src/test_streams/test_streams.vcproj
+@@ -1,11 +1,12 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="8.00"
++ Version="9,00"
+ Name="test_streams"
+ ProjectGUID="{4cefbc91-c215-11db-8314-0800200c9a66}"
+ RootNamespace="test_streams"
+ Keyword="Win32Proj"
++ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+@@ -66,6 +67,8 @@
+ IgnoreDefaultLibraryNames="uuid.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -87,9 +90,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+@@ -124,6 +124,8 @@
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;FLAC__NO_DLL"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
++ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+@@ -149,6 +151,8 @@
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ LinkTimeCodeGeneration="1"
++ RandomizedBaseAddress="1"
++ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+@@ -170,9 +174,6 @@
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+- Name="VCWebDeploymentTool"
+- />
+- <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
--- /dev/null
+ Source/Console/Console.cpp | 1 +
+ Source/MACLib/Assembly/Assembly.obj | Bin 836 -> 836 bytes
+ 2 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/Source/Console/Console.cpp b/Source/Console/Console.cpp
+index 7d7c8c4..3a3179b 100644
+--- a/Source/Console/Console.cpp
++++ b/Source/Console/Console.cpp
+@@ -63,6 +63,7 @@ void CALLBACK ProgressCallback(int nPercentageDone)
+ // output the progress
+ _ftprintf(stderr, _T("Progress: %.1f%% (%.1f seconds remaining, %.1f seconds total) \r"),
+ dProgress * 100, dRemaining, dElapsed);
++ fflush(stderr);
+ }
+
+ /***************************************************************************************
+diff --git a/Source/MACLib/Assembly/Assembly.obj b/Source/MACLib/Assembly/Assembly.obj
+index b38feba..2289e97 100644
+Binary files a/Source/MACLib/Assembly/Assembly.obj and b/Source/MACLib/Assembly/Assembly.obj differ
--- /dev/null
+ common/unicode_support.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
+ common/unicode_support.h | 21 +++++++++++
+ libmpcdec/mpc_reader.c | 3 +-
+ mpcdec/mpcdec.c | 49 ++++++++++++++++++++++++--
+ win32/libcommon.vcproj | 11 +++++-
+ win32/libmpcdec.vcproj | 3 +-
+ win32/mpcenc.vcproj | 3 +-
+ win32/musepack.sln | 53 ++++++++-------------------
+ 8 files changed, 185 insertions(+), 45 deletions(-)
+
+diff --git a/common/unicode_support.c b/common/unicode_support.c
+new file mode 100644
+index 0000000..d823d9c
+--- /dev/null
++++ b/common/unicode_support.c
+@@ -0,0 +1,87 @@
++#include "unicode_support.h"
++
++#include <windows.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize, Result;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i = 0;
++
++ if(*argv != NULL)
++ {
++ for(i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ free((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ free(*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
+diff --git a/common/unicode_support.h b/common/unicode_support.h
+new file mode 100644
+index 0000000..97d639e
+--- /dev/null
++++ b/common/unicode_support.h
+@@ -0,0 +1,21 @@
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++char *utf16_to_utf8(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+\ No newline at end of file
+diff --git a/libmpcdec/mpc_reader.c b/libmpcdec/mpc_reader.c
+index 06aa49e..f59ffd4 100644
+--- a/libmpcdec/mpc_reader.c
++++ b/libmpcdec/mpc_reader.c
+@@ -36,6 +36,7 @@
+ #include <mpc/reader.h>
+ #include "internal.h"
+ #include <stdio.h>
++#include "../common/unicode_support.h"
+
+ #define STDIO_MAGIC 0xF34B963C ///< Just a random safe-check value...
+ typedef struct mpc_reader_stdio_t {
+@@ -127,7 +128,7 @@ clean:
+ mpc_status
+ mpc_reader_init_stdio(mpc_reader *p_reader, const char *filename)
+ {
+- FILE * stream = fopen(filename, "rb");
++ FILE * stream = fopen_utf8(filename, "rb");
+ if (stream == NULL) return MPC_STATUS_FAIL;
+ return mpc_reader_init_stdio_stream(p_reader,stream);
+ }
+diff --git a/mpcdec/mpcdec.c b/mpcdec/mpcdec.c
+index b60483f..8fdb34b 100644
+--- a/mpcdec/mpcdec.c
++++ b/mpcdec/mpcdec.c
+@@ -37,8 +37,10 @@
+ #include <mpc/mpcdec.h>
+ #include "../libmpcdec/decoder.h"
+ #include "../libmpcdec/internal.h"
++#include "../common/unicode_support.h"
+ #include <libwaveformat.h>
+ #include <getopt.h>
++#include <string.h>
+
+ #ifdef _MSC_VER
+ #include <crtdbg.h>
+@@ -114,7 +116,7 @@ usage(const char *exename)
+ }
+
+ int
+-main(int argc, char **argv)
++mpcdec_main(int argc, char **argv)
+ {
+ mpc_reader reader;
+ mpc_demux* demux;
+@@ -122,12 +124,13 @@ main(int argc, char **argv)
+ mpc_status err;
+ mpc_bool_t info = MPC_FALSE, is_wav_output = MPC_FALSE, check = MPC_FALSE;
+ MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH];
+- clock_t begin, end, sum; int total_samples; t_wav_output_file wav_output;
++ clock_t begin, end, sum; int total_samples, max_samples; t_wav_output_file wav_output;
++ mpc_bool_t verbose_output = MPC_FALSE;
+ int c;
+
+ fprintf(stderr, About);
+
+- while ((c = getopt(argc , argv, "ihc")) != -1) {
++ while ((c = getopt(argc , argv, "ihcv")) != -1) {
+ switch (c) {
+ case 'i':
+ info = MPC_TRUE;
+@@ -135,6 +138,9 @@ main(int argc, char **argv)
+ case 'c':
+ check = MPC_TRUE;
+ break;
++ case 'v':
++ verbose_output = MPC_TRUE;
++ break;
+ case 'h':
+ usage(argv[0]);
+ return 0;
+@@ -177,13 +183,15 @@ main(int argc, char **argv)
+ SET_BINARY_MODE(stdout);
+ wavo_fc.m_user_data = stdout;
+ } else
+- wavo_fc.m_user_data = fopen(argv[optind + 1], "wb");
++ wavo_fc.m_user_data = fopen_utf8(argv[optind + 1], "wb");
+ if(!wavo_fc.m_user_data) return !MPC_STATUS_OK;
+ err = waveformat_output_open(&wav_output, wavo_fc, si.channels, 16, 0, si.sample_freq, (t_wav_uint32) si.samples * si.channels);
+ if(!err) return !MPC_STATUS_OK;
+ }
+
+ sum = total_samples = 0;
++ max_samples = (int) mpc_streaminfo_get_length_samples(&si);
++
+ while(MPC_TRUE)
+ {
+ mpc_frame_info frame;
+@@ -199,6 +207,12 @@ main(int argc, char **argv)
+ total_samples += frame.samples;
+ sum += end - begin;
+
++ if(verbose_output)
++ {
++ fprintf(stderr, "Decoding progress: %3.1f%%\r", (((float)total_samples) / ((float)max_samples)) * 100.0f);
++ fflush(stderr);
++ }
++
+ if(is_wav_output) {
+ #ifdef MPC_FIXED_POINT
+ mpc_int16_t tmp_buff[MPC_DECODER_BUFFER_LENGTH];
+@@ -217,6 +231,19 @@ main(int argc, char **argv)
+ }
+ }
+
++ if(verbose_output)
++ {
++ if(err == MPC_STATUS_OK)
++ {
++ fprintf(stderr, "Decoding progress: %3.1f%%\n", 100.0f);
++ }
++ else
++ {
++ fprintf(stderr, "\n");
++ }
++ fflush(stderr);
++ }
++
+ if (err != MPC_STATUS_OK)
+ fprintf(stderr, "An error occured while decoding\n");
+ else if (check)
+@@ -247,3 +274,17 @@ main(int argc, char **argv)
+ #endif
+ return err;
+ }
++
++int
++main(int __argc, char **__argv)
++{
++ int argc;
++ char **argv;
++ int exit_code;
++
++ init_commandline_arguments_utf8(&argc, &argv);
++ exit_code = mpcdec_main(argc, argv);
++ free_commandline_arguments_utf8(&argc, &argv);
++
++ return exit_code;
++}
+diff --git a/win32/libcommon.vcproj b/win32/libcommon.vcproj
+index 0acf049..567671a 100644
+--- a/win32/libcommon.vcproj
++++ b/win32/libcommon.vcproj
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="9.00"
++ Version="9,00"
+ Name="libcommon"
+ ProjectGUID="{49A26D14-0AD0-497E-A982-42BFD4D992FC}"
+ RootNamespace="libcommon"
+@@ -112,6 +112,7 @@
+ ExceptionHandling="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ FloatingPointModel="2"
+ WarningLevel="3"
+ CompileAs="1"
+@@ -170,6 +171,10 @@
+ RelativePath="..\common\tags.c"
+ >
+ </File>
++ <File
++ RelativePath="..\common\unicode_support.c"
++ >
++ </File>
+ </Filter>
+ <Filter
+ Name="headers"
+@@ -178,6 +183,10 @@
+ RelativePath=".\getopt.h"
+ >
+ </File>
++ <File
++ RelativePath="..\common\unicode_support.h"
++ >
++ </File>
+ </Filter>
+ </Files>
+ <Globals>
+diff --git a/win32/libmpcdec.vcproj b/win32/libmpcdec.vcproj
+index 16db2c3..3abf055 100644
+--- a/win32/libmpcdec.vcproj
++++ b/win32/libmpcdec.vcproj
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="9.00"
++ Version="9,00"
+ Name="libmpcdec"
+ ProjectGUID="{4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}"
+ RootNamespace="libmpcdec"
+@@ -113,6 +113,7 @@
+ ExceptionHandling="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ FloatingPointModel="2"
+ WarningLevel="3"
+ CompileAs="1"
+diff --git a/win32/mpcenc.vcproj b/win32/mpcenc.vcproj
+index fe03c93..7193e4f 100644
+--- a/win32/mpcenc.vcproj
++++ b/win32/mpcenc.vcproj
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+- Version="9.00"
++ Version="9,00"
+ Name="mpcenc"
+ ProjectGUID="{15082E34-9324-469F-8423-F995B4814A37}"
+ RootNamespace="mppenc"
+@@ -128,6 +128,7 @@
+ ExceptionHandling="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
++ EnableEnhancedInstructionSet="0"
+ FloatingPointModel="2"
+ WarningLevel="3"
+ CompileAs="1"
+diff --git a/win32/musepack.sln b/win32/musepack.sln
+index 35729b4..1a04a6f 100644
+--- a/win32/musepack.sln
++++ b/win32/musepack.sln
+@@ -1,53 +1,38 @@
+
+-Microsoft Visual Studio Solution File, Format Version 10.00
+-# Visual Studio 2008
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcenc", "mpcenc.vcproj", "{15082E34-9324-469F-8423-F995B4814A37}"
+- ProjectSection(ProjectDependencies) = postProject
+- {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
+- {7CF31624-B40E-466F-9107-785816C787C4} = {7CF31624-B40E-466F-9107-785816C787C4}
+- {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96} = {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96}
+- EndProjectSection
++Microsoft Visual Studio Solution File, Format Version 11.00
++# Visual Studio 2010
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcenc", "mpcenc.vcxproj", "{15082E34-9324-469F-8423-F995B4814A37}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcommon", "libcommon.vcproj", "{49A26D14-0AD0-497E-A982-42BFD4D992FC}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcommon", "libcommon.vcxproj", "{49A26D14-0AD0-497E-A982-42BFD4D992FC}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcpsy", "libmpcpsy.vcproj", "{7CF31624-B40E-466F-9107-785816C787C4}"
+-EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcenc", "libmpcenc.vcproj", "{44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96}"
+-EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcdec", "mpcdec.vcproj", "{A527175B-22A9-41AB-B2E8-580F573CCAFB}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcpsy", "libmpcpsy.vcxproj", "{7CF31624-B40E-466F-9107-785816C787C4}"
+ ProjectSection(ProjectDependencies) = postProject
+ {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
+- {13D176A2-B6BB-403F-A816-AA1F388078B7} = {13D176A2-B6BB-403F-A816-AA1F388078B7}
+- {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3} = {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}
+ EndProjectSection
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpccut", "mpccut.vcproj", "{ABBF9DD7-650F-48A8-9810-B76F233520F3}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcenc", "libmpcenc.vcxproj", "{44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96}"
+ ProjectSection(ProjectDependencies) = postProject
+- {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96} = {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96}
+ {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
+- {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3} = {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}
+ EndProjectSection
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpc2sv8", "mpc2sv8.vcproj", "{36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}"
+- ProjectSection(ProjectDependencies) = postProject
+- {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
+- {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96} = {44EC1266-D2EE-47B8-ACFC-8BD52E7FFF96}
+- {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3} = {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}
+- EndProjectSection
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcdec", "mpcdec.vcxproj", "{A527175B-22A9-41AB-B2E8-580F573CCAFB}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcdec", "libmpcdec.vcproj", "{4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpccut", "mpccut.vcxproj", "{ABBF9DD7-650F-48A8-9810-B76F233520F3}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libwavformat", "libwavformat.vcproj", "{13D176A2-B6BB-403F-A816-AA1F388078B7}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpc2sv8", "mpc2sv8.vcxproj", "{36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}"
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libreplaygain", "..\..\..\libreplaygain\libreplaygain.vcproj", "{CB7A02E8-393A-481B-BD18-E7D041D8C6B1}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpcdec", "libmpcdec.vcxproj", "{4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}"
++ ProjectSection(ProjectDependencies) = postProject
++ {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
++ EndProjectSection
+ EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcgain", "mpcgain.vcproj", "{76CBB7D4-0524-4569-9150-34BDE4235D04}"
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libwavformat", "libwavformat.vcxproj", "{13D176A2-B6BB-403F-A816-AA1F388078B7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {49A26D14-0AD0-497E-A982-42BFD4D992FC} = {49A26D14-0AD0-497E-A982-42BFD4D992FC}
+- {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3} = {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}
+- {CB7A02E8-393A-481B-BD18-E7D041D8C6B1} = {CB7A02E8-393A-481B-BD18-E7D041D8C6B1}
+ EndProjectSection
+ EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpcgain", "mpcgain.vcxproj", "{76CBB7D4-0524-4569-9150-34BDE4235D04}"
++EndProject
+ Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+@@ -81,7 +66,6 @@ Global
+ {36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}.Debug|Win32.Build.0 = Debug|Win32
+ {36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}.Release|Win32.ActiveCfg = Release|Win32
+- {36225C6A-FFA3-4E70-928E-1F69F7A3FCE1}.Release|Win32.Build.0 = Release|Win32
+ {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}.Debug|Win32.Build.0 = Debug|Win32
+ {4C5362CD-0BF2-4B3B-971B-8293EB1A1DC3}.Release|Win32.ActiveCfg = Release|Win32
+@@ -90,14 +74,9 @@ Global
+ {13D176A2-B6BB-403F-A816-AA1F388078B7}.Debug|Win32.Build.0 = Debug|Win32
+ {13D176A2-B6BB-403F-A816-AA1F388078B7}.Release|Win32.ActiveCfg = Release|Win32
+ {13D176A2-B6BB-403F-A816-AA1F388078B7}.Release|Win32.Build.0 = Release|Win32
+- {CB7A02E8-393A-481B-BD18-E7D041D8C6B1}.Debug|Win32.ActiveCfg = Debug|Win32
+- {CB7A02E8-393A-481B-BD18-E7D041D8C6B1}.Debug|Win32.Build.0 = Debug|Win32
+- {CB7A02E8-393A-481B-BD18-E7D041D8C6B1}.Release|Win32.ActiveCfg = Release|Win32
+- {CB7A02E8-393A-481B-BD18-E7D041D8C6B1}.Release|Win32.Build.0 = Release|Win32
+ {76CBB7D4-0524-4569-9150-34BDE4235D04}.Debug|Win32.ActiveCfg = Debug|Win32
+ {76CBB7D4-0524-4569-9150-34BDE4235D04}.Debug|Win32.Build.0 = Debug|Win32
+ {76CBB7D4-0524-4569-9150-34BDE4235D04}.Release|Win32.ActiveCfg = Release|Win32
+- {76CBB7D4-0524-4569-9150-34BDE4235D04}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
--- /dev/null
+ src/8svx.c | 3 +-
+ src/adpcm.c | 1 +
+ src/effects_i.c | 3 +-
+ src/formats.c | 9 ++-
+ src/libsox.c | 2 +
+ src/libsox_i.c | 7 +-
+ src/noiseprof.c | 3 +-
+ src/sox.c | 33 ++++++++---
+ src/unicode_support.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/unicode_support.h | 16 +++++
+ src/util.h | 5 ++
+ 11 files changed, 211 insertions(+), 19 deletions(-)
+
+diff --git a/src/8svx.c b/src/8svx.c
+index 63c30e6..fd712f4 100644
+--- a/src/8svx.c
++++ b/src/8svx.c
+@@ -1,6 +1,7 @@
+ /* Amiga 8SVX format handler: W V Neisius, February 1992 */
+
+ #include "sox_i.h"
++#include "unicode_support.h"
+
+ #include <errno.h>
+ #include <string.h>
+@@ -161,7 +162,7 @@ static int startread(sox_format_t * ft)
+ chan1_pos = lsx_tell(ft);
+
+ for (i = 1; i < channels; i++) {
+- if ((p->ch[i] = fopen(ft->filename, "rb")) == NULL)
++ if ((p->ch[i] = fopen_utf8(ft->filename, "rb")) == NULL)
+ {
+ lsx_fail_errno(ft,errno,"Can't open channel file '%s'",
+ ft->filename);
+diff --git a/src/adpcm.c b/src/adpcm.c
+index 2e13867..15c27c2 100644
+--- a/src/adpcm.c
++++ b/src/adpcm.c
+@@ -33,6 +33,7 @@
+
+ #include "sox_i.h"
+ #include "adpcm.h"
++#include "unicode_support.h"
+
+ #include <sys/types.h>
+ #include <stdio.h>
+diff --git a/src/effects_i.c b/src/effects_i.c
+index 7d72166..65d6a0b 100644
+--- a/src/effects_i.c
++++ b/src/effects_i.c
+@@ -20,6 +20,7 @@
+
+ #define LSX_EFF_ALIAS
+ #include "sox_i.h"
++#include "unicode_support.h"
+ #include <string.h>
+ #include <ctype.h>
+
+@@ -355,7 +356,7 @@ FILE * lsx_open_input_file(sox_effect_t * effp, char const * filename)
+ effp->global_info->global_info->stdin_in_use_by = effp->handler.name;
+ file = stdin;
+ }
+- else if (!(file = fopen(filename, "r"))) {
++ else if (!(file = fopen_utf8(filename, "r"))) {
+ lsx_fail("couldn't open file %s: %s", filename, strerror(errno));
+ return NULL;
+ }
+diff --git a/src/formats.c b/src/formats.c
+index cac686c..1baa213 100644
+--- a/src/formats.c
++++ b/src/formats.c
+@@ -19,6 +19,7 @@
+ */
+
+ #include "sox_i.h"
++#include "unicode_support.h"
+
+ #include <assert.h>
+ #include <ctype.h>
+@@ -396,7 +397,7 @@ static FILE * xfopen(char const * identifier, char const * mode, lsx_io_type * i
+ #endif
+ return f;
+ }
+- return fopen(identifier, mode);
++ return fopen_utf8(identifier, mode);
+ }
+
+ /* Hack to rewind pipes (a small amount).
+@@ -847,8 +848,8 @@ static sox_format_t * open_write(
+ ft->fp = stdout;
+ }
+ else {
+- struct stat st;
+- if (!stat(path, &st) && (st.st_mode & S_IFMT) == S_IFREG &&
++ struct _stat st;
++ if (!stat_utf8(path, &st) && (st.st_mode & S_IFMT) == S_IFREG &&
+ (overwrite_permitted && !overwrite_permitted(path))) {
+ lsx_fail("permission to overwrite `%s' denied", path);
+ goto error;
+@@ -858,7 +859,7 @@ static sox_format_t * open_write(
+ buffer? fmemopen(buffer, buffer_size, "w+b") :
+ buffer_ptr? open_memstream(buffer_ptr, buffer_size_ptr) :
+ #endif
+- fopen(path, "w+b");
++ fopen_utf8(path, "w+b");
+ if (ft->fp == NULL) {
+ lsx_fail("can't open output file `%s': %s", path, strerror(errno));
+ goto error;
+diff --git a/src/libsox.c b/src/libsox.c
+index 75354e4..a766aa9 100644
+--- a/src/libsox.c
++++ b/src/libsox.c
+@@ -19,6 +19,8 @@
+ */
+
+ #include "sox_i.h"
++#include "unicode_support.h"
++
+ #include <string.h>
+
+ const char *sox_version(void)
+diff --git a/src/libsox_i.c b/src/libsox_i.c
+index 8a7074a..b498cc0 100644
+--- a/src/libsox_i.c
++++ b/src/libsox_i.c
+@@ -20,6 +20,7 @@
+
+
+ #include "sox_i.h"
++#include "unicode_support.h"
+
+ #ifdef HAVE_IO_H
+ #include <io.h>
+@@ -48,8 +49,8 @@
+ #ifdef WIN32
+ static int check_dir(char * buf, size_t buflen, char const * name)
+ {
+- struct stat st;
+- if (!name || stat(name, &st) || (st.st_mode & S_IFMT) != S_IFDIR)
++ struct _stat st;
++ if (!name || stat_utf8(name, &st) || (st.st_mode & S_IFMT) != S_IFDIR)
+ {
+ return 0;
+ }
+@@ -102,7 +103,7 @@ FILE * lsx_tmpfile(void)
+ fildes = mkstemp(name);
+ #ifdef HAVE_UNISTD_H
+ lsx_debug(FAKE_MKSTEMP "mkstemp, name=%s (unlinked)", name);
+- unlink(name);
++ unlink_utf8(name);
+ #else
+ lsx_debug(FAKE_MKSTEMP "mkstemp, name=%s (O_TEMPORARY)", name);
+ #endif
+diff --git a/src/noiseprof.c b/src/noiseprof.c
+index 603402f..d46c280 100644
+--- a/src/noiseprof.c
++++ b/src/noiseprof.c
+@@ -19,6 +19,7 @@
+ */
+
+ #include "noisered.h"
++#include "unicode_support.h"
+
+ #include <assert.h>
+ #include <string.h>
+@@ -75,7 +76,7 @@ static int sox_noiseprof_start(sox_effect_t * effp)
+ effp->global_info->global_info->stdout_in_use_by = effp->handler.name;
+ data->output_file = stdout;
+ }
+- else if ((data->output_file = fopen(data->output_filename, "w")) == NULL) {
++ else if ((data->output_file = fopen_utf8(data->output_filename, "w")) == NULL) {
+ lsx_fail("Couldn't open profile file %s: %s", data->output_filename, strerror(errno));
+ return SOX_EOF;
+ }
+diff --git a/src/sox.c b/src/sox.c
+index 665149b..da43424 100644
+--- a/src/sox.c
++++ b/src/sox.c
+@@ -24,6 +24,7 @@
+ #include "soxconfig.h"
+ #include "sox.h"
+ #include "util.h"
++#include "unicode_support.h"
+
+ #include <ctype.h>
+ #include <errno.h>
+@@ -236,12 +237,12 @@ static void cleanup(void)
+ if (file_count) {
+ if (ofile->ft) {
+ if (!success && ofile->ft->fp) { /* If we failed part way through */
+- struct stat st; /* writing a normal file, remove it. */
+- if (!stat(ofile->ft->filename, &st) &&
++ struct _stat st; /* writing a normal file, remove it. */
++ if (!stat_utf8(ofile->ft->filename, &st) &&
+ (st.st_mode & S_IFMT) == S_IFREG)
+- unlink(ofile->ft->filename);
++ unlink_utf8(ofile->ft->filename);
+ }
+- sox_close(ofile->ft); /* Assume we can unlink a file before closing it. */
++ sox_close(ofile->ft); /* Assume we can unlink_utf8 a file before closing it. */
+ }
+ free(ofile->filename);
+ free(ofile);
+@@ -293,8 +294,8 @@ static char const * str_time(double seconds)
+
+ static char const * size_and_bitrate(sox_format_t * ft, char const * * text)
+ {
+- struct stat st; /* ft->fp may validly be NULL, so stat not fstat */
+- if (stat(ft->filename, &st) || (st.st_mode & S_IFMT) != S_IFREG)
++ struct _stat st; /* ft->fp may validly be NULL, so stat not fstat */
++ if (stat_utf8(ft->filename, &st) || (st.st_mode & S_IFMT) != S_IFREG)
+ return NULL;
+ if (ft->signal.length && ft->signal.channels && ft->signal.rate && text) {
+ double secs = ft->signal.length / ft->signal.channels / ft->signal.rate;
+@@ -906,7 +907,7 @@ static char * * strtoargv(char * s, int * argc)
+
+ static void read_user_effects(char const *filename)
+ {
+- FILE *file = fopen(filename, "rt");
++ FILE *file = fopen_utf8(filename, "rt");
+ const size_t buffer_size_step = 1024;
+ size_t buffer_size = buffer_size_step;
+ char *s = lsx_malloc(buffer_size); /* buffer for one input line */
+@@ -1269,6 +1270,7 @@ static void display_status(sox_bool all_done)
+ lsx_sigfigs3((double)output_samples),
+ vu(0), vu(1), headroom(), lsx_sigfigs3((double)total_clips()));
+ }
++ fflush(stderr);
+ if (all_done)
+ fputc('\n', stderr);
+ }
+@@ -2123,7 +2125,7 @@ static void read_comment_file(sox_comments_t * comments, char const * const file
+ int c;
+ size_t text_length = 100;
+ char * text = lsx_malloc(text_length + 1);
+- FILE * file = fopen(filename, "rt");
++ FILE * file = fopen_utf8(filename, "rt");
+
+ if (file == NULL) {
+ lsx_fail("Cannot open comment file `%s'", filename);
+@@ -2830,7 +2832,7 @@ static sox_bool cmp_comment_text(char const * c1, char const * c2)
+ return c1 && c2 && !strcasecmp(c1, c2);
+ }
+
+-int main(int argc, char **argv)
++static int sox_main(int argc, char **argv)
+ {
+ size_t i;
+ char mybase[6];
+@@ -3032,3 +3034,16 @@ int main(int argc, char **argv)
+
+ return 0;
+ }
++
++int main( int argc, char **argv )
++{
++ int sox_argc;
++ char **sox_argv;
++ int exit_code;
++
++ init_commandline_arguments_utf8(&sox_argc, &sox_argv);
++ exit_code = sox_main(sox_argc, sox_argv);
++ free_commandline_arguments_utf8(&sox_argc, &sox_argv);
++
++ return exit_code;
++}
+diff --git a/src/unicode_support.c b/src/unicode_support.c
+new file mode 100644
+index 0000000..e0cbbc9
+--- /dev/null
++++ b/src/unicode_support.c
+@@ -0,0 +1,148 @@
++#include "unicode_support.h"
++
++#include <windows.h>
++#include <io.h>
++
++char *utf16_to_utf8(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++char *utf16_to_ansi(const wchar_t *input)
++{
++ char *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = WideCharToMultiByte(CP_ACP, 0, input, -1, NULL, 0, NULL, NULL);
++ Buffer = (char*) malloc(sizeof(char) * BuffSize);
++ if(Buffer)
++ {
++ Result = WideCharToMultiByte(CP_ACP, 0, input, -1, Buffer, BuffSize, NULL, NULL);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++wchar_t *utf8_to_utf16(const char *input)
++{
++ wchar_t *Buffer;
++ int BuffSize = 0, Result = 0;
++
++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
++ if(Buffer)
++ {
++ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
++ }
++
++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
++}
++
++void init_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i, nArgs;
++ LPWSTR *szArglist;
++
++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
++
++ if(NULL == szArglist)
++ {
++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n");
++ exit(-1);
++ }
++
++ *argv = (char**) malloc(sizeof(char*) * nArgs);
++ *argc = nArgs;
++
++ if(NULL == *argv)
++ {
++ fprintf(stderr, "\nFATAL: Malloc failed\n\n");
++ exit(-1);
++ }
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = utf16_to_utf8(szArglist[i]);
++ if(NULL == (*argv)[i])
++ {
++ fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n");
++ exit(-1);
++ }
++ }
++
++ LocalFree(szArglist);
++}
++
++void free_commandline_arguments_utf8(int *argc, char ***argv)
++{
++ int i = 0;
++
++ if(*argv != NULL)
++ {
++ for(i = 0; i < *argc; i++)
++ {
++ if((*argv)[i] != NULL)
++ {
++ free((*argv)[i]);
++ (*argv)[i] = NULL;
++ }
++ }
++ free(*argv);
++ *argv = NULL;
++ }
++}
++
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
++{
++ FILE *ret = NULL;
++ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
++ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
++
++ if(filename_utf16 && mode_utf16)
++ {
++ ret = _wfopen(filename_utf16, mode_utf16);
++ }
++
++ if(filename_utf16) free(filename_utf16);
++ if(mode_utf16) free(mode_utf16);
++
++ return ret;
++}
++
++int stat_utf8(const char *path_utf8, struct _stat *buf)
++{
++ int ret = -1;
++
++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8);
++ if(path_utf16)
++ {
++ ret = _wstat(path_utf16, buf);
++ free(path_utf16);
++ }
++
++ return ret;
++}
++
++int unlink_utf8(const char *path_utf8)
++{
++ int ret = -1;
++
++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8);
++ if(path_utf16)
++ {
++ ret = _wunlink(path_utf16);
++ free(path_utf16);
++ }
++
++ return ret;
++}
+diff --git a/src/unicode_support.h b/src/unicode_support.h
+new file mode 100644
+index 0000000..6775e00
+--- /dev/null
++++ b/src/unicode_support.h
+@@ -0,0 +1,16 @@
++#ifndef UNICODE_SUPPORT_H_INCLUDED
++#define UNICODE_SUPPORT_H_INCLUDED
++
++#include <stdio.h>
++#include <sys/stat.h>
++
++char *utf16_to_utf8(const wchar_t *input);
++char *utf16_to_ansi(const wchar_t *input);
++wchar_t *utf8_to_utf16(const char *input);
++void init_commandline_arguments_utf8(int *argc, char ***argv);
++void free_commandline_arguments_utf8(int *argc, char ***argv);
++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
++int stat_utf8(const char *path_utf8, struct _stat *buf);
++int unlink_utf8(const char *path_utf8);
++
++#endif
+\ No newline at end of file
+diff --git a/src/util.h b/src/util.h
+index f10b676..4a835f0 100644
+--- a/src/util.h
++++ b/src/util.h
+@@ -91,6 +91,10 @@
+
+ #ifdef _MSC_VER
+
++#define inline __inline
++#define snprintf _snprintf
++
++/*
+ #define __STDC__ 1
+ #define O_BINARY _O_BINARY
+ #define O_CREAT _O_CREAT
+@@ -141,6 +145,7 @@
+ #define off_t __int64
+ #define HAVE_FSEEKO 1
+ #endif
++*/
+
+ #elif defined(__MINGW32__)
+