+#include <sys/types.h>
#include <sys/time.h>
+#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
+#include <unistd.h>
+#include <fcntl.h>
#include <errno.h>
#include <murphy/common/debug.h>
device_t *device;
modem_t *modem;
card_t *card;
+ int16_t *dup;
+ size_t len;
if (!ctx || !nsample || !samples || !(clients = ctx->clients))
return -1;
return -1;
}
+ len = nsample * sizeof(int16_t);
+
+ if (!(dup = mrp_alloc(len)))
+ return -1;
+ else
+ memcpy(dup, samples, len);
+
device->nsample = nsample;
- device->samples = samples;
+ device->samples = dup;
+
+ mrp_log_info("bluetooth plugin: forwarding %u samples to device", nsample);
+
if (dbusif_set_voice_recognition(modem, VOICE_RECOGNITION_ON) < 0 ||
pulseif_add_input_stream_to_card(card) < 0 )
mrp_log_info("Bluetooth client got command '%s'\n", cmd);
- play_samples(ctx, samplelen / sizeof(int16_t), samplebuf);
+ play_samples(ctx, samplelen, samplebuf);
return TRUE;
}
}
}
-int16_t *filter_buffer_dup(context_t *ctx, int32_t start, int32_t end)
+int16_t *filter_buffer_dup(context_t *ctx,
+ int32_t start,
+ int32_t end,
+ size_t *ret_length)
{
filter_buf_t *filtbuf;
int16_t *dup;
size_t len;
+
if (!ctx || !(filtbuf = ctx->filtbuf))
return NULL;
if (start < 0 || end < 0 || start >= end || start >= filtbuf->len)
return NULL;
- len = (end - start) * sizeof(int16_t);
+ len = (end - start) * filtbuf->frlen * sizeof(int16_t);
+
+ if (!(dup = mrp_alloc(len)))
+ len = 0;
+ else
+ memcpy(dup, filtbuf->buf + (start * filtbuf->frlen), len);
+
+ if (ret_length)
+ *ret_length = len / sizeof(int16_t);
- if ((dup = mrp_alloc(len)))
- memcpy(dup, filtbuf + start, len);
return dup;
}
void filter_buffer_process_data(context_t *ctx);
void filter_buffer_utter(context_t *ctx, bool full_utterance);
-int16_t *filter_buffer_dup(context_t *ctx, int32_t start, int32_t end);
+int16_t *filter_buffer_dup(context_t *ctx, int32_t start, int32_t end,
+ size_t *ret_length);
#endif /* __SRS_POCKET_SPHINX_FILTER_BUFFER_H__ */
static srs_audiobuf_t *sampledup(uint32_t start, uint32_t end, void *user_data)
{
- context_t *ctx = (context_t *)user_data;
- srs_audioformat_t format;
- uint32_t rate;
- uint8_t channels;
- size_t samples;
- uint32_t buf[2];
+ context_t *ctx = (context_t *)user_data;
+ options_t *opts;
+ srs_audioformat_t format;
+ uint32_t rate;
+ uint8_t channels;
+ size_t samples;
+ int16_t *buf;
- MRP_UNUSED(ctx);
+ if (!ctx || !(opts = ctx->opts))
+ return NULL;
mrp_debug("duplicating CMU Sphinx backend sample (%u - %u)", start, end);
- format = SRS_AUDIO_S32LE;
- rate = 16000;
- channels = 2;
- samples = 1;
- buf[0] = start;
- buf[1] = end;
+ format = SRS_AUDIO_S16LE;
+ rate = opts->rate;
+ channels = 1;
+ buf = filter_buffer_dup(ctx, start, end, &samples);
return srs_create_audiobuf(format, rate, channels, samples, buf);
}