# HG changeset patch # User Mychaela Falconia # Date 1670998743 0 # Node ID c1dc094f08218223ada12be105e0b6c46628bd61 # Parent 5efc377326dab93604b341e11dea35856be07625 pcm16-raw2wav utility written diff -r 5efc377326da -r c1dc094f0821 .hgignore --- a/.hgignore Tue Dec 13 07:14:41 2022 +0000 +++ b/.hgignore Wed Dec 14 06:19:03 2022 +0000 @@ -30,5 +30,6 @@ ^miscutil/gsm-amr2efr$ ^miscutil/gsm-efr2amr$ ^miscutil/gsmrec-dump$ +^miscutil/pcm16-raw2wav$ ^pcap/rtp-gsmfr-extr$ diff -r 5efc377326da -r c1dc094f0821 miscutil/Makefile --- a/miscutil/Makefile Tue Dec 13 07:14:41 2022 +0000 +++ b/miscutil/Makefile Wed Dec 14 06:19:03 2022 +0000 @@ -1,6 +1,6 @@ CC= gcc CFLAGS= -O2 -PROGS= gsm-amr2efr gsm-efr2amr gsmrec-dump +PROGS= gsm-amr2efr gsm-efr2amr gsmrec-dump pcm16-raw2wav LIBEFR= ../libgsmefr/libgsmefr.a LIBTEST=../libtest/libtest.a INSTBIN=/opt/freecalypso/bin @@ -19,6 +19,9 @@ gsmrec-dump: gsmrec-dump.o ${LIBTEST} ${LIBEFR} ${CC} ${CFLAGS} -o $@ gsmrec-dump.o ${LIBTEST} ${LIBEFR} -lgsm +pcm16-raw2wav: raw2wav.o ${LIBTEST} + ${CC} ${CFLAGS} -o $@ raw2wav.o ${LIBTEST} + install: mkdir -p ${INSTBIN} install -c ${PROGS} ${INSTBIN} diff -r 5efc377326da -r c1dc094f0821 miscutil/raw2wav.c --- /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 +#include +#include +#include +#include +#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); +}