aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2010-11-12 20:35:36 +0100
committerSylvain Munaut <tnt@246tNt.com>2010-11-12 20:47:30 +0100
commitf7d6f3c82836011ed05259a2c47c7ab106328c87 (patch)
tree5e3f0b393df4cc122e44f40f190ca1827ccd60c5
parentaa55d30d20bf419deb36301010337b4642770964 (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.c62
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;
}