--- /dev/null
+ tools/cli_args.cpp | 86 ++++++++++++++++++++++++++++++++++
+ tools/cli_args.h | 6 +++
+ tools/valdec.cpp | 21 +++++++--
+ valib/valib/parsers/ffmpeg_decoder.cpp | 2 +
+ valib/valib/sink/sink_dsound.cpp | 4 +-
+ 5 files changed, 113 insertions(+), 6 deletions(-)
+
+diff --git a/tools/cli_args.cpp b/tools/cli_args.cpp
+new file mode 100644
+index 0000000..37a6983
+--- /dev/null
++++ b/tools/cli_args.cpp
+@@ -0,0 +1,86 @@
++
++#define WIN32_LEAN_AND_MEAN
++
++#include <stdio.h>
++#include <assert.h>
++#include <windows.h>
++#include <Shellapi.h>
++#include <io.h>
++
++#include "../valib/3rdparty/utf8/utf8.h"
++
++static std::string wstring_to_utf8(const std::wstring &s)
++{
++ std::string u8;
++ if (sizeof(wchar_t) == 2)
++ utf8::utf16to8(s.begin(), s.end(), std::back_inserter(u8));
++ else if (sizeof(wchar_t) == 4)
++ utf8::utf32to8(s.begin(), s.end(), std::back_inserter(u8));
++ else
++ assert(false);
++ return u8;
++}
++
++int init_cli_args(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);
++ if(NULL == *argv)
++ {
++ fprintf(stderr, "\nFATAL: Malloc failed\n\n");
++ exit(-1);
++ }
++
++ for(i = 0; i < nArgs; i++)
++ {
++ (*argv)[i] = _strdup(wstring_to_utf8(szArglist[i]).c_str());
++ }
++
++ LocalFree(szArglist);
++ return nArgs;
++}
++
++void free_cli_args(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;
++ }
++}
++
++static UINT g_old_output_cp = ((UINT)-1);
++
++void init_console(void)
++{
++ g_old_output_cp = GetConsoleOutputCP();
++ SetConsoleOutputCP(CP_UTF8);
++}
++
++void reset_console(void)
++{
++ if(g_old_output_cp != ((UINT)-1))
++ {
++ SetConsoleOutputCP(g_old_output_cp);
++ }
++}
+diff --git a/tools/cli_args.h b/tools/cli_args.h
+new file mode 100644
+index 0000000..3be906b
+--- /dev/null
++++ b/tools/cli_args.h
+@@ -0,0 +1,6 @@
++
++int init_cli_args(char ***argv);
++void free_cli_args(int argc, char ***argv);
++
++void init_console(void);
++void reset_console(void);
+diff --git a/tools/valdec.cpp b/tools/valdec.cpp
+index 5582c8d..e434c0d 100644
+--- a/tools/valdec.cpp
++++ b/tools/valdec.cpp
+@@ -24,6 +24,7 @@
+ // other
+ #include "win32/cpu.h"
+ #include "vargs.h"
++#include "cli_args.h"
+
+ #include "valdec_usage.txt.h"
+
+@@ -94,7 +95,7 @@ const enum_opt format_tbl[] =
+ { "7", FORMAT_PCMDOUBLE },
+ };
+
+-int valdec(int argc, const char *argv[])
++int valdec(int argc, char **argv)
+ {
+ using std::string;
+ if (argc < 2)
+@@ -698,10 +699,14 @@ int valdec(int argc, const char *argv[])
+ int(value2db(level)), \
+ int(file.get_frames() / time), \
+ cpu_current.usage() * 100); \
++ fflush(stderr); \
+ }
+
+- #define DROP_STAT \
+- fprintf(stderr, " \r");
++ #define DROP_STAT \
++ { \
++ fprintf(stderr, " \r"); \
++ fflush(stderr); \
++ }
+
+ while (file.get_chunk(chunk))
+ {
+@@ -830,7 +835,15 @@ int main(int argc, const char *argv[])
+ {
+ try
+ {
+- return valdec(argc, argv);
++ char **argv_utf8 = NULL;
++ init_console();
++ int argc_utf8 = init_cli_args(&argv_utf8);
++
++ int ret = valdec(argc_utf8, argv_utf8);
++
++ free_cli_args(argc_utf8, &argv_utf8);
++ reset_console();
++ return ret;
+ }
+ catch (ValibException &e)
+ {
+diff --git a/valib/valib/parsers/ffmpeg_decoder.cpp b/valib/valib/parsers/ffmpeg_decoder.cpp
+index b6b20d7..864f83c 100644
+--- a/valib/valib/parsers/ffmpeg_decoder.cpp
++++ b/valib/valib/parsers/ffmpeg_decoder.cpp
+@@ -10,6 +10,8 @@ extern "C"
+ {
+ #define __STDC_CONSTANT_MACROS
+ #include "../../3rdparty/ffmpeg/include/libavcodec/avcodec.h"
++#include "../../3rdparty/ffmpeg/include/libavutil/mem.h"
++#include "../../3rdparty/ffmpeg/include/libavutil/channel_layout.h"
+ }
+
+ static const string module = "FfmpegDecoder";
+diff --git a/valib/valib/sink/sink_dsound.cpp b/valib/valib/sink/sink_dsound.cpp
+index f22104d..f5f07bf 100644
+--- a/valib/valib/sink/sink_dsound.cpp
++++ b/valib/valib/sink/sink_dsound.cpp
+@@ -47,9 +47,9 @@ DSoundSink::open_dsound(HWND _hwnd, int _buf_size_ms, int _preload_ms, LPCGUID _
+
+ // Open DirectSound
+
+- if FAILED(DirectSoundCreate(_device, &ds, 0))
++ if(1) //FAILED(DirectSoundCreate(_device, &ds, 0))
+ return false;
+-
++
+ if (!_hwnd) _hwnd = GetForegroundWindow();
+ if (!_hwnd) _hwnd = GetDesktopWindow();
+ if FAILED(ds->SetCooperativeLevel(_hwnd, DSSCL_PRIORITY))