diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2010-10-29 11:46:05 +0200 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2010-11-11 20:26:41 +0100 |
commit | 6c96cc28b3fdb1b4bf37cfd51cf1e1199affee4e (patch) | |
tree | 1a75772c858f959653094afd92b5177194553b91 | |
parent | f905983b059c28bb60aa9e6656e26ff1fb5079c5 (diff) |
format: Add support for the file read/written by the Racal 6103E ms test set
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r-- | include/gapk/formats.h | 5 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/fmt_racal.c | 162 | ||||
-rw-r--r-- | src/formats.c | 6 |
4 files changed, 174 insertions, 1 deletions
diff --git a/include/gapk/formats.h b/include/gapk/formats.h index 4be519b..abaca6d 100644 --- a/include/gapk/formats.h +++ b/include/gapk/formats.h @@ -32,6 +32,11 @@ enum format_type { FMT_HR_REF_DEC, FMT_HR_REF_ENC, + /* Racal 6103E TCH recordings */ + FMT_RACAL_HR, + FMT_RACAL_FR, + FMT_RACAL_EFR, + _FMT_MAX, }; diff --git a/src/Makefile.am b/src/Makefile.am index 9383b7d..6f3cbed 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,5 +4,5 @@ AM_LDFLAGS=$(LIBOSMOCODEC_LIBS) bin_PROGRAMS = gapk gapk_SOURCES = main.c \ - formats.c fmt_gsm.c fmt_hr_ref.c \ + formats.c fmt_gsm.c fmt_hr_ref.c fmt_racal.c \ codecs.c codec_pcm.c codec_hr.c codec_fr.c codec_efr.c diff --git a/src/fmt_racal.c b/src/fmt_racal.c new file mode 100644 index 0000000..65f810f --- /dev/null +++ b/src/fmt_racal.c @@ -0,0 +1,162 @@ +/* Racal 6103E TCH recordings format */ + +/* + * This file is part of gapk (GSM Audio Pocket Knife). + * + * gapk 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. + * + * gapk 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 gapk. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stdint.h> + +#include <osmocom/codec/codec.h> + +#include <gapk/codecs.h> +#include <gapk/formats.h> +#include <gapk/utils.h> + + +static int +racal_hr_from_canon(uint8_t *dst, const uint8_t *src) +{ + int i, voiced; + const uint16_t *bit_mapping; + + voiced = (msb_get_bit(src, 34) << 1) | msb_get_bit(src, 35); + + bit_mapping = voiced ? + &gsm620_voiced_bitorder[0] : + &gsm620_unvoiced_bitorder[0] ; + + for (i=0; i<112; i++) { + int si = bit_mapping[i]; + int di = i; + lsb_put_bit(dst, di, msb_get_bit(src, si)); + } + + return 0; +} + +static int +racal_hr_to_canon(uint8_t *dst, const uint8_t *src) +{ + int i, voiced; + const uint16_t *bit_mapping; + + voiced = (lsb_get_bit(src, 94) << 1) | lsb_get_bit(src, 93); + + bit_mapping = voiced ? + &gsm620_voiced_bitorder[0] : + &gsm620_unvoiced_bitorder[0] ; + + for (i=0; i<112; i++) { + int si = i; + int di = bit_mapping[i]; + msb_put_bit(dst, di, lsb_get_bit(src, si)); + } + + return 0; +} + +const struct format_desc fmt_racal_hr = { + .type = FMT_RACAL_HR, + .codec_type = CODEC_HR, + .name = "racal-hr", + .description = "Racal HR TCH/H recording", + + .frame_len = 14, + .conv_from_canon = racal_hr_from_canon, + .conv_to_canon = racal_hr_to_canon, +}; + + +static int +racal_fr_from_canon(uint8_t *dst, const uint8_t *src) +{ + int i; + + dst[32] = 0x00; /* last nibble won't written, pre-clear it */ + + for (i=0; i<260; i++) { + int si = gsm610_bitorder[i]; + int di = i; + lsb_put_bit(dst, di, msb_get_bit(src, si)); + } + + return 0; +} + +static int +racal_fr_to_canon(uint8_t *dst, const uint8_t *src) +{ + int i; + + dst[32] = 0x00; /* last nibble won't written, pre-clear it */ + + for (i=0; i<260; i++) { + int si = i; + int di = gsm610_bitorder[i]; + msb_put_bit(dst, di, lsb_get_bit(src, si)); + } + + return 0; +} + +const struct format_desc fmt_racal_fr = { + .type = FMT_RACAL_FR, + .codec_type = CODEC_FR, + .name = "racal-fr", + .description = "Racal FR TCH/F recording", + + .frame_len = 33, + .conv_from_canon = racal_fr_from_canon, + .conv_to_canon = racal_fr_to_canon, +}; + + +static int +racal_efr_from_canon(uint8_t *dst, const uint8_t *src) +{ + int i; + + dst[30] = 0x00; /* last nibble won't written, pre-clear it */ + + for (i=0; i<244; i++) + lsb_put_bit(dst, i, msb_get_bit(src, i)); + + return 0; +} + +static int +racal_efr_to_canon(uint8_t *dst, const uint8_t *src) +{ + int i; + + dst[30] = 0x00; /* last nibble won't written, pre-clear it */ + + for (i=0; i<244; i++) + msb_put_bit(dst, i, lsb_get_bit(src, i)); + + return 0; +} + +const struct format_desc fmt_racal_efr = { + .type = FMT_RACAL_EFR, + .codec_type = CODEC_EFR, + .name = "racal-efr", + .description = "Racal EFR TCH/F recording", + + .frame_len = 31, + .conv_from_canon = racal_efr_from_canon, + .conv_to_canon = racal_efr_to_canon, +}; diff --git a/src/formats.c b/src/formats.c index 1125598..f3812a5 100644 --- a/src/formats.c +++ b/src/formats.c @@ -25,12 +25,18 @@ extern const struct format_desc fmt_gsm; extern const struct format_desc fmt_hr_ref_dec; extern const struct format_desc fmt_hr_ref_enc; +extern const struct format_desc fmt_racal_hr; +extern const struct format_desc fmt_racal_fr; +extern const struct format_desc fmt_racal_efr; static const struct format_desc *supported_formats[_FMT_MAX] = { [FMT_INVALID] = NULL, [FMT_GSM] = &fmt_gsm, [FMT_HR_REF_DEC] = &fmt_hr_ref_dec, [FMT_HR_REF_ENC] = &fmt_hr_ref_enc, + [FMT_RACAL_HR] = &fmt_racal_hr, + [FMT_RACAL_FR] = &fmt_racal_fr, + [FMT_RACAL_EFR] = &fmt_racal_efr, }; |