bleutooth-client: start to use the new audio buffer interface
authorJanos Kovacs <jankovac503@gmail.com>
Thu, 6 Jun 2013 13:42:53 +0000 (16:42 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Thu, 6 Jun 2013 13:56:50 +0000 (16:56 +0300)
src/plugins/bluetooth-client/clients.c
src/plugins/bluetooth-client/clients.h
src/plugins/bluetooth-client/pulseif.c

index 1b2c950..f012ee1 100644 (file)
@@ -33,7 +33,7 @@ static char *commands[] = {
 };
 static int ncommand = (sizeof(commands) / sizeof(commands[0])) - 1;
 
-static int play_samples(context_t *, size_t, int16_t *);
+static int play_samples(context_t *, uint32_t, uint32_t, srs_audiobuf_t *);
 static int notify_focus(srs_client_t *, srs_voice_focus_t);
 static int notify_command(srs_client_t *, int, int, char **, uint32_t *,
                           uint32_t *, srs_audiobuf_t *);
@@ -216,9 +216,10 @@ void clients_stop_recognising_voice(device_t *device)
     card_t *card;
 
     if (device) {
-        mrp_free(device->samples);
-        device->nsample = 0;
-        device->samples = NULL;
+        srs_unref_audiobuf(device->audio.buf);
+        device->audio.buf = NULL;
+        device->audio.start = 0;
+        device->audio.end = 0;
 
         if ((modem = device->modem) && modem->state == VOICE_RECOGNITION_ON) {
             dbusif_set_voice_recognition(modem, VOICE_RECOGNITION_OFF);
@@ -231,16 +232,17 @@ void clients_stop_recognising_voice(device_t *device)
     }
 }
 
-static int play_samples(context_t *ctx, size_t nsample, int16_t *samples)
+static int play_samples(context_t *ctx,
+                        uint32_t start,
+                        uint32_t end,
+                        srs_audiobuf_t *buf)
 {
     clients_t *clients;
     device_t *device;
     modem_t *modem;
     card_t *card;
-    int16_t *dup;
-    size_t len;
 
-    if (!ctx || !nsample || !samples || !(clients = ctx->clients))
+    if (!ctx || start >= end || !end || !buf || !(clients = ctx->clients))
         return -1;
 
     if (!(device = clients->current)) {
@@ -251,26 +253,18 @@ static int play_samples(context_t *ctx, size_t nsample, int16_t *samples)
     if (!(modem = device->modem) || !(card = device->card))
         return -1;
 
-    if (device->nsample || device->samples ||
-        modem->state == VOICE_RECOGNITION_ON)
-    {
+    if (device->audio.buf || modem->state == VOICE_RECOGNITION_ON) {
         mrp_log_error("bluetooth client: can't play samples: voicerec "
                       "already in progress");
         return -1;
     }
 
-    len = nsample * sizeof(int16_t);
-
-    if (!(dup = mrp_alloc(len)))
-        return -1;
-    else
-        memcpy(dup, samples, len);
-
-    device->nsample = nsample;
-    device->samples = dup;
-
-    mrp_log_info("bluetooth plugin: forwarding %u samples to device", nsample);
+    device->audio.buf = srs_ref_audiobuf(buf);
+    device->audio.start = start;
+    device->audio.end = end;
 
+    mrp_log_info("bluetooth plugin: forwarding %u samples to device",
+                 end - start);
 
     if (dbusif_set_voice_recognition(modem, VOICE_RECOGNITION_ON) < 0 ||
         pulseif_add_input_stream_to_card(card)                    < 0  )
@@ -306,7 +300,6 @@ static int notify_command(srs_client_t *srs_client, int idx,
     MRP_UNUSED(tokens);
     MRP_UNUSED(start);
     MRP_UNUSED(end);
-    MRP_UNUSED(audio);
 
     if (!srs_client || !(ctx = srs_client->user_data) ||
         !(clients = ctx->clients))
@@ -317,14 +310,10 @@ static int notify_command(srs_client_t *srs_client, int idx,
     for (i = 0, sep = "", *p = 0;   i < ntoken && p < e;   i++, sep = " ")
         p += snprintf(p, e-p, "%s%s", sep, tokens[i]);
 
-    if (!(device = clients->current)) {
-        mrp_log_info("no bluetooth device to execute command '%s'", cmd);
-        return FALSE;
-    }
-
     mrp_log_info("Bluetooth client got command '%s'\n", cmd);
 
-    play_samples(ctx, samplelen, samplebuf);
+    if (play_samples(ctx, 0, audio->samples, audio) < 0)
+        return FALSE;
 
     return TRUE;
 }
index 1ea7dd7..f22e538 100644 (file)
@@ -14,8 +14,11 @@ struct device_s {
     modem_t *modem;
     card_t *card;
     bool active;
-    size_t nsample;
-    int16_t *samples;
+    struct {
+        uint32_t start;
+        uint32_t end;
+        srs_audiobuf_t *buf;
+    } audio;
 };
 
 
index 55227e1..fcb9fbd 100644 (file)
@@ -666,7 +666,7 @@ static void read_callback(pa_stream *stream, size_t bytes, void *userdata)
                     printf("*** cling ends\n");
                     card->input.state = ST_READY;
 
-                    if (device->nsample && device->samples)
+                    if (device->audio.buf && device->audio.end > 0)
                         pulseif_add_output_stream_to_card(card);
                 }
             }
@@ -692,8 +692,9 @@ static void write_callback(pa_stream *stream, size_t bytes, void *userdata)
     device_t *device;
     context_t *ctx;
     pulseif_t *pulseif;
-    size_t size, len;
+    size_t size, len, offs;
     int16_t *data;
+    srs_audiobuf_t *buf;
 
     if (!card || !(device = card->device) || !(ctx = device->ctx) ||
         !(pulseif = ctx->pulseif))
@@ -704,27 +705,28 @@ static void write_callback(pa_stream *stream, size_t bytes, void *userdata)
 
     while (bytes > 0) {
 
-        if (card->input.state != ST_READY || !device->samples ||
-            device->nsample <= card->output.sent)
+        if (card->input.state != ST_READY || !(buf = device->audio.buf) ||
+            buf->samples <= card->output.sent)
         {
-            len = (sizeof(silence) < bytes) ? len : bytes;
+            len = (sizeof(silence) < bytes) ? sizeof(silence) : bytes;
 
             if (pa_stream_write(stream,silence,len,NULL,0,PA_SEEK_RELATIVE)<0)
                 goto could_not_write;
         }
         else {
-            size = device->nsample - card->output.sent;
-            len = size * 2;
+            size = device->audio.end - device->audio.start;
+            len  = (size - card->output.sent) * sizeof(int16_t);
+            offs = device->audio.start + card->output.sent;
 
             if (len > bytes)
                 len = bytes;
 
-            data = device->samples + card->output.sent;
+            data = (int16_t *)buf->data + offs;
 
             if (pa_stream_write(stream, data,len, NULL,0,PA_SEEK_RELATIVE) < 0)
                 goto could_not_write;
 
-            card->output.sent += len / 2;
+            card->output.sent += len / sizeof(int16_t);
         }
 
         if (bytes < len)