diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2010-11-12 20:35:36 +0100 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2010-11-12 20:47:30 +0100 |
commit | f7d6f3c82836011ed05259a2c47c7ab106328c87 (patch) | |
tree | 5e3f0b393df4cc122e44f40f190ca1827ccd60c5 | |
parent | aa55d30d20bf419deb36301010337b4642770964 (diff) |
[3/4] HR support: Add actual wrapper code to call reference code
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r-- | libgsmhr/libgsmhr.c | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/libgsmhr/libgsmhr.c b/libgsmhr/libgsmhr.c index d10d855..d018c90 100644 --- a/libgsmhr/libgsmhr.c +++ b/libgsmhr/libgsmhr.c @@ -19,37 +19,93 @@ #include <stdint.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <gsmhr/gsmhr.h> +#include "refsrc/typedefs.h" +#include "refsrc/homing.h" +#include "refsrc/sp_dec.h" +#include "refsrc/sp_enc.h" + #define EXPORT __attribute__((visibility("default"))) struct gsmhr { - int stub; + int dec_reset_flg; }; EXPORT struct gsmhr * gsmhr_init(void) { - return NULL; + struct gsmhr *state; + + state = calloc(1, sizeof(struct gsmhr)); + if (!state) + return NULL; + + state->dec_reset_flg = 1; + + return state; } EXPORT void gsmhr_exit(struct gsmhr *state) { - return; + free(state); } EXPORT int gsmhr_encode(struct gsmhr *state, int16_t *hr_params, const int16_t *pcm) { + int enc_reset_flg; + Shortword pcm_b[F_LEN]; + + memcpy(pcm_b, pcm, F_LEN*sizeof(int16_t)); + + enc_reset_flg = encoderHomingFrameTest(pcm_b); + + speechEncoder(pcm_b, hr_params); + + if (enc_reset_flg) + resetEnc(); + return 0; } EXPORT int gsmhr_decode(struct gsmhr *state, int16_t *pcm, const int16_t *hr_params) { +#define WHOLE_FRAME 18 +#define TO_FIRST_SUBFRAME 9 + + int dec_reset_flg; + Shortword hr_params_b[22]; + + memcpy(hr_params_b, hr_params, 22*sizeof(int16_t)); + + if (state->dec_reset_flg) + dec_reset_flg = decoderHomingFrameTest(hr_params_b, TO_FIRST_SUBFRAME); + else + dec_reset_flg = 0; + + if (dec_reset_flg && state->dec_reset_flg) { + int i; + for (i=0; i<F_LEN; i++) + pcm[i] = EHF_MASK; + } else { + speechDecoder(hr_params_b, pcm); + } + + if (!state->dec_reset_flg) + dec_reset_flg = decoderHomingFrameTest(hr_params_b, WHOLE_FRAME); + + if (dec_reset_flg) + resetDec(); + + state->dec_reset_flg = dec_reset_flg; + return 0; } |