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

3441 lines
112 KiB
Diff
Raw Normal View History

2012-02-28 16:11:28 +01:00
.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