OSDN Git Service

android/hal-audio: Add support to unregister audio endpoints
authorAndrzej Kaczmarek <andrzej.kaczmarek@tieto.com>
Wed, 15 Jan 2014 18:03:49 +0000 (19:03 +0100)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 16 Jan 2014 14:01:40 +0000 (16:01 +0200)
android/hal-audio.c

index d5ffd14..45e5aea 100644 (file)
@@ -339,6 +339,21 @@ static int ipc_open_cmd(const struct audio_codec *codec)
        return rsp.id;
 }
 
+static int ipc_close_cmd(uint8_t endpoint_id)
+{
+       struct audio_cmd_close cmd;
+       int result;
+
+       DBG("");
+
+       cmd.id = endpoint_id;
+
+       result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_CLOSE,
+                               sizeof(cmd), &cmd, NULL, NULL, NULL);
+
+       return result;
+}
+
 static int register_endpoints(void)
 {
        struct audio_endpoint *ep = &audio_endpoints[0];
@@ -360,6 +375,20 @@ static int register_endpoints(void)
        return AUDIO_STATUS_SUCCESS;
 }
 
+static void unregister_endpoints(void)
+{
+       size_t i;
+
+       for (i = 0; i < MAX_AUDIO_ENDPOINTS; i++) {
+               struct audio_endpoint *ep = &audio_endpoints[i];
+
+               if (ep->id) {
+                       ipc_close_cmd(ep->id);
+                       memset(ep, 0, sizeof(*ep));
+               }
+       }
+}
+
 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
                                                                size_t bytes)
 {
@@ -755,6 +784,8 @@ static void *ipc_handler(void *data)
                if (register_endpoints() != AUDIO_STATUS_SUCCESS) {
                        error("audio: Failed to register endpoints");
 
+                       unregister_endpoints();
+
                        shutdown(audio_sk, SHUT_RDWR);
                        continue;
                }
@@ -778,6 +809,8 @@ static void *ipc_handler(void *data)
                pthread_mutex_unlock(&close_mutex);
        }
 
+       unregister_endpoints();
+
        info("Closing Audio IPC thread");
        return NULL;
 }