sample buffer forwarding/handling by clients
authorJanos Kovacs <jankovac503@gmail.com>
Thu, 6 Jun 2013 13:42:50 +0000 (16:42 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Thu, 6 Jun 2013 13:56:45 +0000 (16:56 +0300)
src/plugins/bluetooth-client/clients.c
src/plugins/sphinx-speech-engine/filter-buffer.c
src/plugins/sphinx-speech-engine/filter-buffer.h
src/plugins/sphinx-speech-engine/sphinx-plugin.c

index 4a074ee..1b2c950 100644 (file)
@@ -1,8 +1,12 @@
+#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>
@@ -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;
 }
index 0e3e952..91e95d3 100644 (file)
@@ -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;
 }
index bc9f3d4..0bd6888 100644 (file)
@@ -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__ */
 
index 7b71d50..1a66d05 100644 (file)
@@ -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);
 }