OSDN Git Service

android/hal-audio: Read fd from Output Stream response
authorAndrzej Kaczmarek <andrzej.kaczmarek@tieto.com>
Wed, 22 Jan 2014 10:34:51 +0000 (11:34 +0100)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 23 Jan 2014 09:34:19 +0000 (11:34 +0200)
android/hal-audio.c

index 2d97a6e..9c7b95c 100644 (file)
@@ -578,7 +578,7 @@ static int ipc_close_cmd(uint8_t endpoint_id)
        return result;
 }
 
-static int ipc_open_stream_cmd(uint8_t endpoint_id, uint16_t *mtu,
+static int ipc_open_stream_cmd(uint8_t endpoint_id, uint16_t *mtu, int *fd,
                                        struct audio_preset **caps)
 {
        char buf[BLUEZ_AUDIO_MTU];
@@ -596,7 +596,7 @@ static int ipc_open_stream_cmd(uint8_t endpoint_id, uint16_t *mtu,
        cmd.id = endpoint_id;
 
        result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
-                               sizeof(cmd), &cmd, &rsp_len, rsp, NULL);
+                               sizeof(cmd), &cmd, &rsp_len, rsp, fd);
 
        if (result == AUDIO_STATUS_SUCCESS) {
                size_t buf_len = sizeof(struct audio_preset) +
@@ -993,6 +993,7 @@ static int audio_open_output_stream(struct audio_hw_device *dev,
        struct audio_preset *preset;
        const struct audio_codec *codec;
        uint16_t mtu;
+       int fd;
 
        out = calloc(1, sizeof(struct a2dp_stream_out));
        if (!out)
@@ -1020,13 +1021,15 @@ static int audio_open_output_stream(struct audio_hw_device *dev,
        /* TODO: for now we always use endpoint 0 */
        out->ep = &audio_endpoints[0];
 
-       if (ipc_open_stream_cmd(out->ep->id, &mtu, &preset) !=
+       if (ipc_open_stream_cmd(out->ep->id, &mtu, &fd, &preset) !=
                        AUDIO_STATUS_SUCCESS)
                goto fail;
 
-       if (!preset)
+       if (!preset || fd < 0)
                goto fail;
 
+       out->ep->fd = fd;
+
        codec = out->ep->codec;
 
        codec->init(preset, mtu, &out->ep->codec_data);
@@ -1060,6 +1063,11 @@ static void audio_close_output_stream(struct audio_hw_device *dev,
 
        ipc_close_stream_cmd(ep->id);
 
+       if (ep->fd >= 0) {
+               close(ep->fd);
+               ep->fd = -1;
+       }
+
        ep->codec->cleanup(ep->codec_data);
        ep->codec_data = NULL;