From 2935bccf119e5de10f4714d78c7e8e4bf266323d Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Thu, 6 Jun 2013 16:42:50 +0300 Subject: [PATCH] sample buffer forwarding/handling by clients --- src/plugins/bluetooth-client/clients.c | 20 ++++++++++++++++-- src/plugins/sphinx-speech-engine/filter-buffer.c | 18 ++++++++++++---- src/plugins/sphinx-speech-engine/filter-buffer.h | 3 ++- src/plugins/sphinx-speech-engine/sphinx-plugin.c | 26 ++++++++++++------------ 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/plugins/bluetooth-client/clients.c b/src/plugins/bluetooth-client/clients.c index 4a074ee..1b2c950 100644 --- a/src/plugins/bluetooth-client/clients.c +++ b/src/plugins/bluetooth-client/clients.c @@ -1,8 +1,12 @@ +#include #include +#include #include #include #include #include +#include +#include #include #include @@ -233,6 +237,8 @@ static int play_samples(context_t *ctx, size_t nsample, int16_t *samples) device_t *device; modem_t *modem; card_t *card; + int16_t *dup; + size_t len; if (!ctx || !nsample || !samples || !(clients = ctx->clients)) return -1; @@ -253,8 +259,18 @@ static int play_samples(context_t *ctx, size_t nsample, int16_t *samples) 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 ) @@ -308,7 +324,7 @@ static int notify_command(srs_client_t *srs_client, int idx, 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; } diff --git a/src/plugins/sphinx-speech-engine/filter-buffer.c b/src/plugins/sphinx-speech-engine/filter-buffer.c index 0e3e952..91e95d3 100644 --- a/src/plugins/sphinx-speech-engine/filter-buffer.c +++ b/src/plugins/sphinx-speech-engine/filter-buffer.c @@ -243,22 +243,32 @@ 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) { 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; } diff --git a/src/plugins/sphinx-speech-engine/filter-buffer.h b/src/plugins/sphinx-speech-engine/filter-buffer.h index bc9f3d4..0bd6888 100644 --- a/src/plugins/sphinx-speech-engine/filter-buffer.h +++ b/src/plugins/sphinx-speech-engine/filter-buffer.h @@ -25,7 +25,8 @@ void filter_buffer_purge(context_t *ctx, int32_t length); 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__ */ diff --git a/src/plugins/sphinx-speech-engine/sphinx-plugin.c b/src/plugins/sphinx-speech-engine/sphinx-plugin.c index 7b71d50..1a66d05 100644 --- a/src/plugins/sphinx-speech-engine/sphinx-plugin.c +++ b/src/plugins/sphinx-speech-engine/sphinx-plugin.c @@ -122,23 +122,23 @@ static int rescan(uint32_t start, uint32_t end, void *user_data) 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); } -- 2.7.4