From 87314db13393445c7aa4bd023c695d1735948d0d Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sat, 2 Mar 2024 10:07:12 +0100 Subject: [PATCH] Small program for codec2 3200 encoding and decoding --- scripts/c2tool.c | 167 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 scripts/c2tool.c diff --git a/scripts/c2tool.c b/scripts/c2tool.c new file mode 100644 index 00000000..aad49554 --- /dev/null +++ b/scripts/c2tool.c @@ -0,0 +1,167 @@ +/*************************************************************************** + * Copyright (C) 2024 by Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#include +#include +#include +#include +#include + + +#define AUDIO_SIZE 160 +#define DATA_SIZE 8 + + +static void doEncode(FILE *input, FILE *output, struct CODEC2 *codec2) +{ + int16_t audioIn[AUDIO_SIZE]; + uint8_t dataOut[DATA_SIZE]; + + while(feof(input) == 0) + { + fread(&audioIn, sizeof(int16_t), AUDIO_SIZE, input); + codec2_encode(codec2, dataOut, audioIn); + fwrite(dataOut, sizeof(uint8_t), DATA_SIZE, output); + } +} + +static void doDecode(FILE *input, FILE *output, struct CODEC2 *codec2) +{ + uint8_t dataIn[DATA_SIZE]; + int16_t audioOut[AUDIO_SIZE]; + + while(feof(input) == 0) + { + fread(dataIn, sizeof(uint8_t), DATA_SIZE, input); + codec2_decode(codec2, audioOut, dataIn); + fwrite(audioOut, sizeof(int16_t), AUDIO_SIZE, output); + } +} + +static void printHelp() +{ + puts("Simple codec2 encode/decode tool, for 3200 data rate only."); + puts("Audio data must be signed 16-bit little endian sampled at 8kHz"); + puts("Usage: c2tool [OPTIONS]..."); + puts("Options:"); + puts("-e\t Encode audio"); + puts("-d\t Decode codec2 data"); + puts("-i\t Input file"); + puts("-o\t Output file"); +} + + +int main(int argc, char *argv[]) +{ + char ifName[512]; + char ofName[512]; + bool encode = false; + bool decode = false; + + if(argc <= 2) + { + printHelp(); + return 0; + } + + while(1) + { + int opt = getopt(argc, argv, "edi:o:"); + if(opt == -1) + break; + + switch(opt) + { + case 'e': + encode = true; + break; + + case 'd': + decode = true; + break; + + case 'i': + if(strlen(optarg) >= sizeof(ifName)) + { + puts("Error: input file name is too long!"); + return -1; + } + + strncpy(ifName, optarg, sizeof(ifName)); + break; + + case 'o': + if(strlen(optarg) >= sizeof(ofName)) + { + puts("Error: output file name is too long!"); + return -1; + } + + strncpy(ofName, optarg, sizeof(ofName)); + break; + + default: + printHelp(); + return 0; + break; + } + } + + if(encode && decode) + { + puts("Error: encode and decode selected at the same time!"); + return -1; + } + + FILE *infile = fopen(ifName, "rb"); + if(infile == NULL) + { + puts("Error opening input file!"); + return -1; + } + + FILE *outfile = fopen(ofName, "ab"); + if(outfile == NULL) + { + fclose(infile); + puts("Error opening output file!"); + return -1; + } + + struct CODEC2 *codec2 = codec2_create(CODEC2_MODE_3200); + if(codec2 == NULL) + { + fclose(infile); + fclose(outfile); + puts("Error creating codec2 instance!"); + return -1; + } + + if(encode) + doEncode(infile, outfile, codec2); + + if(decode) + doDecode(infile, outfile, codec2); + + fflush(outfile); + + fclose(infile); + fclose(outfile); + codec2_destroy(codec2); + + return 0; +}