ref: ee74e156f0b51d0245ec70c09cb20ab7b2153865
parent: c7c73fe5c313242e4ec4ff26c63af39ab9af276d
author: Gregory Maxwell <greg@xiph.org>
date: Sun Jul 22 13:19:18 EDT 2012
Cleanups, finish merging win32 unicode display.
--- a/Makefile.am
+++ b/Makefile.am
@@ -37,7 +37,7 @@
opusdec_LDADD = $(OGG_LIBS) $(Opus_LIBS) -lm
opusdec_MANS = man/opusdec.1
-opusinfo_SOURCES = src/opus_header.c src/opusinfo.c src/info_opus.c
+opusinfo_SOURCES = src/opus_header.c src/opusinfo.c src/info_opus.c win32/unicode_support.c
opusinfo_LDADD = $(OGG_LIBS)
opusinfo_MANS = man/opusinfo.1
--- a/src/opusdec.c
+++ b/src/opusdec.c
@@ -59,6 +59,8 @@
#else
# define I64FORMAT "lld"
# define fopen_utf8(_x,_y) fopen((_x),(_y))
+# define argc_utf8 argc
+# define argv_utf8 argv
#endif
#include <math.h>
@@ -138,6 +140,13 @@
# define fmaxf(_x,_y) ((_x)>(_y)?(_x):(_y))
#endif
+static void quit(int _x) {
+#ifdef WIN_UNICODE
+ uninit_console_utf8();
+#endif
+ exit(_x);
+}
+
/* This implements a 16 bit quantization with full triangular dither
and IIR noise shaping. The noise shaping filters were designed by
Sebastian Gesemann based on the LAME ATH curves with flattening
@@ -281,7 +290,7 @@
if (audio_fd<0)
{
perror("Cannot open /dev/dsp");
- exit(1);
+ quit(1);
}
format=AFMT_S16_NE;
@@ -289,7 +298,7 @@
{
perror("SNDCTL_DSP_SETFMT");
close(audio_fd);
- exit(1);
+ quit(1);
}
stereo=0;
@@ -299,7 +308,7 @@
{
perror("SNDCTL_DSP_STEREO");
close(audio_fd);
- exit(1);
+ quit(1);
}
if (stereo!=0)
{
@@ -312,13 +321,13 @@
{
perror("SNDCTL_DSP_SPEED");
close(audio_fd);
- exit(1);
+ quit(1);
}
fout = fdopen(audio_fd, "w");
if(!fout)
{
perror("Cannot open output");
- exit(1);
+ quit(1);
}
#elif defined HAVE_LIBSNDIO
struct sio_par par;
@@ -327,7 +336,7 @@
if (!hdl)
{
fprintf(stderr, "Cannot open sndio device\n");
- exit(1);
+ quit(1);
}
sio_initpar(&par);
@@ -339,12 +348,12 @@
if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par) ||
par.sig != 1 || par.bits != 16 || par.rate != rate) {
fprintf(stderr, "could not set sndio parameters\n");
- exit(1);
+ quit(1);
}
*channels = par.pchan;
if (!sio_start(hdl)) {
fprintf(stderr, "could not start sndio\n");
- exit(1);
+ quit(1);
}
#elif defined HAVE_SYS_AUDIOIO_H
audio_info_t info;
@@ -354,7 +363,7 @@
if (audio_fd<0)
{
perror("Cannot open /dev/audio");
- exit(1);
+ quit(1);
}
AUDIO_INITINFO(&info);
@@ -369,13 +378,13 @@
if (ioctl(audio_fd, AUDIO_SETINFO, &info) < 0)
{
perror ("AUDIO_SETINFO");
- exit(1);
+ quit(1);
}
fout = fdopen(audio_fd, "w");
if(!fout)
{
perror("Cannot open output");
- exit(1);
+ quit(1);
}
#elif defined WIN32 || defined _WIN32
{
@@ -383,12 +392,12 @@
if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, opus_channels))
{
fprintf (stderr, "Can't access %s\n", "WAVE OUT");
- exit(1);
+ quit(1);
}
}
#else
fprintf (stderr, "No soundcard support\n");
- exit(1);
+ quit(1);
#endif
} else {
if (strcmp(outFile,"-")==0)
@@ -404,7 +413,7 @@
if (!fout)
{
perror(outFile);
- exit(1);
+ quit(1);
}
if (*wav_format)
{
@@ -412,7 +421,7 @@
if (*wav_format < 0)
{
fprintf (stderr, "Error writing WAV header.\n");
- exit(1);
+ quit(1);
}
}
}
@@ -525,8 +534,8 @@
fprintf(stderr, " (%d channel%s)",*channels,*channels>1?"s":"");
if(header.version!=1)fprintf(stderr, ", Header v%d",header.version);
fprintf(stderr, "\n");
- if (header.gain!=0)printf("Playback gain: %f dB\n", header.gain/256.);
- if (manual_gain!=0)printf("Manual gain: %f dB\n", manual_gain);
+ if (header.gain!=0)fprintf(stderr,"Playback gain: %f dB\n", header.gain/256.);
+ if (manual_gain!=0)fprintf(stderr,"Manual gain: %f dB\n", manual_gain);
}
return st;
@@ -600,11 +609,7 @@
return sampout;
}
-#ifdef WIN_UNICODE
-static int opusdec_main(int argc, char **argv)
-#else
int main(int argc, char **argv)
-#endif
{
int c;
int option_index = 0;
@@ -639,6 +644,7 @@
int close_in=0;
int eos=0;
ogg_int64_t audio_size=0;
+ double last_coded_seconds=0;
float loss_percent=-1;
float manual_gain=0;
int channels=-1;
@@ -655,7 +661,17 @@
float gain=1;
int streams=0;
size_t last_spin=0;
+#ifdef WIN_UNICODE
+ int argc_utf8;
+ char **argv_utf8;
+ (void)argc;
+ (void)argv;
+
+ init_console_utf8();
+ init_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+#endif
+
output=0;
shapemem.a_buf=0;
shapemem.b_buf=0;
@@ -665,7 +681,7 @@
/*Process options*/
while(1)
{
- c = getopt_long (argc, argv, "hvV",
+ c = getopt_long (argc_utf8, argv_utf8, "hvV",
long_options, &option_index);
if (c==-1)
break;
@@ -676,7 +692,7 @@
if (strcmp(long_options[option_index].name,"help")==0)
{
usage();
- exit(0);
+ quit(0);
} else if (strcmp(long_options[option_index].name,"quiet")==0)
{
quiet = 1;
@@ -683,11 +699,11 @@
} else if (strcmp(long_options[option_index].name,"version")==0)
{
version();
- exit(0);
+ quit(0);
} else if (strcmp(long_options[option_index].name,"version-short")==0)
{
version_short();
- exit(0);
+ quit(0);
} else if (strcmp(long_options[option_index].name,"no-dither")==0)
{
dither=0;
@@ -703,7 +719,7 @@
perror(optarg);
fprintf(stderr,"Could not open save-range file: %s\n",optarg);
fprintf(stderr,"Must provide a writable file name.\n");
- exit(1);
+ quit(1);
}
} else if (strcmp(long_options[option_index].name,"packet-loss")==0)
{
@@ -712,27 +728,27 @@
break;
case 'h':
usage();
- exit(0);
+ quit(0);
break;
case 'v':
version();
- exit(0);
+ quit(0);
break;
case '?':
usage();
- exit(1);
+ quit(1);
break;
}
}
- if (argc-optind!=2 && argc-optind!=1)
+ if (argc_utf8-optind!=2 && argc_utf8-optind!=1)
{
usage();
- exit(1);
+ quit(1);
}
- inFile=argv[optind];
+ inFile=argv_utf8[optind];
- if (argc-optind==2)
- outFile=argv[optind+1];
+ if (argc_utf8-optind==2)
+ outFile=argv_utf8[optind+1];
else
outFile = "";
wav_format = strlen(outFile)>=4 && (
@@ -752,7 +768,7 @@
if (!fin)
{
perror(inFile);
- exit(1);
+ quit(1);
}
close_in=1;
}
@@ -810,7 +826,7 @@
{
st = process_header(&op, &rate, &mapping_family, &channels, &preskip, &gain, manual_gain, &streams, wav_format, quiet);
if (!st)
- exit(1);
+ quit(1);
/*Remember how many samples at the front we were told to skip
so that we can adjust the timestamp counting.*/
@@ -878,16 +894,15 @@
if(!quiet){
static const char spinner[]="|/-\\";
- if(!(last_spin % 128)) {
- unsigned int sec, min, hrs;
- unsigned int total_secs = (unsigned int)(audio_size / (((ogg_int64_t) channels) * ((ogg_int64_t) rate) * ((ogg_int64_t) 2)));
- hrs = total_secs / 3600;
- min = (total_secs % 3600) / 60;
- sec = (total_secs % 3600) % 60;
- fprintf(stderr,"[%c] %02u:%02u:%02u\r", spinner[(last_spin/128) % 4], hrs, min, sec);
+ double coded_seconds = (double)audio_size/(channels*rate*sizeof(short));
+ if(coded_seconds>=last_coded_seconds+1){
+ fprintf(stderr,"\r[%c] %02d:%02d:%02d", spinner[last_spin&3],
+ (int)(coded_seconds/3600),(int)(coded_seconds/60)%60,
+ (int)(coded_seconds)%60);
fflush(stderr);
+ last_spin++;
+ last_coded_seconds=coded_seconds;
}
- last_spin++;
}
if (ret<0)
@@ -957,7 +972,7 @@
}
if (feof(fin)) {
if(!quiet) {
- fprintf(stderr, "Decoding complete.\n");
+ fprintf(stderr, "\rDecoding complete. \n");
fflush(stderr);
}
break;
@@ -965,7 +980,7 @@
}
/*If we were writing wav, go set the duration.*/
- if (fout && wav_format>=0 && audio_size<0x7FFFFFFF)
+ if (strlen(outFile)!=0 && fout && wav_format>=0 && audio_size<0x7FFFFFFF)
{
if (fseek(fout,4,SEEK_SET)==0)
{
@@ -1008,20 +1023,10 @@
if (fout != NULL)
fclose(fout);
- return 0;
-}
-
#ifdef WIN_UNICODE
-int main( int argc, char **argv )
-{
- int my_argc;
- char **my_argv;
- int exit_code;
+ free_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+ uninit_console_utf8();
+#endif
- init_commandline_arguments_utf8(&my_argc, &my_argv);
- exit_code = opusdec_main(my_argc, my_argv);
- free_commandline_arguments_utf8(&my_argc, &my_argv);
-
- return exit_code;
+ return 0;
}
-#endif
--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -55,6 +55,8 @@
#else
# define I64FORMAT "lld"
# define fopen_utf8(_x,_y) fopen((_x),(_y))
+# define argc_utf8 argc
+# define argv_utf8 argv
#endif
#include <opus.h>
@@ -75,7 +77,6 @@
#define VG_CHECK(x,y)
#endif
-
static void comment_init(char **comments, int* length, const char *vendor_string);
static void comment_add(char **comments, int* length, char *tag, char *val);
@@ -170,11 +171,7 @@
if(seconds>0)fprintf(stderr," %0.4g second%s",seconds,seconds!=1?"s":"");
}
-#ifdef WIN_UNICODE
-static int opusenc_main(int argc, char **argv)
-#else
int main(int argc, char **argv)
-#endif
{
static const input_format raw_format = {NULL, 0, raw_open, wav_close, "raw",N_("RAW file reader")};
int option_index=0;
@@ -274,7 +271,16 @@
opus_int32 lookahead=0;
unsigned char mapping[256];
int force_narrow=0;
+#ifdef WIN_UNICODE
+ int argc_utf8;
+ char **argv_utf8;
+ (void)argc;
+ (void)argv;
+
+ init_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+#endif
+
opt_ctls_ctlval=NULL;
frange=NULL;
range_file=NULL;
@@ -298,7 +304,7 @@
/*Process command-line options*/
while(1){
int c;
- c=getopt_long(argc, argv, "hv",
+ c=getopt_long(argc_utf8, argv_utf8, "hv",
long_options, &option_index);
if(c==-1)
break;
@@ -455,12 +461,12 @@
break;
}
}
- if(argc-optind!=2){
+ if(argc_utf8-optind!=2){
usage();
exit(1);
}
- inFile=argv[optind];
- outFile=argv[optind+1];
+ inFile=argv_utf8[optind];
+ outFile=argv_utf8[optind+1];
if(strcmp(inFile, "-")==0){
#if defined WIN32 || defined _WIN32
@@ -958,6 +964,9 @@
if(fin)fclose(fin);
if(fout)fclose(fout);
if(frange)fclose(frange);
+#ifdef WIN_UNICODE
+ free_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+#endif
return 0;
}
@@ -1032,18 +1041,3 @@
}
#undef readint
#undef writeint
-
-#ifdef WIN_UNICODE
-int main( int argc, char **argv )
-{
- int my_argc;
- char **my_argv;
- int exit_code;
-
- init_commandline_arguments_utf8(&my_argc, &my_argv);
- exit_code = opusenc_main(my_argc, my_argv);
- free_commandline_arguments_utf8(&my_argc, &my_argv);
-
- return exit_code;
-}
-#endif
--- a/src/opusinfo.c
+++ b/src/opusinfo.c
@@ -35,6 +35,8 @@
# include "unicode_support.h"
#else
# define fopen_utf8(_x,_y) fopen((_x),(_y))
+# define argc_utf8 argc
+# define argv_utf8 argv
#endif
#define CHUNK 4500
@@ -589,15 +591,22 @@
printf (_("\t-V Output version information and exit.\n"));
}
-#ifdef WIN_UNICODE
-static int opusinfo_main(int argc, char **argv)
-#else
int main(int argc, char **argv)
-#endif
{
int f, ret;
- if(argc < 2) {
+#ifdef WIN_UNICODE
+ int argc_utf8;
+ char **argv_utf8;
+
+ (void)argc;
+ (void)argv;
+
+ init_console_utf8();
+ init_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+#endif
+
+ if(argc_utf8 < 2) {
fprintf(stdout,
_("Usage: opusinfo [flags] file1.opus [file2.opus ... fileN.opus]\n"
"\n"
@@ -604,10 +613,13 @@
"opusinfo is a tool for printing information about Opus files\n"
"and for diagnosing problems with them.\n"
"Full help shown with \"opusinfo -h\".\n"));
+#ifdef WIN_UNICODE
+ uninit_console_utf8();
+#endif
exit(1);
}
- while((ret = getopt(argc, argv, "hqvV")) >= 0) {
+ while((ret = getopt(argc_utf8, argv_utf8, "hqvV")) >= 0) {
switch(ret) {
case 'h':
usage();
@@ -631,7 +643,7 @@
if(verbose < 0)
printwarn = 0;
- if(optind >= argc) {
+ if(optind >= argc_utf8) {
fprintf(stderr,
_("No input files specified. \"opusinfo -h\" for help\n"));
return 1;
@@ -639,27 +651,17 @@
ret = 0;
- for(f=optind; f < argc; f++) {
+ for(f=optind; f < argc_utf8; f++) {
flawed = 0;
- process_file(argv[f]);
+ process_file(argv_utf8[f]);
if(flawed != 0)
ret = flawed;
}
- return ret;
-}
-
#ifdef WIN_UNICODE
-int main( int argc, char **argv )
-{
- int my_argc;
- char **my_argv;
- int exit_code;
+ free_commandline_arguments_utf8(&argc_utf8, &argv_utf8);
+ uninit_console_utf8();
+#endif
- init_commandline_arguments_utf8(&my_argc, &my_argv);
- exit_code = opusinfo_main(my_argc, my_argv);
- free_commandline_arguments_utf8(&my_argc, &my_argv);
-
- return exit_code;
+ return ret;
}
-#endif
\ No newline at end of file