OSDN Git Service

android/hal-audio: Remove DBG from SBC functions
[android-x86/external-bluetooth-bluez.git] / android / hal-audio.c
1 /*
2  * Copyright (C) 2013 Intel Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <errno.h>
19 #include <pthread.h>
20 #include <poll.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/socket.h>
25 #include <sys/un.h>
26 #include <unistd.h>
27 #include <arpa/inet.h>
28
29 #include <hardware/audio.h>
30 #include <hardware/hardware.h>
31
32 #include <sbc/sbc.h>
33
34 #include "audio-msg.h"
35 #include "hal-log.h"
36 #include "hal-msg.h"
37 #include "../profiles/audio/a2dp-codecs.h"
38
39 #define FIXED_A2DP_PLAYBACK_LATENCY_MS 25
40
41 static const uint8_t a2dp_src_uuid[] = {
42                 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x10, 0x00,
43                 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb };
44
45 static int listen_sk = -1;
46 static int audio_sk = -1;
47
48 static pthread_t ipc_th = 0;
49 static pthread_mutex_t sk_mutex = PTHREAD_MUTEX_INITIALIZER;
50
51 #if __BYTE_ORDER == __LITTLE_ENDIAN
52
53 struct rtp_header {
54         unsigned cc:4;
55         unsigned x:1;
56         unsigned p:1;
57         unsigned v:2;
58
59         unsigned pt:7;
60         unsigned m:1;
61
62         uint16_t sequence_number;
63         uint32_t timestamp;
64         uint32_t ssrc;
65         uint32_t csrc[0];
66 } __attribute__ ((packed));
67
68 struct rtp_payload {
69         unsigned frame_count:4;
70         unsigned rfa0:1;
71         unsigned is_last_fragment:1;
72         unsigned is_first_fragment:1;
73         unsigned is_fragmented:1;
74 } __attribute__ ((packed));
75
76 #elif __BYTE_ORDER == __BIG_ENDIAN
77
78 struct rtp_header {
79         unsigned v:2;
80         unsigned p:1;
81         unsigned x:1;
82         unsigned cc:4;
83
84         unsigned m:1;
85         unsigned pt:7;
86
87         uint16_t sequence_number;
88         uint32_t timestamp;
89         uint32_t ssrc;
90         uint32_t csrc[0];
91 } __attribute__ ((packed));
92
93 struct rtp_payload {
94         unsigned is_fragmented:1;
95         unsigned is_first_fragment:1;
96         unsigned is_last_fragment:1;
97         unsigned rfa0:1;
98         unsigned frame_count:4;
99 } __attribute__ ((packed));
100
101 #else
102 #error "Unknown byte order"
103 #endif
104
105 struct media_packet {
106         struct rtp_header hdr;
107         struct rtp_payload payload;
108         uint8_t data[0];
109 };
110
111 struct audio_input_config {
112         uint32_t rate;
113         uint32_t channels;
114         audio_format_t format;
115 };
116
117 struct sbc_data {
118         a2dp_sbc_t sbc;
119
120         sbc_t enc;
121
122         size_t in_frame_len;
123         size_t in_buf_size;
124
125         size_t out_buf_size;
126         uint8_t *out_buf;
127
128         unsigned frame_duration;
129         unsigned frames_per_packet;
130
131         struct timespec start;
132         unsigned frames_sent;
133
134         uint16_t seq;
135 };
136
137 static inline void timespec_diff(struct timespec *a, struct timespec *b,
138                                         struct timespec *res)
139 {
140         res->tv_sec = a->tv_sec - b->tv_sec;
141         res->tv_nsec = a->tv_nsec - b->tv_nsec;
142
143         if (res->tv_nsec < 0) {
144                 res->tv_sec--;
145                 res->tv_nsec += 1000000000; /* 1sec */
146         }
147 }
148
149 static int sbc_get_presets(struct audio_preset *preset, size_t *len);
150 static int sbc_codec_init(struct audio_preset *preset, uint16_t mtu,
151                                 void **codec_data);
152 static int sbc_cleanup(void *codec_data);
153 static int sbc_get_config(void *codec_data, struct audio_input_config *config);
154 static size_t sbc_get_buffer_size(void *codec_data);
155 static size_t sbc_get_mediapacket_duration(void *codec_data);
156 static void sbc_resume(void *codec_data);
157 static ssize_t sbc_write_data(void *codec_data, const void *buffer,
158                                         size_t bytes, int fd);
159
160 struct audio_codec {
161         uint8_t type;
162
163         int (*get_presets) (struct audio_preset *preset, size_t *len);
164
165         int (*init) (struct audio_preset *preset, uint16_t mtu,
166                                 void **codec_data);
167         int (*cleanup) (void *codec_data);
168         int (*get_config) (void *codec_data,
169                                         struct audio_input_config *config);
170         size_t (*get_buffer_size) (void *codec_data);
171         size_t (*get_mediapacket_duration) (void *codec_data);
172         void (*resume) (void *codec_data);
173         ssize_t (*write_data) (void *codec_data, const void *buffer,
174                                 size_t bytes, int fd);
175 };
176
177 static const struct audio_codec audio_codecs[] = {
178         {
179                 .type = A2DP_CODEC_SBC,
180
181                 .get_presets = sbc_get_presets,
182
183                 .init = sbc_codec_init,
184                 .cleanup = sbc_cleanup,
185                 .get_config = sbc_get_config,
186                 .get_buffer_size = sbc_get_buffer_size,
187                 .get_mediapacket_duration = sbc_get_mediapacket_duration,
188                 .resume = sbc_resume,
189                 .write_data = sbc_write_data,
190         }
191 };
192
193 #define NUM_CODECS (sizeof(audio_codecs) / sizeof(audio_codecs[0]))
194
195 #define MAX_AUDIO_ENDPOINTS NUM_CODECS
196
197 struct audio_endpoint {
198         uint8_t id;
199         const struct audio_codec *codec;
200         void *codec_data;
201         int fd;
202 };
203
204 static struct audio_endpoint audio_endpoints[MAX_AUDIO_ENDPOINTS];
205
206 enum a2dp_state_t {
207         AUDIO_A2DP_STATE_NONE,
208         AUDIO_A2DP_STATE_STANDBY,
209         AUDIO_A2DP_STATE_SUSPENDED,
210         AUDIO_A2DP_STATE_STARTED
211 };
212
213 struct a2dp_stream_out {
214         struct audio_stream_out stream;
215
216         struct audio_endpoint *ep;
217         enum a2dp_state_t audio_state;
218         struct audio_input_config cfg;
219 };
220
221 struct a2dp_audio_dev {
222         struct audio_hw_device dev;
223         struct a2dp_stream_out *out;
224 };
225
226 static const a2dp_sbc_t sbc_presets[] = {
227         {
228                 .frequency = SBC_SAMPLING_FREQ_44100 | SBC_SAMPLING_FREQ_48000,
229                 .channel_mode = SBC_CHANNEL_MODE_MONO |
230                                 SBC_CHANNEL_MODE_DUAL_CHANNEL |
231                                 SBC_CHANNEL_MODE_STEREO |
232                                 SBC_CHANNEL_MODE_JOINT_STEREO,
233                 .subbands = SBC_SUBBANDS_4 | SBC_SUBBANDS_8,
234                 .allocation_method = SBC_ALLOCATION_SNR |
235                                         SBC_ALLOCATION_LOUDNESS,
236                 .block_length = SBC_BLOCK_LENGTH_4 | SBC_BLOCK_LENGTH_8 |
237                                 SBC_BLOCK_LENGTH_12 | SBC_BLOCK_LENGTH_16,
238                 .min_bitpool = MIN_BITPOOL,
239                 .max_bitpool = MAX_BITPOOL
240         },
241         {
242                 .frequency = SBC_SAMPLING_FREQ_44100,
243                 .channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO,
244                 .subbands = SBC_SUBBANDS_8,
245                 .allocation_method = SBC_ALLOCATION_LOUDNESS,
246                 .block_length = SBC_BLOCK_LENGTH_16,
247                 .min_bitpool = MIN_BITPOOL,
248                 .max_bitpool = MAX_BITPOOL
249         },
250         {
251                 .frequency = SBC_SAMPLING_FREQ_48000,
252                 .channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO,
253                 .subbands = SBC_SUBBANDS_8,
254                 .allocation_method = SBC_ALLOCATION_LOUDNESS,
255                 .block_length = SBC_BLOCK_LENGTH_16,
256                 .min_bitpool = MIN_BITPOOL,
257                 .max_bitpool = MAX_BITPOOL
258         },
259 };
260
261 static int sbc_get_presets(struct audio_preset *preset, size_t *len)
262 {
263         int i;
264         int count;
265         size_t new_len = 0;
266         uint8_t *ptr = (uint8_t *) preset;
267         size_t preset_size = sizeof(*preset) + sizeof(a2dp_sbc_t);
268
269         count = sizeof(sbc_presets) / sizeof(sbc_presets[0]);
270
271         for (i = 0; i < count; i++) {
272                 preset = (struct audio_preset *) ptr;
273
274                 if (new_len + preset_size > *len)
275                         break;
276
277                 preset->len = sizeof(a2dp_sbc_t);
278                 memcpy(preset->data, &sbc_presets[i], preset->len);
279
280                 new_len += preset_size;
281                 ptr += preset_size;
282         }
283
284         *len = new_len;
285
286         return i;
287 }
288
289 static void sbc_init_encoder(struct sbc_data *sbc_data)
290 {
291         a2dp_sbc_t *in = &sbc_data->sbc;
292         sbc_t *out = &sbc_data->enc;
293
294         sbc_init_a2dp(out, 0L, in, sizeof(*in));
295
296         out->endian = SBC_LE;
297         out->bitpool = in->max_bitpool;
298 }
299
300 static int sbc_codec_init(struct audio_preset *preset, uint16_t mtu,
301                                 void **codec_data)
302 {
303         struct sbc_data *sbc_data;
304         size_t hdr_len = sizeof(struct media_packet);
305         size_t in_frame_len;
306         size_t out_frame_len;
307         size_t num_frames;
308
309         if (preset->len != sizeof(a2dp_sbc_t)) {
310                 error("SBC: preset size mismatch");
311                 return AUDIO_STATUS_FAILED;
312         }
313
314         sbc_data = calloc(sizeof(struct sbc_data), 1);
315
316         memcpy(&sbc_data->sbc, preset->data, preset->len);
317
318         sbc_init_encoder(sbc_data);
319
320         in_frame_len = sbc_get_codesize(&sbc_data->enc);
321         out_frame_len = sbc_get_frame_length(&sbc_data->enc);
322         num_frames = (mtu - hdr_len) / out_frame_len;
323
324         sbc_data->in_frame_len = in_frame_len;
325         sbc_data->in_buf_size = num_frames * in_frame_len;
326
327         sbc_data->out_buf_size = hdr_len + num_frames * out_frame_len;
328         sbc_data->out_buf = calloc(1, sbc_data->out_buf_size);
329
330         sbc_data->frame_duration = sbc_get_frame_duration(&sbc_data->enc);
331         sbc_data->frames_per_packet = num_frames;
332
333         *codec_data = sbc_data;
334
335         return AUDIO_STATUS_SUCCESS;
336 }
337
338 static int sbc_cleanup(void *codec_data)
339 {
340         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
341
342         sbc_finish(&sbc_data->enc);
343         free(sbc_data->out_buf);
344         free(codec_data);
345
346         return AUDIO_STATUS_SUCCESS;
347 }
348
349 static int sbc_get_config(void *codec_data, struct audio_input_config *config)
350 {
351         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
352
353         switch (sbc_data->sbc.frequency) {
354         case SBC_SAMPLING_FREQ_16000:
355                 config->rate = 16000;
356                 break;
357         case SBC_SAMPLING_FREQ_32000:
358                 config->rate = 32000;
359                 break;
360         case SBC_SAMPLING_FREQ_44100:
361                 config->rate = 44100;
362                 break;
363         case SBC_SAMPLING_FREQ_48000:
364                 config->rate = 48000;
365                 break;
366         default:
367                 return AUDIO_STATUS_FAILED;
368         }
369         config->channels = sbc_data->sbc.channel_mode == SBC_CHANNEL_MODE_MONO ?
370                                 AUDIO_CHANNEL_OUT_MONO :
371                                 AUDIO_CHANNEL_OUT_STEREO;
372         config->format = AUDIO_FORMAT_PCM_16_BIT;
373
374         return AUDIO_STATUS_SUCCESS;
375 }
376
377 static size_t sbc_get_buffer_size(void *codec_data)
378 {
379         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
380
381         return sbc_data->in_buf_size;
382 }
383
384 static size_t sbc_get_mediapacket_duration(void *codec_data)
385 {
386         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
387
388         return sbc_data->frame_duration * sbc_data->frames_per_packet;
389 }
390
391 static void sbc_resume(void *codec_data)
392 {
393         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
394
395         DBG("");
396
397         clock_gettime(CLOCK_MONOTONIC, &sbc_data->start);
398
399         sbc_data->frames_sent = 0;
400 }
401
402 static void write_media_packet(int fd, struct sbc_data *sbc_data,
403                                 struct media_packet *mp, size_t data_len)
404 {
405         struct timespec cur;
406         struct timespec diff;
407         unsigned expected_frames;
408         int ret;
409
410         ret = write(fd, mp, sizeof(*mp) + data_len);
411         if (ret < 0) {
412                 int err = errno;
413                 error("SBC: failed to write data: %d (%s)", err, strerror(err));
414         }
415
416         sbc_data->frames_sent += mp->payload.frame_count;
417
418         clock_gettime(CLOCK_MONOTONIC, &cur);
419         timespec_diff(&cur, &sbc_data->start, &diff);
420         expected_frames = (diff.tv_sec * 1000000 + diff.tv_nsec / 1000) /
421                                                 sbc_data->frame_duration;
422
423         /* AudioFlinger does not seem to provide any *working*
424          * API to provide data in some interval and will just
425          * send another buffer as soon as we process current
426          * one. To prevent overflowing L2CAP socket, we need to
427          * introduce some artificial delay here base on how many
428          * audio frames were sent so far, i.e. if we're not
429          * lagging behind audio stream, we can sleep for
430          * duration of single media packet.
431          */
432         if (sbc_data->frames_sent >= expected_frames)
433                 usleep(sbc_data->frame_duration *
434                                 mp->payload.frame_count);
435 }
436
437 static ssize_t sbc_write_data(void *codec_data, const void *buffer,
438                                 size_t bytes, int fd)
439 {
440         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
441         size_t consumed = 0;
442         size_t encoded = 0;
443         struct media_packet *mp = (struct media_packet *) sbc_data->out_buf;
444         size_t free_space = sbc_data->out_buf_size - sizeof(*mp);
445         int ret;
446
447         mp->hdr.v = 2;
448         mp->hdr.pt = 1;
449         mp->hdr.sequence_number = htons(sbc_data->seq++);
450         mp->hdr.ssrc = htonl(1);
451         mp->payload.frame_count = 0;
452
453         while (bytes - consumed >= sbc_data->in_frame_len) {
454                 ssize_t written = 0;
455
456                 ret = sbc_encode(&sbc_data->enc, buffer + consumed,
457                                         sbc_data->in_frame_len,
458                                         mp->data + encoded, free_space,
459                                         &written);
460
461                 if (ret < 0) {
462                         error("SBC: failed to encode block");
463                         break;
464                 }
465
466                 mp->payload.frame_count++;
467
468                 consumed += ret;
469                 encoded += written;
470                 free_space -= written;
471
472                 /* write data if we either filled media packed or encoded all
473                  * input data
474                  */
475                 if (mp->payload.frame_count == sbc_data->frames_per_packet ||
476                                 bytes == consumed) {
477                         write_media_packet(fd, sbc_data, mp, encoded);
478
479                         encoded = 0;
480                         free_space = sbc_data->out_buf_size - sizeof(*mp);
481                         mp->payload.frame_count = 0;
482                 }
483         }
484
485         if (consumed != bytes) {
486                 /* we should encode all input data
487                  * if we did not, something went wrong but we can't really
488                  * handle this so this is just sanity check
489                  */
490                 error("SBC: failed to encode complete input buffer");
491         }
492
493         /* we always assume that all data was processed and sent */
494         return bytes;
495 }
496
497 static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
498                         void *param, size_t *rsp_len, void *rsp, int *fd)
499 {
500         ssize_t ret;
501         struct msghdr msg;
502         struct iovec iv[2];
503         struct hal_hdr cmd;
504         char cmsgbuf[CMSG_SPACE(sizeof(int))];
505         struct hal_status s;
506         size_t s_len = sizeof(s);
507
508         pthread_mutex_lock(&sk_mutex);
509
510         if (audio_sk < 0) {
511                 error("audio: Invalid cmd socket passed to audio_ipc_cmd");
512                 goto failed;
513         }
514
515         if (!rsp || !rsp_len) {
516                 memset(&s, 0, s_len);
517                 rsp_len = &s_len;
518                 rsp = &s;
519         }
520
521         memset(&msg, 0, sizeof(msg));
522         memset(&cmd, 0, sizeof(cmd));
523
524         cmd.service_id = service_id;
525         cmd.opcode = opcode;
526         cmd.len = len;
527
528         iv[0].iov_base = &cmd;
529         iv[0].iov_len = sizeof(cmd);
530
531         iv[1].iov_base = param;
532         iv[1].iov_len = len;
533
534         msg.msg_iov = iv;
535         msg.msg_iovlen = 2;
536
537         ret = sendmsg(audio_sk, &msg, 0);
538         if (ret < 0) {
539                 error("audio: Sending command failed:%s", strerror(errno));
540                 goto failed;
541         }
542
543         /* socket was shutdown */
544         if (ret == 0) {
545                 error("audio: Command socket closed");
546                 goto failed;
547         }
548
549         memset(&msg, 0, sizeof(msg));
550         memset(&cmd, 0, sizeof(cmd));
551
552         iv[0].iov_base = &cmd;
553         iv[0].iov_len = sizeof(cmd);
554
555         iv[1].iov_base = rsp;
556         iv[1].iov_len = *rsp_len;
557
558         msg.msg_iov = iv;
559         msg.msg_iovlen = 2;
560
561         if (fd) {
562                 memset(cmsgbuf, 0, sizeof(cmsgbuf));
563                 msg.msg_control = cmsgbuf;
564                 msg.msg_controllen = sizeof(cmsgbuf);
565         }
566
567         ret = recvmsg(audio_sk, &msg, 0);
568         if (ret < 0) {
569                 error("audio: Receiving command response failed:%s",
570                                                         strerror(errno));
571                 goto failed;
572         }
573
574         if (ret < (ssize_t) sizeof(cmd)) {
575                 error("audio: Too small response received(%zd bytes)", ret);
576                 goto failed;
577         }
578
579         if (cmd.service_id != service_id) {
580                 error("audio: Invalid service id (%u vs %u)", cmd.service_id,
581                                                                 service_id);
582                 goto failed;
583         }
584
585         if (ret != (ssize_t) (sizeof(cmd) + cmd.len)) {
586                 error("audio: Malformed response received(%zd bytes)", ret);
587                 goto failed;
588         }
589
590         if (cmd.opcode != opcode && cmd.opcode != AUDIO_OP_STATUS) {
591                 error("audio: Invalid opcode received (%u vs %u)",
592                                                 cmd.opcode, opcode);
593                 goto failed;
594         }
595
596         if (cmd.opcode == AUDIO_OP_STATUS) {
597                 struct hal_status *s = rsp;
598
599                 if (sizeof(*s) != cmd.len) {
600                         error("audio: Invalid status length");
601                         goto failed;
602                 }
603
604                 if (s->code == AUDIO_STATUS_SUCCESS) {
605                         error("audio: Invalid success status response");
606                         goto failed;
607                 }
608
609                 pthread_mutex_unlock(&sk_mutex);
610
611                 return s->code;
612         }
613
614         pthread_mutex_unlock(&sk_mutex);
615
616         /* Receive auxiliary data in msg */
617         if (fd) {
618                 struct cmsghdr *cmsg;
619
620                 *fd = -1;
621
622                 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg;
623                                         cmsg = CMSG_NXTHDR(&msg, cmsg)) {
624                         if (cmsg->cmsg_level == SOL_SOCKET
625                                         && cmsg->cmsg_type == SCM_RIGHTS) {
626                                 memcpy(fd, CMSG_DATA(cmsg), sizeof(int));
627                                 break;
628                         }
629                 }
630         }
631
632         if (rsp_len)
633                 *rsp_len = cmd.len;
634
635         return AUDIO_STATUS_SUCCESS;
636
637 failed:
638         /* Some serious issue happen on IPC - recover */
639         shutdown(audio_sk, SHUT_RDWR);
640         pthread_mutex_unlock(&sk_mutex);
641
642         return AUDIO_STATUS_FAILED;
643 }
644
645 static int ipc_open_cmd(const struct audio_codec *codec)
646 {
647         uint8_t buf[BLUEZ_AUDIO_MTU];
648         struct audio_cmd_open *cmd = (struct audio_cmd_open *) buf;
649         struct audio_rsp_open rsp;
650         size_t cmd_len = sizeof(buf) - sizeof(*cmd);
651         size_t rsp_len = sizeof(rsp);
652         int result;
653
654         DBG("");
655
656         memcpy(cmd->uuid, a2dp_src_uuid, sizeof(a2dp_src_uuid));
657
658         cmd->codec = codec->type;
659         cmd->presets = codec->get_presets(cmd->preset, &cmd_len);
660
661         cmd_len += sizeof(*cmd);
662
663         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_OPEN, cmd_len, cmd,
664                                 &rsp_len, &rsp, NULL);
665
666         if (result != AUDIO_STATUS_SUCCESS)
667                 return 0;
668
669         return rsp.id;
670 }
671
672 static int ipc_close_cmd(uint8_t endpoint_id)
673 {
674         struct audio_cmd_close cmd;
675         int result;
676
677         DBG("");
678
679         cmd.id = endpoint_id;
680
681         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_CLOSE,
682                                 sizeof(cmd), &cmd, NULL, NULL, NULL);
683
684         return result;
685 }
686
687 static int ipc_open_stream_cmd(uint8_t endpoint_id, uint16_t *mtu, int *fd,
688                                         struct audio_preset **caps)
689 {
690         char buf[BLUEZ_AUDIO_MTU];
691         struct audio_cmd_open_stream cmd;
692         struct audio_rsp_open_stream *rsp =
693                                         (struct audio_rsp_open_stream *) &buf;
694         size_t rsp_len = sizeof(buf);
695         int result;
696
697         DBG("");
698
699         if (!caps)
700                 return AUDIO_STATUS_FAILED;
701
702         cmd.id = endpoint_id;
703
704         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
705                                 sizeof(cmd), &cmd, &rsp_len, rsp, fd);
706
707         if (result == AUDIO_STATUS_SUCCESS) {
708                 size_t buf_len = sizeof(struct audio_preset) +
709                                         rsp->preset[0].len;
710                 *mtu = rsp->mtu;
711                 *caps = malloc(buf_len);
712                 memcpy(*caps, &rsp->preset, buf_len);
713         } else {
714                 *caps = NULL;
715         }
716
717         return result;
718 }
719
720 static int ipc_close_stream_cmd(uint8_t endpoint_id)
721 {
722         struct audio_cmd_close_stream cmd;
723         int result;
724
725         DBG("");
726
727         cmd.id = endpoint_id;
728
729         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_CLOSE_STREAM,
730                                 sizeof(cmd), &cmd, NULL, NULL, NULL);
731
732         return result;
733 }
734
735 static int ipc_resume_stream_cmd(uint8_t endpoint_id)
736 {
737         struct audio_cmd_resume_stream cmd;
738         int result;
739
740         DBG("");
741
742         cmd.id = endpoint_id;
743
744         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_RESUME_STREAM,
745                                 sizeof(cmd), &cmd, NULL, NULL, NULL);
746
747         return result;
748 }
749
750 static int ipc_suspend_stream_cmd(uint8_t endpoint_id)
751 {
752         struct audio_cmd_suspend_stream cmd;
753         int result;
754
755         DBG("");
756
757         cmd.id = endpoint_id;
758
759         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_SUSPEND_STREAM,
760                                 sizeof(cmd), &cmd, NULL, NULL, NULL);
761
762         return result;
763 }
764
765 static int register_endpoints(void)
766 {
767         struct audio_endpoint *ep = &audio_endpoints[0];
768         size_t i;
769
770         for (i = 0; i < NUM_CODECS; i++, ep++) {
771                 const struct audio_codec *codec = &audio_codecs[i];
772
773                 ep->id = ipc_open_cmd(codec);
774
775                 if (!ep->id)
776                         return AUDIO_STATUS_FAILED;
777
778                 ep->codec = codec;
779                 ep->codec_data = NULL;
780                 ep->fd = -1;
781         }
782
783         return AUDIO_STATUS_SUCCESS;
784 }
785
786 static void unregister_endpoints(void)
787 {
788         size_t i;
789
790         for (i = 0; i < MAX_AUDIO_ENDPOINTS; i++) {
791                 struct audio_endpoint *ep = &audio_endpoints[i];
792
793                 if (ep->id) {
794                         ipc_close_cmd(ep->id);
795                         memset(ep, 0, sizeof(*ep));
796                 }
797         }
798 }
799
800 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
801                                                                 size_t bytes)
802 {
803         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
804
805         /* We can auto-start only from standby */
806         if (out->audio_state == AUDIO_A2DP_STATE_STANDBY) {
807                 DBG("stream in standby, auto-start");
808
809                 if (ipc_resume_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
810                         return -1;
811
812                 out->ep->codec->resume(out->ep->codec_data);
813
814                 out->audio_state = AUDIO_A2DP_STATE_STARTED;
815         }
816
817         if (out->audio_state != AUDIO_A2DP_STATE_STARTED) {
818                 error("audio: stream not started");
819                 return -1;
820         }
821
822         if (out->ep->fd < 0) {
823                 error("audio: no transport socket");
824                 return -1;
825         }
826
827         return out->ep->codec->write_data(out->ep->codec_data, buffer,
828                                                 bytes, out->ep->fd);
829 }
830
831 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
832 {
833         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
834
835         DBG("");
836
837         return out->cfg.rate;
838 }
839
840 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
841 {
842         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
843
844         DBG("");
845
846         if (rate != out->cfg.rate) {
847                 warn("audio: cannot set sample rate to %d", rate);
848                 return -1;
849         }
850
851         return 0;
852 }
853
854 static size_t out_get_buffer_size(const struct audio_stream *stream)
855 {
856         DBG("");
857
858         /* We should return proper buffer size calculated by codec (so each
859          * input buffer is encoded into single media packed) but this does not
860          * work well with AudioFlinger and causes problems. For this reason we
861          * use magic value here and out_write code takes care of splitting
862          * input buffer into multiple media packets.
863          */
864         return 20 * 512;
865 }
866
867 static uint32_t out_get_channels(const struct audio_stream *stream)
868 {
869         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
870
871         DBG("");
872
873         return out->cfg.channels;
874 }
875
876 static audio_format_t out_get_format(const struct audio_stream *stream)
877 {
878         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
879
880         DBG("");
881
882         return out->cfg.format;
883 }
884
885 static int out_set_format(struct audio_stream *stream, audio_format_t format)
886 {
887         DBG("");
888         return -ENOSYS;
889 }
890
891 static int out_standby(struct audio_stream *stream)
892 {
893         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
894
895         DBG("");
896
897         if (out->audio_state == AUDIO_A2DP_STATE_STARTED) {
898                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
899                         return -1;
900                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
901         }
902
903         return 0;
904 }
905
906 static int out_dump(const struct audio_stream *stream, int fd)
907 {
908         DBG("");
909         return -ENOSYS;
910 }
911
912 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
913 {
914         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
915         char *kvpair;
916         char *str;
917         char *saveptr;
918         bool enter_suspend = false;
919         bool exit_suspend = false;
920
921         DBG("%s", kvpairs);
922
923         str = strdup(kvpairs);
924         kvpair = strtok_r(str, ";", &saveptr);
925
926         for (; kvpair && *kvpair; kvpair = strtok_r(NULL, ";", &saveptr)) {
927                 char *keyval;
928
929                 keyval = strchr(kvpair, '=');
930                 if (!keyval)
931                         continue;
932
933                 *keyval = '\0';
934                 keyval++;
935
936                 if (!strcmp(kvpair, "closing")) {
937                         if (!strcmp(keyval, "true"))
938                                 out->audio_state = AUDIO_A2DP_STATE_NONE;
939                 } else if (!strcmp(kvpair, "A2dpSuspended")) {
940                         if (!strcmp(keyval, "true"))
941                                 enter_suspend = true;
942                         else
943                                 exit_suspend = true;
944                 }
945         }
946
947         free(str);
948
949         if (enter_suspend && out->audio_state == AUDIO_A2DP_STATE_STARTED) {
950                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
951                         return -1;
952                 out->audio_state = AUDIO_A2DP_STATE_SUSPENDED;
953         }
954
955         if (exit_suspend && out->audio_state == AUDIO_A2DP_STATE_SUSPENDED)
956                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
957
958         return 0;
959 }
960
961 static char *out_get_parameters(const struct audio_stream *stream,
962                                                         const char *keys)
963 {
964         DBG("");
965         return strdup("");
966 }
967
968 static uint32_t out_get_latency(const struct audio_stream_out *stream)
969 {
970         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
971         struct audio_endpoint *ep = out->ep;
972         size_t pkt_duration;
973
974         DBG("");
975
976         pkt_duration = ep->codec->get_mediapacket_duration(ep->codec_data);
977
978         return FIXED_A2DP_PLAYBACK_LATENCY_MS + pkt_duration / 1000;
979 }
980
981 static int out_set_volume(struct audio_stream_out *stream, float left,
982                                                                 float right)
983 {
984         DBG("");
985         /* volume controlled in audioflinger mixer (digital) */
986         return -ENOSYS;
987 }
988
989 static int out_get_render_position(const struct audio_stream_out *stream,
990                                                         uint32_t *dsp_frames)
991 {
992         DBG("");
993         return -ENOSYS;
994 }
995
996 static int out_add_audio_effect(const struct audio_stream *stream,
997                                                         effect_handle_t effect)
998 {
999         DBG("");
1000         return -ENOSYS;
1001 }
1002
1003 static int out_remove_audio_effect(const struct audio_stream *stream,
1004                                                         effect_handle_t effect)
1005 {
1006         DBG("");
1007         return -ENOSYS;
1008 }
1009
1010 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
1011 {
1012         DBG("");
1013         return -ENOSYS;
1014 }
1015
1016 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1017 {
1018         DBG("");
1019         return -ENOSYS;
1020 }
1021
1022 static size_t in_get_buffer_size(const struct audio_stream *stream)
1023 {
1024         DBG("");
1025         return -ENOSYS;
1026 }
1027
1028 static uint32_t in_get_channels(const struct audio_stream *stream)
1029 {
1030         DBG("");
1031         return -ENOSYS;
1032 }
1033
1034 static audio_format_t in_get_format(const struct audio_stream *stream)
1035 {
1036         DBG("");
1037         return -ENOSYS;
1038 }
1039
1040 static int in_set_format(struct audio_stream *stream, audio_format_t format)
1041 {
1042         DBG("");
1043         return -ENOSYS;
1044 }
1045
1046 static int in_standby(struct audio_stream *stream)
1047 {
1048         DBG("");
1049         return -ENOSYS;
1050 }
1051
1052 static int in_dump(const struct audio_stream *stream, int fd)
1053 {
1054         DBG("");
1055         return -ENOSYS;
1056 }
1057
1058 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
1059 {
1060         DBG("");
1061         return -ENOSYS;
1062 }
1063
1064 static char *in_get_parameters(const struct audio_stream *stream,
1065                                                         const char *keys)
1066 {
1067         DBG("");
1068         return strdup("");
1069 }
1070
1071 static int in_set_gain(struct audio_stream_in *stream, float gain)
1072 {
1073         DBG("");
1074         return -ENOSYS;
1075 }
1076
1077 static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
1078                                                                 size_t bytes)
1079 {
1080         DBG("");
1081         return -ENOSYS;
1082 }
1083
1084 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
1085 {
1086         DBG("");
1087         return -ENOSYS;
1088 }
1089
1090 static int in_add_audio_effect(const struct audio_stream *stream,
1091                                                         effect_handle_t effect)
1092 {
1093         DBG("");
1094         return -ENOSYS;
1095 }
1096
1097 static int in_remove_audio_effect(const struct audio_stream *stream,
1098                                                         effect_handle_t effect)
1099 {
1100         DBG("");
1101         return -ENOSYS;
1102 }
1103
1104 static int audio_open_output_stream(struct audio_hw_device *dev,
1105                                         audio_io_handle_t handle,
1106                                         audio_devices_t devices,
1107                                         audio_output_flags_t flags,
1108                                         struct audio_config *config,
1109                                         struct audio_stream_out **stream_out)
1110
1111 {
1112         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1113         struct a2dp_stream_out *out;
1114         struct audio_preset *preset;
1115         const struct audio_codec *codec;
1116         uint16_t mtu;
1117         int fd;
1118
1119         out = calloc(1, sizeof(struct a2dp_stream_out));
1120         if (!out)
1121                 return -ENOMEM;
1122
1123         DBG("");
1124
1125         out->stream.common.get_sample_rate = out_get_sample_rate;
1126         out->stream.common.set_sample_rate = out_set_sample_rate;
1127         out->stream.common.get_buffer_size = out_get_buffer_size;
1128         out->stream.common.get_channels = out_get_channels;
1129         out->stream.common.get_format = out_get_format;
1130         out->stream.common.set_format = out_set_format;
1131         out->stream.common.standby = out_standby;
1132         out->stream.common.dump = out_dump;
1133         out->stream.common.set_parameters = out_set_parameters;
1134         out->stream.common.get_parameters = out_get_parameters;
1135         out->stream.common.add_audio_effect = out_add_audio_effect;
1136         out->stream.common.remove_audio_effect = out_remove_audio_effect;
1137         out->stream.get_latency = out_get_latency;
1138         out->stream.set_volume = out_set_volume;
1139         out->stream.write = out_write;
1140         out->stream.get_render_position = out_get_render_position;
1141
1142         /* TODO: for now we always use endpoint 0 */
1143         out->ep = &audio_endpoints[0];
1144
1145         if (ipc_open_stream_cmd(out->ep->id, &mtu, &fd, &preset) !=
1146                         AUDIO_STATUS_SUCCESS)
1147                 goto fail;
1148
1149         if (!preset || fd < 0)
1150                 goto fail;
1151
1152         out->ep->fd = fd;
1153
1154         codec = out->ep->codec;
1155
1156         codec->init(preset, mtu, &out->ep->codec_data);
1157         codec->get_config(out->ep->codec_data, &out->cfg);
1158
1159         DBG("rate=%d channels=%d format=%d", out->cfg.rate,
1160                         out->cfg.channels, out->cfg.format);
1161
1162         free(preset);
1163
1164         *stream_out = &out->stream;
1165         a2dp_dev->out = out;
1166
1167         out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1168
1169         return 0;
1170
1171 fail:
1172         error("audio: cannot open output stream");
1173         free(out);
1174         *stream_out = NULL;
1175         return -EIO;
1176 }
1177
1178 static void audio_close_output_stream(struct audio_hw_device *dev,
1179                                         struct audio_stream_out *stream)
1180 {
1181         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1182         struct audio_endpoint *ep = a2dp_dev->out->ep;
1183
1184         DBG("");
1185
1186         ipc_close_stream_cmd(ep->id);
1187
1188         if (ep->fd >= 0) {
1189                 close(ep->fd);
1190                 ep->fd = -1;
1191         }
1192
1193         ep->codec->cleanup(ep->codec_data);
1194         ep->codec_data = NULL;
1195
1196         free(stream);
1197         a2dp_dev->out = NULL;
1198 }
1199
1200 static int audio_set_parameters(struct audio_hw_device *dev,
1201                                                         const char *kvpairs)
1202 {
1203         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1204         struct a2dp_stream_out *out = a2dp_dev->out;
1205
1206         DBG("");
1207
1208         if (!out)
1209                 return 0;
1210
1211         return out->stream.common.set_parameters((struct audio_stream *) out,
1212                                                         kvpairs);
1213 }
1214
1215 static char *audio_get_parameters(const struct audio_hw_device *dev,
1216                                                         const char *keys)
1217 {
1218         DBG("");
1219         return strdup("");
1220 }
1221
1222 static int audio_init_check(const struct audio_hw_device *dev)
1223 {
1224         DBG("");
1225         return 0;
1226 }
1227
1228 static int audio_set_voice_volume(struct audio_hw_device *dev, float volume)
1229 {
1230         DBG("");
1231         return -ENOSYS;
1232 }
1233
1234 static int audio_set_master_volume(struct audio_hw_device *dev, float volume)
1235 {
1236         DBG("");
1237         return -ENOSYS;
1238 }
1239
1240 static int audio_set_mode(struct audio_hw_device *dev, int mode)
1241 {
1242         DBG("");
1243         return -ENOSYS;
1244 }
1245
1246 static int audio_set_mic_mute(struct audio_hw_device *dev, bool state)
1247 {
1248         DBG("");
1249         return -ENOSYS;
1250 }
1251
1252 static int audio_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1253 {
1254         DBG("");
1255         return -ENOSYS;
1256 }
1257
1258 static size_t audio_get_input_buffer_size(const struct audio_hw_device *dev,
1259                                         const struct audio_config *config)
1260 {
1261         DBG("");
1262         return -ENOSYS;
1263 }
1264
1265 static int audio_open_input_stream(struct audio_hw_device *dev,
1266                                         audio_io_handle_t handle,
1267                                         audio_devices_t devices,
1268                                         struct audio_config *config,
1269                                         struct audio_stream_in **stream_in)
1270 {
1271         struct audio_stream_in *in;
1272
1273         DBG("");
1274
1275         in = calloc(1, sizeof(struct audio_stream_in));
1276         if (!in)
1277                 return -ENOMEM;
1278
1279         in->common.get_sample_rate = in_get_sample_rate;
1280         in->common.set_sample_rate = in_set_sample_rate;
1281         in->common.get_buffer_size = in_get_buffer_size;
1282         in->common.get_channels = in_get_channels;
1283         in->common.get_format = in_get_format;
1284         in->common.set_format = in_set_format;
1285         in->common.standby = in_standby;
1286         in->common.dump = in_dump;
1287         in->common.set_parameters = in_set_parameters;
1288         in->common.get_parameters = in_get_parameters;
1289         in->common.add_audio_effect = in_add_audio_effect;
1290         in->common.remove_audio_effect = in_remove_audio_effect;
1291         in->set_gain = in_set_gain;
1292         in->read = in_read;
1293         in->get_input_frames_lost = in_get_input_frames_lost;
1294
1295         *stream_in = in;
1296
1297         return 0;
1298 }
1299
1300 static void audio_close_input_stream(struct audio_hw_device *dev,
1301                                         struct audio_stream_in *stream_in)
1302 {
1303         DBG("");
1304         free(stream_in);
1305 }
1306
1307 static int audio_dump(const audio_hw_device_t *device, int fd)
1308 {
1309         DBG("");
1310         return -ENOSYS;
1311 }
1312
1313 static int audio_close(hw_device_t *device)
1314 {
1315         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *)device;
1316
1317         DBG("");
1318
1319         unregister_endpoints();
1320
1321         shutdown(listen_sk, SHUT_RDWR);
1322         shutdown(audio_sk, SHUT_RDWR);
1323
1324         pthread_join(ipc_th, NULL);
1325
1326         close(listen_sk);
1327         listen_sk = -1;
1328
1329         free(a2dp_dev);
1330         return 0;
1331 }
1332
1333 static void *ipc_handler(void *data)
1334 {
1335         bool done = false;
1336         struct pollfd pfd;
1337         int sk;
1338
1339         DBG("");
1340
1341         while (!done) {
1342                 DBG("Waiting for connection ...");
1343
1344                 sk = accept(listen_sk, NULL, NULL);
1345                 if (sk < 0) {
1346                         int err = errno;
1347
1348                         if (err == EINTR)
1349                                 continue;
1350
1351                         if (err != ECONNABORTED && err != EINVAL)
1352                                 error("audio: Failed to accept socket: %d (%s)",
1353                                                         err, strerror(err));
1354
1355                         break;
1356                 }
1357
1358                 pthread_mutex_lock(&sk_mutex);
1359                 audio_sk = sk;
1360                 pthread_mutex_unlock(&sk_mutex);
1361
1362                 DBG("Audio IPC: Connected");
1363
1364                 if (register_endpoints() != AUDIO_STATUS_SUCCESS) {
1365                         error("audio: Failed to register endpoints");
1366
1367                         unregister_endpoints();
1368
1369                         pthread_mutex_lock(&sk_mutex);
1370                         shutdown(audio_sk, SHUT_RDWR);
1371                         close(audio_sk);
1372                         audio_sk = -1;
1373                         pthread_mutex_unlock(&sk_mutex);
1374
1375                         continue;
1376                 }
1377
1378                 memset(&pfd, 0, sizeof(pfd));
1379                 pfd.fd = audio_sk;
1380                 pfd.events = POLLHUP | POLLERR | POLLNVAL;
1381
1382                 /* Check if socket is still alive. Empty while loop.*/
1383                 while (poll(&pfd, 1, -1) < 0 && errno == EINTR);
1384
1385                 if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL)) {
1386                         info("Audio HAL: Socket closed");
1387
1388                         pthread_mutex_lock(&sk_mutex);
1389                         close(audio_sk);
1390                         audio_sk = -1;
1391                         pthread_mutex_unlock(&sk_mutex);
1392                 }
1393         }
1394
1395         /* audio_sk is closed at this point, just cleanup endpoints states */
1396         memset(audio_endpoints, 0, sizeof(audio_endpoints));
1397
1398         info("Closing Audio IPC thread");
1399         return NULL;
1400 }
1401
1402 static int audio_ipc_init(void)
1403 {
1404         struct sockaddr_un addr;
1405         int err;
1406         int sk;
1407
1408         DBG("");
1409
1410         sk = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
1411         if (sk < 0) {
1412                 err = errno;
1413                 error("audio: Failed to create socket: %d (%s)", err,
1414                                                                 strerror(err));
1415                 return err;
1416         }
1417
1418         memset(&addr, 0, sizeof(addr));
1419         addr.sun_family = AF_UNIX;
1420
1421         memcpy(addr.sun_path, BLUEZ_AUDIO_SK_PATH,
1422                                         sizeof(BLUEZ_AUDIO_SK_PATH));
1423
1424         if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1425                 err = errno;
1426                 error("audio: Failed to bind socket: %d (%s)", err,
1427                                                                 strerror(err));
1428                 goto failed;
1429         }
1430
1431         if (listen(sk, 1) < 0) {
1432                 err = errno;
1433                 error("audio: Failed to listen on the socket: %d (%s)", err,
1434                                                                 strerror(err));
1435                 goto failed;
1436         }
1437
1438         listen_sk = sk;
1439
1440         err = pthread_create(&ipc_th, NULL, ipc_handler, NULL);
1441         if (err) {
1442                 err = -err;
1443                 ipc_th = 0;
1444                 error("audio: Failed to start Audio IPC thread: %d (%s)",
1445                                                         err, strerror(err));
1446                 goto failed;
1447         }
1448
1449         return 0;
1450
1451 failed:
1452         close(sk);
1453         return err;
1454 }
1455
1456 static int audio_open(const hw_module_t *module, const char *name,
1457                                                         hw_device_t **device)
1458 {
1459         struct a2dp_audio_dev *a2dp_dev;
1460         int err;
1461
1462         DBG("");
1463
1464         if (strcmp(name, AUDIO_HARDWARE_INTERFACE)) {
1465                 error("audio: interface %s not matching [%s]", name,
1466                                                 AUDIO_HARDWARE_INTERFACE);
1467                 return -EINVAL;
1468         }
1469
1470         err = audio_ipc_init();
1471         if (err)
1472                 return -err;
1473
1474         a2dp_dev = calloc(1, sizeof(struct a2dp_audio_dev));
1475         if (!a2dp_dev)
1476                 return -ENOMEM;
1477
1478         a2dp_dev->dev.common.tag = HARDWARE_DEVICE_TAG;
1479         a2dp_dev->dev.common.version = AUDIO_DEVICE_API_VERSION_CURRENT;
1480         a2dp_dev->dev.common.module = (struct hw_module_t *) module;
1481         a2dp_dev->dev.common.close = audio_close;
1482
1483         a2dp_dev->dev.init_check = audio_init_check;
1484         a2dp_dev->dev.set_voice_volume = audio_set_voice_volume;
1485         a2dp_dev->dev.set_master_volume = audio_set_master_volume;
1486         a2dp_dev->dev.set_mode = audio_set_mode;
1487         a2dp_dev->dev.set_mic_mute = audio_set_mic_mute;
1488         a2dp_dev->dev.get_mic_mute = audio_get_mic_mute;
1489         a2dp_dev->dev.set_parameters = audio_set_parameters;
1490         a2dp_dev->dev.get_parameters = audio_get_parameters;
1491         a2dp_dev->dev.get_input_buffer_size = audio_get_input_buffer_size;
1492         a2dp_dev->dev.open_output_stream = audio_open_output_stream;
1493         a2dp_dev->dev.close_output_stream = audio_close_output_stream;
1494         a2dp_dev->dev.open_input_stream = audio_open_input_stream;
1495         a2dp_dev->dev.close_input_stream = audio_close_input_stream;
1496         a2dp_dev->dev.dump = audio_dump;
1497
1498         /* Note that &a2dp_dev->dev.common is the same pointer as a2dp_dev.
1499          * This results from the structure of following structs:a2dp_audio_dev,
1500          * audio_hw_device. We will rely on this later in the code.*/
1501         *device = &a2dp_dev->dev.common;
1502
1503         return 0;
1504 }
1505
1506 static struct hw_module_methods_t hal_module_methods = {
1507         .open = audio_open,
1508 };
1509
1510 struct audio_module HAL_MODULE_INFO_SYM = {
1511         .common = {
1512         .tag = HARDWARE_MODULE_TAG,
1513         .version_major = 1,
1514         .version_minor = 0,
1515         .id = AUDIO_HARDWARE_MODULE_ID,
1516         .name = "A2DP Bluez HW HAL",
1517         .author = "Intel Corporation",
1518         .methods = &hal_module_methods,
1519         },
1520 };