#include <config.h>
#endif
+#include <pulse/xmalloc.h>
+
#include <pulsecore/modargs.h>
+
#include "echo-cancel.h"
/* should be between 10-20 ms */
};
static void pa_adrian_ec_fixate_spec(pa_sample_spec *source_ss, pa_channel_map *source_map,
- pa_sample_spec *sink_ss, pa_channel_map *sink_map)
+ pa_sample_spec *sink_ss, pa_channel_map *sink_map)
{
- source_ss->format = PA_SAMPLE_S16LE;
+ source_ss->format = PA_SAMPLE_S16NE;
source_ss->channels = 1;
pa_channel_map_init_mono(source_map);
ec->params.priv.adrian.aec = AEC_init(rate, have_vector);
if (!ec->params.priv.adrian.aec)
- goto fail;
+ goto fail;
pa_modargs_free(ma);
return TRUE;
fail:
if (ma)
- pa_modargs_free(ma);
+ pa_modargs_free(ma);
return FALSE;
}
-void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out)
-{
+void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
unsigned int i;
for (i = 0; i < ec->params.priv.adrian.blocksize; i += 2) {
- /* We know it's S16LE mono data */
- int r = (((int8_t) rec[i + 1]) << 8) | rec[i];
- int p = (((int8_t) play[i + 1]) << 8) | play[i];
- int res;
-
- res = AEC_doAEC(ec->params.priv.adrian.aec, r, p);
- out[i] = (uint8_t) (res & 0xff);
- out[i + 1] = (uint8_t) ((res >> 8) & 0xff);
+ /* We know it's S16NE mono data */
+ int r = *(int16_t *)(rec + i);
+ int p = *(int16_t *)(play + i);
+ *(int16_t *)(out + i) = (int16_t) AEC_doAEC(ec->params.priv.adrian.aec, r, p);
}
}
-void pa_adrian_ec_done(pa_echo_canceller *ec)
-{
+void pa_adrian_ec_done(pa_echo_canceller *ec) {
pa_xfree(ec->params.priv.adrian.aec);
ec->params.priv.adrian.aec = NULL;
}