I made a simple client, that decodes audiostream to wave file (the name
might be misleading, but this is the most important usage...)

I needed to change few printf(...) to fprintf(stderr, ...), since I
wanted to use stdout. I didn't check most of them, since it's fine for
me to play with dup2(), but prolly it would be The Right Thing to make
avifile write stderr not stdout.

Please Cc: me on reply.

Cheers


-- 
: Michal ``,/\/\,       '' Moskal    | |            : GCS {C,UL}++++$
:          |    |alekith      @    |)|(| . org . pl : {E--, W, w-,M}-
:    Linux: We are dot in .ORG.    |                : {b,e>+}++ !tv h
: CurProj: ftp://ftp.pld.org.pl/people/malekith/ksi : PLD Team member
diff -urN avifile-0.6.0.20011207/lib/common/util.cpp 
avifile-0.6.0.20011207-/lib/common/util.cpp
--- avifile-0.6.0.20011207/lib/common/util.cpp  Wed Nov 21 23:33:02 2001
+++ avifile-0.6.0.20011207-/lib/common/util.cpp Wed Dec 19 01:58:31 2001
@@ -440,7 +440,7 @@
     }
     fclose(f);
 
-    printf("Available CPU flags: %s\n", flags);
+    fprintf(stderr, "Available CPU flags: %s\n", flags);
     have_tsc = (strstr(flags, "tsc") != 0);
     have_mmx = (strstr(flags, "mmx") != 0);
     have_sse = (strstr(flags, "sse") != 0);
@@ -460,7 +460,7 @@
     if (freq < 0)
        freq = old_freq();
     if (have_tsc)
-       printf("%f MHz %s processor detected\n", freq/1000., model);
+       fprintf(stderr, "%f MHz %s processor detected\n", freq/1000., model);
 }
 
 
diff -urN avifile-0.6.0.20011207/samples/misc/Makefile.am 
avifile-0.6.0.20011207-/samples/misc/Makefile.am
--- avifile-0.6.0.20011207/samples/misc/Makefile.am     Mon Dec  3 11:38:01 2001
+++ avifile-0.6.0.20011207-/samples/misc/Makefile.am    Wed Dec 19 01:58:31 2001
@@ -8,6 +8,7 @@
 avitype_SOURCES=avitype.cpp
 
 extractor_SOURCES=extractor.cpp
+wma2wav_SOURCES=wma2wav.cpp
 test_SOURCES=test.cpp
 #plustest_SOURCES=plustest.cpp
 #imtest_SOURCES=imtest.cpp
@@ -24,6 +25,7 @@
 avitype_LDADD = $(LIBRARY)
 
 extractor_LDADD = $(LIBRARY)
+wma2wav_LDADD = $(LIBRARY)
 
 if AMM_USE_JPEGLIB
 avimake_SOURCES = avimake.cpp
@@ -33,7 +35,7 @@
 PROG_AVIMAKE =
 endif
 
-bin_PROGRAMS = avibench avicat avitype $(PROG_AVIMAKE)
+bin_PROGRAMS = avibench avicat avitype $(PROG_AVIMAKE) wma2wav
 check_PROGRAMS = asfdump asftest avitest extractor test
 
 EXTRA_DIST =  imtest.cpp plustest.cpp qualtest.cpp test.cpp
diff -urN avifile-0.6.0.20011207/samples/misc/wma2wav.cpp 
avifile-0.6.0.20011207-/samples/misc/wma2wav.cpp
--- avifile-0.6.0.20011207/samples/misc/wma2wav.cpp     Thu Jan  1 01:00:00 1970
+++ avifile-0.6.0.20011207-/samples/misc/wma2wav.cpp    Wed Dec 19 01:58:51 2001
@@ -0,0 +1,123 @@
+/*
+ * Convert .wma files to .wav (so they can be treated with lame to produce
+ * more reasonable output :^)
+ * Copyright (c) 2001 Michal Moskal ([EMAIL PROTECTED])
+ *
+ * I was motivated to write this simple cuple of lines by Piotr Modrzyk,
+ * and I wish to thank him here ;)
+ *
+ * This program could be probably also used to extract soundtrack from 
+ * movies, but I don't mind and hence the name...
+ */
+
+#include <config.h>
+#include <default.h>
+#include <avifile.h>
+#include <stdio.h>
+#include <aviplay.h>
+#include <except.h>
+#include <version.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+
+#define __MODULE__ "wma2wav"
+
+using namespace std;
+
+int main(int argc, const char **argv)
+{
+       IAviReadFile *ac = 0;
+       IAviReadStream *as = 0;
+       uint8_t *zz = 0;
+       int out_fd;
+       const char *infile, *outfile;
+
+       if (argc != 2 && argc != 3) {
+               fprintf(stderr, "\n\nUSAGE: %s inputfile [outputfile]\n"
+                               "If outputfile is not present or is \"-\" "
+                               "stdout is used.\n\n",  argv[0]);
+               exit(1);
+       }
+
+       if (GetAvifileVersion() != AVIFILE_VERSION) {
+               fprintf(stderr,
+                       "This binary was compiled for Avifile ver. "
+                       "%f, but the but the library is ver. %f. Aborting.\n",
+                       AVIFILE_VERSION, GetAvifileVersion());
+               exit(1);
+       }
+
+       infile = argv[1];
+       outfile = argv[2];
+       
+       if (outfile && strcmp(outfile, "-") == 0)
+               outfile = NULL;
+       
+       if (outfile == NULL) {
+               // preserve stdout
+               out_fd = dup(1);
+               // copy messages to stderr
+               dup2(2, 1);
+       } else {
+               out_fd = open(outfile, O_WRONLY|O_TRUNC|O_CREAT, 0666);
+               if (out_fd < 0) {
+                       perror(outfile);
+                       exit(1);
+               }
+       }
+
+       try {
+               ac = CreateIAviReadFile(infile);
+               if (ac == NULL) {
+                       fprintf(stderr, "%s: can't read it\n", infile);
+                       exit(1);
+               }
+
+               as = ac->GetStream(0, AviStream::Audio);
+               if (ac == NULL) {
+                       fprintf(stderr, "%s: doesn't contains audio stream\n", 
+                               infile);
+                       exit(1);
+               }
+
+               const int buffer_size = 2 * 1024 * 1024;
+               zz = new uint8_t[buffer_size];
+               size_t samp_read, bytes_read, sz;
+               WAVEFORMATEX hdr;
+
+               memset(&hdr, 0, sizeof(hdr));
+               as->GetAudioFormatInfo(&hdr, NULL);
+
+               write(out_fd, "RIFF\x0f\xff\xff\xffWAVEfmt \x10\0\0\0", 20);
+               // override
+               hdr.wFormatTag = 1;
+               write(out_fd, &hdr, 16);
+               write(out_fd, "data\x0f\xff\xff\xff", 8);
+
+               as->StopStreaming();
+               as->StartStreaming();
+               while (!as->Eof()) {
+                       sz = as->GetFrameSize();
+                       if (sz > (size_t)buffer_size)
+                               sz = buffer_size;
+                       as->ReadFrames(zz, sz, sz, samp_read, bytes_read);
+                       if (write(out_fd, zz, bytes_read) != (int)bytes_read) {
+                               perror("write");
+                               exit(1);
+                       }
+               }
+
+               close(out_fd);
+       } catch(FatalError & error) {
+               fprintf(stderr, "Fatal error:\n");
+               error.Print();
+               exit(1);
+       }
+       if (ac)
+               delete ac;
+       if (zz)
+               delete zz;
+               
+       return 0;
+}

Reply via email to