FreeCalypso > hg > freecalypso-tools
view tchtools/fc-gsm2vm.c @ 909:1e9fe07f8f09
doc/Voice-memo-utils: new article
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 29 Dec 2022 21:03:11 +0000 |
parents | 8ddb16a37273 |
children |
line wrap: on
line source
/* * This utility converts a GSM 06.10 speech recording from the format that is * commonly accepted as standard in the Unix/Linux world (libgsm format) into * a voice memo file that can be uploaded into the FFS of a FreeCalypso device * and played with the audio_vm_play_start() API or the AT@VMP command that * invokes the latter. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> main(argc, argv) char **argv; { FILE *inf, *outf; u_char libgsm_bytes[33], tidsp_bytes[34], arm_bytes[34]; static u_char header_bytes[6] = {0x00, 0xC4, 0x00, 0x00, 0x00, 0x00}; static u_char endmarker[2] = {0xFF, 0xFB}; int cc, i, gotsome = 0; if (argc != 3) { fprintf(stderr, "usage: %s infile outfile\n", argv[0]); exit(1); } inf = fopen(argv[1], "r"); if (!inf) { perror(argv[1]); exit(1); } outf = fopen(argv[2], "w"); if (!outf) { perror(argv[2]); exit(1); } tidsp_bytes[33] = 0; for (;;) { cc = fread(libgsm_bytes, 1, 33, inf); if (cc < 33) break; if ((libgsm_bytes[0] & 0xF0) != 0xD0) { invalid: fprintf(stderr, "error: %s is not in libgsm format\n", argv[1]); exit(1); } gsm0610_libgsm_to_tidsp(libgsm_bytes, tidsp_bytes); for (i = 0; i < 34; i += 2) { arm_bytes[i] = tidsp_bytes[i+1]; arm_bytes[i+1] = tidsp_bytes[i]; } fwrite(header_bytes, 1, 6, outf); fwrite(arm_bytes, 1, 34, outf); gotsome = 1; } fwrite(endmarker, 1, 2, outf); fclose(outf); if (cc) { if (gotsome) fprintf(stderr, "warning: extra non-33 bytes at the end of %s\n", argv[1]); else goto invalid; } exit(0); }