sphinx-speech-engine: implement actication/deactivation
authorJanos Kovacs <jankovac503@gmail.com>
Thu, 6 Jun 2013 13:44:32 +0000 (16:44 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Thu, 6 Jun 2013 13:58:24 +0000 (16:58 +0300)
src/plugins/sphinx-speech-engine/input-buffer.c
src/plugins/sphinx-speech-engine/input-buffer.h
src/plugins/sphinx-speech-engine/pulse-interface.c
src/plugins/sphinx-speech-engine/pulse-interface.h
src/plugins/sphinx-speech-engine/sphinx-plugin.c

index a89607e..7dd40d1 100644 (file)
@@ -88,6 +88,15 @@ int input_buffer_initialize(context_t *ctx, size_t size, size_t minreq)
     return 0;
 }
 
+void input_buffer_purge(context_t *ctx)
+{
+    input_buf_t *inpbuf;
+
+    if (!ctx || !!(inpbuf = ctx->inpbuf))
+        return;
+
+    inpbuf->len = 0;
+}
 
 void input_buffer_process_data(context_t *ctx, const void *buf, size_t len)
 {
index dc784d7..1a3eea1 100644 (file)
@@ -23,6 +23,8 @@ void input_buffer_destroy(context_t *ctx);
 
 int  input_buffer_initialize(context_t *ctx, size_t size, size_t minreq);
 
+void input_buffer_purge(context_t *ctx);
+
 void input_buffer_process_data(context_t *ctx, const void *buf, size_t len);
 
 
index c0638e0..b72aa3a 100644 (file)
@@ -84,6 +84,22 @@ void pulse_interface_destroy(context_t *ctx)
     }
 }
 
+void pulse_interface_cork_input_stream(context_t *ctx, bool cork)
+{
+    pulse_interface_t *pulseif;
+
+    if (!ctx || !(pulseif = ctx->pulseif))
+        return;
+
+    if ((cork && !pulseif->corked) || (!cork && pulseif->corked)) {
+        pulseif->corked = cork;
+
+        if (pulseif->stream && pulseif->conup)
+            pa_stream_cork(pulseif->stream, cork, NULL, NULL);
+    }
+
+    return;
+}
 
 static void connect_to_server(context_t *ctx)
 {
@@ -285,7 +301,7 @@ static void read_callback(pa_stream *stream, size_t bytes, void *userdata)
 
     pa_stream_peek(stream, &data, &size);
 
-    if (data && size)
+    if (data && size && !pulseif->corked)
         input_buffer_process_data(ctx, data, size);
 
     if (size)
index 381998e..322a22f 100644 (file)
@@ -11,11 +11,13 @@ struct pulse_interface_s {
     pa_context *pactx;
     pa_stream *stream;
     bool conup;
+    bool corked;
 };
 
 int  pulse_interface_create(context_t *ctx, pa_mainloop *mloop);
 void pulse_interface_destroy(context_t *ctx);
 
+void pulse_interface_cork_input_stream(context_t *ctx, bool cork);
 
 #endif /* __SRS_POCKET_SPHINX_PULSE_INTERFACE_H__ */
 
index ee3ccc3..df69730 100644 (file)
@@ -79,6 +79,8 @@ static int activate(void *user_data)
 
     mrp_log_info("Activating CMU Sphinx backend.");
 
+    pulse_interface_cork_input_stream(ctx, false);
+
     return TRUE;
 }
 
@@ -90,6 +92,10 @@ static void deactivate(void *user_data)
     MRP_UNUSED(ctx);
 
     mrp_log_info("Deactivating CMU Sphinx backend.");
+
+    pulse_interface_cork_input_stream(ctx, true);
+    filter_buffer_purge(ctx, -1);
+    input_buffer_purge(ctx);
 }
 
 
@@ -189,14 +195,14 @@ static const char *active_decoder(void *user_data)
 static int create_sphinx(srs_plugin_t *plugin)
 {
     srs_srec_api_t api = {
-    activate:         activate,
-    deactivate:       deactivate,
-    flush:            flush,
-    rescan:           rescan,
-    sampledup:        sampledup,
-    check_decoder:    check_decoder,
-    select_decoder:   select_decoder,
-    active_decoder:   active_decoder,
+        activate:         activate,
+        deactivate:       deactivate,
+        flush:            flush,
+        rescan:           rescan,
+        sampledup:        sampledup,
+        check_decoder:    check_decoder,
+        select_decoder:   select_decoder,
+        active_decoder:   active_decoder,
     };
 
     srs_context_t *srs = plugin->srs;