FreeCalypso > hg > gsm-codec-lib
diff miscutil/raw2wav.c @ 141:c1dc094f0821
pcm16-raw2wav utility written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 14 Dec 2022 06:19:03 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/miscutil/raw2wav.c Wed Dec 14 06:19:03 2022 +0000 @@ -0,0 +1,76 @@ +/* + * This program reads a 16-bit linear PCM speech recording in raw format + * (either BE or LE) and converts it into WAV container format. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "../libtest/wavwriter.h" + +static void +swap_bytes(bytes, cc) + uint8_t *bytes; + unsigned cc; +{ + uint8_t *dp, *endp; + int t; + + dp = bytes; + endp = bytes + cc; + while (dp < endp) { + t = dp[0]; + dp[0] = dp[1]; + dp[1] = t; + dp += 2; + } +} + +main(argc, argv) + char **argv; +{ + int big_endian; + FILE *binf; + void *wav; + uint8_t bytes[320]; + int cc; + + if (argc != 4) { +usage: fprintf(stderr, "usage: %s be|le input.raw output.wav\n", + argv[0]); + exit(1); + } + if (!strcmp(argv[1], "be")) + big_endian = 1; + else if (!strcmp(argv[1], "le")) + big_endian = 0; + else + goto usage; + binf = fopen(argv[2], "r"); + if (!binf) { + perror(argv[2]); + exit(1); + } + wav = wav_write_open(argv[3], 8000, 16, 1); + if (!wav) { + perror(argv[3]); + exit(1); + } + for (;;) { + cc = fread(bytes, 1, sizeof bytes, binf); + if (cc <= 0) + break; + if (cc & 1) { + fprintf(stderr, "error: %s has odd number of bytes\n", + argv[2]); + exit(1); + } + if (big_endian) + swap_bytes(bytes, cc); + wav_write_data(wav, bytes, cc); + } + wav_write_close(wav); + exit(0); +}