diff options
Diffstat (limited to 'appl/cmd/raw2iaf.b')
| -rw-r--r-- | appl/cmd/raw2iaf.b | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/appl/cmd/raw2iaf.b b/appl/cmd/raw2iaf.b new file mode 100644 index 00000000..11c29e00 --- /dev/null +++ b/appl/cmd/raw2iaf.b @@ -0,0 +1,122 @@ +implement Raw2Iaf; + +include "sys.m"; +include "draw.m"; + +sys: Sys; +FD: import sys; +stderr: ref FD; + +rateK: con "rate"; +rateV: string = "44100"; +chanK: con "chans"; +chanV: string = "2"; +bitsK: con "bits"; +bitsV: string = "16"; +encK: con "enc"; +encV: string = "pcm"; + +progV: string; +inV: string = nil; +outV: string = nil; +inf: ref FD; +outf: ref FD; + +pad := array[] of { " ", " ", "", " " }; + +Raw2Iaf: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +usage() +{ + sys->fprint(stderr, "usage: %s -8124 -ms -bw -aup -o out in\n", progV); + exit; +} + +options(s: string) +{ + for (i := 0; i < len s; i++) { + case s[i] { + '8' => rateV = "8000"; + '1' => rateV = "11025"; + '2' => rateV = "22050"; + '4' => rateV = "44100"; + 'm' => chanV = "1"; + 's' => chanV = "2"; + 'b' => bitsV = "8"; + 'w' => bitsV = "16"; + 'a' => encV = "alaw"; + 'u' => encV = "ulaw"; + 'p' => encV = "pcm"; + * => usage(); + } + } +} + +init(nil: ref Draw->Context, argv: list of string) +{ + sys = load Sys Sys->PATH; + stderr = sys->fildes(2); + progV = hd argv; + v := tl argv; + + while (v != nil) { + a := hd v; + v = tl v; + if (len a == 0) + continue; + if (a[0] == '-') { + if (len a == 1) { + if (inV == nil) + inV = "-"; + else + usage(); + } + else if (a[1] == 'o') { + if (outV != nil) + usage(); + if (len a > 2) + outV = a[2:len a]; + else if (v == nil) + usage(); + else { + outV = hd v; + v = tl v; + } + } + else + options(a[1:len a]); + } + else if (inV == nil) + inV = a; + else + usage(); + } + if (inV == nil || inV == "-") + inf = sys->fildes(0); + else { + inf = sys->open(inV, Sys->OREAD); + if (inf == nil) { + sys->fprint(stderr, "%s: could not open %s: %r\n", progV, inV); + exit; + } + } + if (outV == nil || outV == "-") + outf = sys->fildes(1); + else { + outf = sys->create(outV, Sys->OWRITE, 8r666); + if (outf == nil) { + sys->fprint(stderr, "%s: could not create %s: %r\n", progV, outV); + exit; + } + } + s := rateK + "\t" + rateV + "\n" + + chanK + "\t" + chanV + "\n" + + bitsK + "\t" + bitsV + "\n" + + encK + "\t" + encV; + sys->fprint(outf, "%s%s\n\n", s, pad[len s % 4]); + if (sys->stream(inf, outf, Sys->ATOMICIO) < 0) + sys->fprint(stderr, "%s: data copy error: %r\n", progV); +} |
