view 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 source

/*
 * 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);
}