 .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" &gt; "$(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" &gt; "$(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
