LameXP/etc/Patches/DcaEnc-r720af20-MSVC10-UTF8+Progress+VariousImprovements.V1.diff

3441 lines
112 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.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