OSDN Git Service

android/hal-audio: Make code readable
[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 #include <fcntl.h>
29
30 #include <hardware/audio.h>
31 #include <hardware/hardware.h>
32
33 #include <sbc/sbc.h>
34
35 #include "audio-msg.h"
36 #include "ipc-common.h"
37 #include "hal-log.h"
38 #include "hal-msg.h"
39 #include "../profiles/audio/a2dp-codecs.h"
40 #include "../src/shared/util.h"
41
42 #define FIXED_A2DP_PLAYBACK_LATENCY_MS 25
43
44 #define FIXED_BUFFER_SIZE (20 * 512)
45
46 #define MAX_FRAMES_IN_PAYLOAD 15
47
48 #define MAX_DELAY       100000 /* 100ms */
49
50 #define SBC_QUALITY_MIN_BITPOOL 33
51 #define SBC_QUALITY_STEP        5
52
53 static const uint8_t a2dp_src_uuid[] = {
54                 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x10, 0x00,
55                 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb };
56
57 static int listen_sk = -1;
58 static int audio_sk = -1;
59
60 static pthread_t ipc_th = 0;
61 static pthread_mutex_t sk_mutex = PTHREAD_MUTEX_INITIALIZER;
62
63 #if __BYTE_ORDER == __LITTLE_ENDIAN
64
65 struct rtp_header {
66         unsigned cc:4;
67         unsigned x:1;
68         unsigned p:1;
69         unsigned v:2;
70
71         unsigned pt:7;
72         unsigned m:1;
73
74         uint16_t sequence_number;
75         uint32_t timestamp;
76         uint32_t ssrc;
77         uint32_t csrc[0];
78 } __attribute__ ((packed));
79
80 struct rtp_payload {
81         unsigned frame_count:4;
82         unsigned rfa0:1;
83         unsigned is_last_fragment:1;
84         unsigned is_first_fragment:1;
85         unsigned is_fragmented:1;
86 } __attribute__ ((packed));
87
88 #elif __BYTE_ORDER == __BIG_ENDIAN
89
90 struct rtp_header {
91         unsigned v:2;
92         unsigned p:1;
93         unsigned x:1;
94         unsigned cc:4;
95
96         unsigned m:1;
97         unsigned pt:7;
98
99         uint16_t sequence_number;
100         uint32_t timestamp;
101         uint32_t ssrc;
102         uint32_t csrc[0];
103 } __attribute__ ((packed));
104
105 struct rtp_payload {
106         unsigned is_fragmented:1;
107         unsigned is_first_fragment:1;
108         unsigned is_last_fragment:1;
109         unsigned rfa0:1;
110         unsigned frame_count:4;
111 } __attribute__ ((packed));
112
113 #else
114 #error "Unknown byte order"
115 #endif
116
117 struct media_packet {
118         struct rtp_header hdr;
119         struct rtp_payload payload;
120         uint8_t data[0];
121 };
122
123 struct audio_input_config {
124         uint32_t rate;
125         uint32_t channels;
126         audio_format_t format;
127 };
128
129 struct sbc_data {
130         a2dp_sbc_t sbc;
131
132         sbc_t enc;
133
134         uint16_t payload_len;
135
136         size_t in_frame_len;
137         size_t in_buf_size;
138
139         size_t out_frame_len;
140
141         unsigned frame_duration;
142         unsigned frames_per_packet;
143 };
144
145 static void timespec_add(struct timespec *base, uint64_t time_us,
146                                                         struct timespec *res)
147 {
148         res->tv_sec = base->tv_sec + time_us / 1000000;
149         res->tv_nsec = base->tv_nsec + (time_us % 1000000) * 1000;
150
151         if (res->tv_nsec >= 1000000000) {
152                 res->tv_sec++;
153                 res->tv_nsec -= 1000000000;
154         }
155 }
156
157 static void timespec_diff(struct timespec *a, struct timespec *b,
158                                                         struct timespec *res)
159 {
160         res->tv_sec = a->tv_sec - b->tv_sec;
161         res->tv_nsec = a->tv_nsec - b->tv_nsec;
162
163         if (res->tv_nsec < 0) {
164                 res->tv_sec--;
165                 res->tv_nsec += 1000000000; /* 1sec */
166         }
167 }
168
169 static uint64_t timespec_diff_us(struct timespec *a, struct timespec *b)
170 {
171         struct timespec res;
172
173         timespec_diff(a, b, &res);
174
175         return res.tv_sec * 1000000ll + res.tv_nsec / 1000ll;
176 }
177
178 #if defined(ANDROID)
179 /* Bionic does not have clock_nanosleep() prototype in time.h even though
180  * it provides its implementation.
181  */
182 extern int clock_nanosleep(clockid_t clock_id, int flags,
183                                         const struct timespec *request,
184                                         struct timespec *remain);
185 #endif
186
187 static int sbc_get_presets(struct audio_preset *preset, size_t *len);
188 static int sbc_codec_init(struct audio_preset *preset, uint16_t mtu,
189                                                         void **codec_data);
190 static int sbc_cleanup(void *codec_data);
191 static int sbc_get_config(void *codec_data, struct audio_input_config *config);
192 static size_t sbc_get_buffer_size(void *codec_data);
193 static size_t sbc_get_mediapacket_duration(void *codec_data);
194 static ssize_t sbc_encode_mediapacket(void *codec_data, const uint8_t *buffer,
195                                         size_t len, struct media_packet *mp,
196                                         size_t mp_data_len, size_t *written);
197 static bool sbc_update_qos(void *codec_data, uint8_t op);
198
199 #define QOS_POLICY_DEFAULT      0x00
200 #define QOS_POLICY_DECREASE     0x01
201
202 struct audio_codec {
203         uint8_t type;
204
205         int (*get_presets) (struct audio_preset *preset, size_t *len);
206
207         int (*init) (struct audio_preset *preset, uint16_t mtu,
208                                 void **codec_data);
209         int (*cleanup) (void *codec_data);
210         int (*get_config) (void *codec_data,
211                                         struct audio_input_config *config);
212         size_t (*get_buffer_size) (void *codec_data);
213         size_t (*get_mediapacket_duration) (void *codec_data);
214         ssize_t (*encode_mediapacket) (void *codec_data, const uint8_t *buffer,
215                                         size_t len, struct media_packet *mp,
216                                         size_t mp_data_len, size_t *written);
217         bool (*update_qos) (void *codec_data, uint8_t op);
218 };
219
220 static const struct audio_codec audio_codecs[] = {
221         {
222                 .type = A2DP_CODEC_SBC,
223
224                 .get_presets = sbc_get_presets,
225
226                 .init = sbc_codec_init,
227                 .cleanup = sbc_cleanup,
228                 .get_config = sbc_get_config,
229                 .get_buffer_size = sbc_get_buffer_size,
230                 .get_mediapacket_duration = sbc_get_mediapacket_duration,
231                 .encode_mediapacket = sbc_encode_mediapacket,
232                 .update_qos = sbc_update_qos,
233         }
234 };
235
236 #define NUM_CODECS (sizeof(audio_codecs) / sizeof(audio_codecs[0]))
237
238 #define MAX_AUDIO_ENDPOINTS NUM_CODECS
239
240 struct audio_endpoint {
241         uint8_t id;
242         const struct audio_codec *codec;
243         void *codec_data;
244         int fd;
245
246         struct media_packet *mp;
247         size_t mp_data_len;
248
249         uint16_t seq;
250         uint32_t samples;
251         struct timespec start;
252
253         bool resync;
254 };
255
256 static struct audio_endpoint audio_endpoints[MAX_AUDIO_ENDPOINTS];
257
258 enum a2dp_state_t {
259         AUDIO_A2DP_STATE_NONE,
260         AUDIO_A2DP_STATE_STANDBY,
261         AUDIO_A2DP_STATE_SUSPENDED,
262         AUDIO_A2DP_STATE_STARTED
263 };
264
265 struct a2dp_stream_out {
266         struct audio_stream_out stream;
267
268         struct audio_endpoint *ep;
269         enum a2dp_state_t audio_state;
270         struct audio_input_config cfg;
271
272         uint8_t *downmix_buf;
273 };
274
275 struct a2dp_audio_dev {
276         struct audio_hw_device dev;
277         struct a2dp_stream_out *out;
278 };
279
280 static const a2dp_sbc_t sbc_presets[] = {
281         {
282                 .frequency = SBC_SAMPLING_FREQ_44100 | SBC_SAMPLING_FREQ_48000,
283                 .channel_mode = SBC_CHANNEL_MODE_MONO |
284                                 SBC_CHANNEL_MODE_DUAL_CHANNEL |
285                                 SBC_CHANNEL_MODE_STEREO |
286                                 SBC_CHANNEL_MODE_JOINT_STEREO,
287                 .subbands = SBC_SUBBANDS_4 | SBC_SUBBANDS_8,
288                 .allocation_method = SBC_ALLOCATION_SNR |
289                                         SBC_ALLOCATION_LOUDNESS,
290                 .block_length = SBC_BLOCK_LENGTH_4 | SBC_BLOCK_LENGTH_8 |
291                                 SBC_BLOCK_LENGTH_12 | SBC_BLOCK_LENGTH_16,
292                 .min_bitpool = MIN_BITPOOL,
293                 .max_bitpool = MAX_BITPOOL
294         },
295         {
296                 .frequency = SBC_SAMPLING_FREQ_44100,
297                 .channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO,
298                 .subbands = SBC_SUBBANDS_8,
299                 .allocation_method = SBC_ALLOCATION_LOUDNESS,
300                 .block_length = SBC_BLOCK_LENGTH_16,
301                 .min_bitpool = MIN_BITPOOL,
302                 .max_bitpool = MAX_BITPOOL
303         },
304         {
305                 .frequency = SBC_SAMPLING_FREQ_48000,
306                 .channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO,
307                 .subbands = SBC_SUBBANDS_8,
308                 .allocation_method = SBC_ALLOCATION_LOUDNESS,
309                 .block_length = SBC_BLOCK_LENGTH_16,
310                 .min_bitpool = MIN_BITPOOL,
311                 .max_bitpool = MAX_BITPOOL
312         },
313 };
314
315 static int sbc_get_presets(struct audio_preset *preset, size_t *len)
316 {
317         int i;
318         int count;
319         size_t new_len = 0;
320         uint8_t *ptr = (uint8_t *) preset;
321         size_t preset_size = sizeof(*preset) + sizeof(a2dp_sbc_t);
322
323         count = sizeof(sbc_presets) / sizeof(sbc_presets[0]);
324
325         for (i = 0; i < count; i++) {
326                 preset = (struct audio_preset *) ptr;
327
328                 if (new_len + preset_size > *len)
329                         break;
330
331                 preset->len = sizeof(a2dp_sbc_t);
332                 memcpy(preset->data, &sbc_presets[i], preset->len);
333
334                 new_len += preset_size;
335                 ptr += preset_size;
336         }
337
338         *len = new_len;
339
340         return i;
341 }
342
343 static int sbc_freq2int(uint8_t freq)
344 {
345         switch (freq) {
346         case SBC_SAMPLING_FREQ_16000:
347                 return 16000;
348         case SBC_SAMPLING_FREQ_32000:
349                 return 32000;
350         case SBC_SAMPLING_FREQ_44100:
351                 return 44100;
352         case SBC_SAMPLING_FREQ_48000:
353                 return 48000;
354         default:
355                 return 0;
356         }
357 }
358
359 static const char *sbc_mode2str(uint8_t mode)
360 {
361         switch (mode) {
362         case SBC_CHANNEL_MODE_MONO:
363                 return "Mono";
364         case SBC_CHANNEL_MODE_DUAL_CHANNEL:
365                 return "DualChannel";
366         case SBC_CHANNEL_MODE_STEREO:
367                 return "Stereo";
368         case SBC_CHANNEL_MODE_JOINT_STEREO:
369                 return "JointStereo";
370         default:
371                 return "(unknown)";
372         }
373 }
374
375 static int sbc_blocks2int(uint8_t blocks)
376 {
377         switch (blocks) {
378         case SBC_BLOCK_LENGTH_4:
379                 return 4;
380         case SBC_BLOCK_LENGTH_8:
381                 return 8;
382         case SBC_BLOCK_LENGTH_12:
383                 return 12;
384         case SBC_BLOCK_LENGTH_16:
385                 return 16;
386         default:
387                 return 0;
388         }
389 }
390
391 static int sbc_subbands2int(uint8_t subbands)
392 {
393         switch (subbands) {
394         case SBC_SUBBANDS_4:
395                 return 4;
396         case SBC_SUBBANDS_8:
397                 return 8;
398         default:
399                 return 0;
400         }
401 }
402
403 static const char *sbc_allocation2str(uint8_t allocation)
404 {
405         switch (allocation) {
406         case SBC_ALLOCATION_SNR:
407                 return "SNR";
408         case SBC_ALLOCATION_LOUDNESS:
409                 return "Loudness";
410         default:
411                 return "(unknown)";
412         }
413 }
414
415 static void sbc_init_encoder(struct sbc_data *sbc_data)
416 {
417         a2dp_sbc_t *in = &sbc_data->sbc;
418         sbc_t *out = &sbc_data->enc;
419
420         sbc_init_a2dp(out, 0L, in, sizeof(*in));
421
422         out->endian = SBC_LE;
423         out->bitpool = in->max_bitpool;
424
425         DBG("frequency=%d channel_mode=%s block_length=%d subbands=%d "
426                         "allocation=%s bitpool=%d-%d",
427                         sbc_freq2int(in->frequency),
428                         sbc_mode2str(in->channel_mode),
429                         sbc_blocks2int(in->block_length),
430                         sbc_subbands2int(in->subbands),
431                         sbc_allocation2str(in->allocation_method),
432                         in->min_bitpool, in->max_bitpool);
433 }
434
435 static void sbc_codec_calculate(struct sbc_data *sbc_data)
436 {
437         size_t in_frame_len;
438         size_t out_frame_len;
439         size_t num_frames;
440
441         in_frame_len = sbc_get_codesize(&sbc_data->enc);
442         out_frame_len = sbc_get_frame_length(&sbc_data->enc);
443         num_frames = sbc_data->payload_len / out_frame_len;
444
445         sbc_data->in_frame_len = in_frame_len;
446         sbc_data->in_buf_size = num_frames * in_frame_len;
447
448         sbc_data->out_frame_len = out_frame_len;
449
450         sbc_data->frame_duration = sbc_get_frame_duration(&sbc_data->enc);
451         sbc_data->frames_per_packet = num_frames;
452
453         DBG("in_frame_len=%zu out_frame_len=%zu frames_per_packet=%zu",
454                                 in_frame_len, out_frame_len, num_frames);
455 }
456
457 static int sbc_codec_init(struct audio_preset *preset, uint16_t payload_len,
458                                                         void **codec_data)
459 {
460         struct sbc_data *sbc_data;
461
462         if (preset->len != sizeof(a2dp_sbc_t)) {
463                 error("SBC: preset size mismatch");
464                 return AUDIO_STATUS_FAILED;
465         }
466
467         sbc_data = calloc(sizeof(struct sbc_data), 1);
468         if (!sbc_data)
469                 return AUDIO_STATUS_FAILED;
470
471         memcpy(&sbc_data->sbc, preset->data, preset->len);
472
473         sbc_init_encoder(sbc_data);
474
475         sbc_data->payload_len = payload_len;
476
477         sbc_codec_calculate(sbc_data);
478
479         *codec_data = sbc_data;
480
481         return AUDIO_STATUS_SUCCESS;
482 }
483
484 static int sbc_cleanup(void *codec_data)
485 {
486         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
487
488         sbc_finish(&sbc_data->enc);
489         free(codec_data);
490
491         return AUDIO_STATUS_SUCCESS;
492 }
493
494 static int sbc_get_config(void *codec_data, struct audio_input_config *config)
495 {
496         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
497
498         switch (sbc_data->sbc.frequency) {
499         case SBC_SAMPLING_FREQ_16000:
500                 config->rate = 16000;
501                 break;
502         case SBC_SAMPLING_FREQ_32000:
503                 config->rate = 32000;
504                 break;
505         case SBC_SAMPLING_FREQ_44100:
506                 config->rate = 44100;
507                 break;
508         case SBC_SAMPLING_FREQ_48000:
509                 config->rate = 48000;
510                 break;
511         default:
512                 return AUDIO_STATUS_FAILED;
513         }
514         config->channels = sbc_data->sbc.channel_mode == SBC_CHANNEL_MODE_MONO ?
515                                 AUDIO_CHANNEL_OUT_MONO :
516                                 AUDIO_CHANNEL_OUT_STEREO;
517         config->format = AUDIO_FORMAT_PCM_16_BIT;
518
519         return AUDIO_STATUS_SUCCESS;
520 }
521
522 static size_t sbc_get_buffer_size(void *codec_data)
523 {
524         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
525
526         return sbc_data->in_buf_size;
527 }
528
529 static size_t sbc_get_mediapacket_duration(void *codec_data)
530 {
531         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
532
533         return sbc_data->frame_duration * sbc_data->frames_per_packet;
534 }
535
536 static ssize_t sbc_encode_mediapacket(void *codec_data, const uint8_t *buffer,
537                                         size_t len, struct media_packet *mp,
538                                         size_t mp_data_len, size_t *written)
539 {
540         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
541         size_t consumed = 0;
542         size_t encoded = 0;
543         uint8_t frame_count = 0;
544
545         while (len - consumed >= sbc_data->in_frame_len &&
546                         mp_data_len - encoded >= sbc_data->out_frame_len &&
547                         frame_count < MAX_FRAMES_IN_PAYLOAD) {
548                 ssize_t read;
549                 ssize_t written = 0;
550
551                 read = sbc_encode(&sbc_data->enc, buffer + consumed,
552                                 sbc_data->in_frame_len, mp->data + encoded,
553                                 mp_data_len - encoded, &written);
554
555                 if (read < 0) {
556                         error("SBC: failed to encode block at frame %d (%zd)",
557                                                         frame_count, read);
558                         break;
559                 }
560
561                 frame_count++;
562                 consumed += read;
563                 encoded += written;
564         }
565
566         *written = encoded;
567         mp->payload.frame_count = frame_count;
568
569         return consumed;
570 }
571
572 static bool sbc_update_qos(void *codec_data, uint8_t op)
573 {
574         struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
575         uint8_t curr_bitpool = sbc_data->enc.bitpool;
576         uint8_t new_bitpool = curr_bitpool;
577
578         switch (op) {
579         case QOS_POLICY_DEFAULT:
580                 new_bitpool = sbc_data->sbc.max_bitpool;
581                 break;
582
583         case QOS_POLICY_DECREASE:
584                 if (curr_bitpool > SBC_QUALITY_MIN_BITPOOL) {
585                         new_bitpool = curr_bitpool - SBC_QUALITY_STEP;
586                         if (new_bitpool < SBC_QUALITY_MIN_BITPOOL)
587                                 new_bitpool = SBC_QUALITY_MIN_BITPOOL;
588                 }
589                 break;
590         }
591
592         if (new_bitpool == curr_bitpool)
593                 return false;
594
595         sbc_data->enc.bitpool = new_bitpool;
596
597         sbc_codec_calculate(sbc_data);
598
599         info("SBC: bitpool changed: %d -> %d", curr_bitpool, new_bitpool);
600
601         return true;
602 }
603
604 static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
605                         void *param, size_t *rsp_len, void *rsp, int *fd)
606 {
607         ssize_t ret;
608         struct msghdr msg;
609         struct iovec iv[2];
610         struct ipc_hdr cmd;
611         char cmsgbuf[CMSG_SPACE(sizeof(int))];
612         struct ipc_status s;
613         size_t s_len = sizeof(s);
614
615         pthread_mutex_lock(&sk_mutex);
616
617         if (audio_sk < 0) {
618                 error("audio: Invalid cmd socket passed to audio_ipc_cmd");
619                 goto failed;
620         }
621
622         if (!rsp || !rsp_len) {
623                 memset(&s, 0, s_len);
624                 rsp_len = &s_len;
625                 rsp = &s;
626         }
627
628         memset(&msg, 0, sizeof(msg));
629         memset(&cmd, 0, sizeof(cmd));
630
631         cmd.service_id = service_id;
632         cmd.opcode = opcode;
633         cmd.len = len;
634
635         iv[0].iov_base = &cmd;
636         iv[0].iov_len = sizeof(cmd);
637
638         iv[1].iov_base = param;
639         iv[1].iov_len = len;
640
641         msg.msg_iov = iv;
642         msg.msg_iovlen = 2;
643
644         ret = sendmsg(audio_sk, &msg, 0);
645         if (ret < 0) {
646                 error("audio: Sending command failed:%s", strerror(errno));
647                 goto failed;
648         }
649
650         /* socket was shutdown */
651         if (ret == 0) {
652                 error("audio: Command socket closed");
653                 goto failed;
654         }
655
656         memset(&msg, 0, sizeof(msg));
657         memset(&cmd, 0, sizeof(cmd));
658
659         iv[0].iov_base = &cmd;
660         iv[0].iov_len = sizeof(cmd);
661
662         iv[1].iov_base = rsp;
663         iv[1].iov_len = *rsp_len;
664
665         msg.msg_iov = iv;
666         msg.msg_iovlen = 2;
667
668         if (fd) {
669                 memset(cmsgbuf, 0, sizeof(cmsgbuf));
670                 msg.msg_control = cmsgbuf;
671                 msg.msg_controllen = sizeof(cmsgbuf);
672         }
673
674         ret = recvmsg(audio_sk, &msg, 0);
675         if (ret < 0) {
676                 error("audio: Receiving command response failed:%s",
677                                                         strerror(errno));
678                 goto failed;
679         }
680
681         if (ret < (ssize_t) sizeof(cmd)) {
682                 error("audio: Too small response received(%zd bytes)", ret);
683                 goto failed;
684         }
685
686         if (cmd.service_id != service_id) {
687                 error("audio: Invalid service id (%u vs %u)", cmd.service_id,
688                                                                 service_id);
689                 goto failed;
690         }
691
692         if (ret != (ssize_t) (sizeof(cmd) + cmd.len)) {
693                 error("audio: Malformed response received(%zd bytes)", ret);
694                 goto failed;
695         }
696
697         if (cmd.opcode != opcode && cmd.opcode != AUDIO_OP_STATUS) {
698                 error("audio: Invalid opcode received (%u vs %u)",
699                                                 cmd.opcode, opcode);
700                 goto failed;
701         }
702
703         if (cmd.opcode == AUDIO_OP_STATUS) {
704                 struct ipc_status *s = rsp;
705
706                 if (sizeof(*s) != cmd.len) {
707                         error("audio: Invalid status length");
708                         goto failed;
709                 }
710
711                 if (s->code == AUDIO_STATUS_SUCCESS) {
712                         error("audio: Invalid success status response");
713                         goto failed;
714                 }
715
716                 pthread_mutex_unlock(&sk_mutex);
717
718                 return s->code;
719         }
720
721         pthread_mutex_unlock(&sk_mutex);
722
723         /* Receive auxiliary data in msg */
724         if (fd) {
725                 struct cmsghdr *cmsg;
726
727                 *fd = -1;
728
729                 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg;
730                                         cmsg = CMSG_NXTHDR(&msg, cmsg)) {
731                         if (cmsg->cmsg_level == SOL_SOCKET
732                                         && cmsg->cmsg_type == SCM_RIGHTS) {
733                                 memcpy(fd, CMSG_DATA(cmsg), sizeof(int));
734                                 break;
735                         }
736                 }
737
738                 if (*fd < 0)
739                         goto failed;
740         }
741
742         if (rsp_len)
743                 *rsp_len = cmd.len;
744
745         return AUDIO_STATUS_SUCCESS;
746
747 failed:
748         /* Some serious issue happen on IPC - recover */
749         shutdown(audio_sk, SHUT_RDWR);
750         pthread_mutex_unlock(&sk_mutex);
751
752         return AUDIO_STATUS_FAILED;
753 }
754
755 static int ipc_open_cmd(const struct audio_codec *codec)
756 {
757         uint8_t buf[BLUEZ_AUDIO_MTU];
758         struct audio_cmd_open *cmd = (struct audio_cmd_open *) buf;
759         struct audio_rsp_open rsp;
760         size_t cmd_len = sizeof(buf) - sizeof(*cmd);
761         size_t rsp_len = sizeof(rsp);
762         int result;
763
764         DBG("");
765
766         memcpy(cmd->uuid, a2dp_src_uuid, sizeof(a2dp_src_uuid));
767
768         cmd->codec = codec->type;
769         cmd->presets = codec->get_presets(cmd->preset, &cmd_len);
770
771         cmd_len += sizeof(*cmd);
772
773         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_OPEN, cmd_len, cmd,
774                                 &rsp_len, &rsp, NULL);
775
776         if (result != AUDIO_STATUS_SUCCESS)
777                 return 0;
778
779         return rsp.id;
780 }
781
782 static int ipc_close_cmd(uint8_t endpoint_id)
783 {
784         struct audio_cmd_close cmd;
785         int result;
786
787         DBG("");
788
789         cmd.id = endpoint_id;
790
791         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_CLOSE,
792                                 sizeof(cmd), &cmd, NULL, NULL, NULL);
793
794         return result;
795 }
796
797 static int ipc_open_stream_cmd(uint8_t endpoint_id, uint16_t *mtu, int *fd,
798                                                 struct audio_preset **caps)
799 {
800         char buf[BLUEZ_AUDIO_MTU];
801         struct audio_cmd_open_stream cmd;
802         struct audio_rsp_open_stream *rsp =
803                                         (struct audio_rsp_open_stream *) &buf;
804         size_t rsp_len = sizeof(buf);
805         int result;
806
807         DBG("");
808
809         if (!caps)
810                 return AUDIO_STATUS_FAILED;
811
812         cmd.id = endpoint_id;
813
814         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
815                                 sizeof(cmd), &cmd, &rsp_len, rsp, fd);
816         if (result == AUDIO_STATUS_SUCCESS) {
817                 size_t buf_len = sizeof(struct audio_preset) +
818                                         rsp->preset[0].len;
819                 *mtu = rsp->mtu;
820                 *caps = malloc(buf_len);
821                 memcpy(*caps, &rsp->preset, buf_len);
822         } else {
823                 *caps = NULL;
824         }
825
826         return result;
827 }
828
829 static int ipc_close_stream_cmd(uint8_t endpoint_id)
830 {
831         struct audio_cmd_close_stream cmd;
832         int result;
833
834         DBG("");
835
836         cmd.id = endpoint_id;
837
838         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_CLOSE_STREAM,
839                                         sizeof(cmd), &cmd, NULL, NULL, NULL);
840
841         return result;
842 }
843
844 static int ipc_resume_stream_cmd(uint8_t endpoint_id)
845 {
846         struct audio_cmd_resume_stream cmd;
847         int result;
848
849         DBG("");
850
851         cmd.id = endpoint_id;
852
853         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_RESUME_STREAM,
854                                         sizeof(cmd), &cmd, NULL, NULL, NULL);
855
856         return result;
857 }
858
859 static int ipc_suspend_stream_cmd(uint8_t endpoint_id)
860 {
861         struct audio_cmd_suspend_stream cmd;
862         int result;
863
864         DBG("");
865
866         cmd.id = endpoint_id;
867
868         result = audio_ipc_cmd(AUDIO_SERVICE_ID, AUDIO_OP_SUSPEND_STREAM,
869                                         sizeof(cmd), &cmd, NULL, NULL, NULL);
870
871         return result;
872 }
873
874 static int register_endpoints(void)
875 {
876         struct audio_endpoint *ep = &audio_endpoints[0];
877         size_t i;
878
879         for (i = 0; i < NUM_CODECS; i++, ep++) {
880                 const struct audio_codec *codec = &audio_codecs[i];
881
882                 ep->id = ipc_open_cmd(codec);
883
884                 if (!ep->id)
885                         return AUDIO_STATUS_FAILED;
886
887                 ep->codec = codec;
888                 ep->codec_data = NULL;
889                 ep->fd = -1;
890         }
891
892         return AUDIO_STATUS_SUCCESS;
893 }
894
895 static void unregister_endpoints(void)
896 {
897         size_t i;
898
899         for (i = 0; i < MAX_AUDIO_ENDPOINTS; i++) {
900                 struct audio_endpoint *ep = &audio_endpoints[i];
901
902                 if (ep->id) {
903                         ipc_close_cmd(ep->id);
904                         memset(ep, 0, sizeof(*ep));
905                 }
906         }
907 }
908
909 static bool open_endpoint(struct audio_endpoint *ep,
910                                                 struct audio_input_config *cfg)
911 {
912         struct audio_preset *preset;
913         const struct audio_codec *codec;
914         uint16_t mtu;
915         uint16_t payload_len;
916         int fd;
917
918         if (ipc_open_stream_cmd(ep->id, &mtu, &fd, &preset) !=
919                                                         AUDIO_STATUS_SUCCESS)
920                 return false;
921
922         DBG("mtu=%u", mtu);
923
924         payload_len = mtu - sizeof(*ep->mp);
925
926         ep->fd = fd;
927
928         codec = ep->codec;
929         codec->init(preset, payload_len, &ep->codec_data);
930         codec->get_config(ep->codec_data, cfg);
931
932         ep->mp = calloc(mtu, 1);
933         if (!ep->mp)
934                 goto failed;
935         ep->mp->hdr.v = 2;
936         ep->mp->hdr.pt = 1;
937         ep->mp->hdr.ssrc = htonl(1);
938
939         ep->mp_data_len = payload_len;
940
941         free(preset);
942
943         return true;
944
945 failed:
946         close(fd);
947         free(preset);
948
949         return false;
950 }
951
952 static void close_endpoint(struct audio_endpoint *ep)
953 {
954         ipc_close_stream_cmd(ep->id);
955         if (ep->fd >= 0) {
956                 close(ep->fd);
957                 ep->fd = -1;
958         }
959
960         free(ep->mp);
961
962         ep->codec->cleanup(ep->codec_data);
963         ep->codec_data = NULL;
964 }
965
966 static bool resume_endpoint(struct audio_endpoint *ep)
967 {
968         if (ipc_resume_stream_cmd(ep->id) != AUDIO_STATUS_SUCCESS)
969                 return false;
970
971         ep->samples = 0;
972         ep->resync = false;
973
974         ep->codec->update_qos(ep->codec_data, QOS_POLICY_DEFAULT);
975
976         return true;
977 }
978
979 static void downmix_to_mono(struct a2dp_stream_out *out, const uint8_t *buffer,
980                                                                 size_t bytes)
981 {
982         const int16_t *input = (const void *) buffer;
983         int16_t *output = (void *) out->downmix_buf;
984         size_t i;
985
986         for (i = 0; i < bytes / 2; i++) {
987                 int16_t l = le16_to_cpu(get_unaligned(&input[i * 2]));
988                 int16_t r = le16_to_cpu(get_unaligned(&input[i * 2 + 1]));
989
990                 put_unaligned(cpu_to_le16((l + r) / 2), &output[i]);
991         }
992 }
993
994 static bool wait_for_endpoint(struct audio_endpoint *ep, bool *writable)
995 {
996         int ret;
997
998         while (true) {
999                 struct pollfd pollfd;
1000
1001                 pollfd.fd = ep->fd;
1002                 pollfd.events = POLLOUT;
1003                 pollfd.revents = 0;
1004
1005                 ret = poll(&pollfd, 1, 500);
1006
1007                 if (ret >= 0) {
1008                         *writable = !!(pollfd.revents & POLLOUT);
1009                         break;
1010                 }
1011
1012                 if (errno != EINTR) {
1013                         ret = errno;
1014                         error("poll failed (%d)", ret);
1015                         return false;
1016                 }
1017         }
1018
1019         return true;
1020 }
1021
1022 static bool write_to_endpoint(struct audio_endpoint *ep, size_t bytes)
1023 {
1024         struct media_packet *mp = (struct media_packet *) ep->mp;
1025         int ret;
1026
1027         while (true) {
1028                 ret = write(ep->fd, mp, sizeof(*mp) + bytes);
1029
1030                 if (ret >= 0)
1031                         break;
1032
1033                 /* this should not happen so let's issue warning, but do not
1034                  * fail, we can try to write next packet
1035                  */
1036                 if (errno == EAGAIN) {
1037                         ret = errno;
1038                         warn("write failed (%d)", ret);
1039                         break;
1040                 }
1041
1042                 if (errno != EINTR) {
1043                         ret = errno;
1044                         error("write failed (%d)", ret);
1045                         return false;
1046                 }
1047         }
1048
1049         return true;
1050 }
1051
1052 static bool write_data(struct a2dp_stream_out *out, const void *buffer,
1053                                                                 size_t bytes)
1054 {
1055         struct audio_endpoint *ep = out->ep;
1056         struct media_packet *mp = (struct media_packet *) ep->mp;
1057         size_t free_space = ep->mp_data_len;
1058         size_t consumed = 0;
1059
1060         while (consumed < bytes) {
1061                 size_t written = 0;
1062                 ssize_t read;
1063                 uint32_t samples;
1064                 int ret;
1065                 struct timespec current;
1066                 uint64_t audio_sent, audio_passed;
1067                 bool do_write = false;
1068
1069                 /* prepare media packet in advance so we don't waste time after
1070                  * wakeup
1071                  */
1072                 mp->hdr.sequence_number = htons(ep->seq++);
1073                 mp->hdr.timestamp = htonl(ep->samples);
1074                 read = ep->codec->encode_mediapacket(ep->codec_data,
1075                                                 buffer + consumed,
1076                                                 bytes - consumed, mp,
1077                                                 free_space, &written);
1078
1079                 /* not much we can do here, let's just ignore remaining
1080                  * data and continue
1081                  */
1082                 if (read <= 0)
1083                         return true;
1084
1085                 /* calculate where are we and where we should be */
1086                 clock_gettime(CLOCK_MONOTONIC, &current);
1087                 if (!ep->samples)
1088                         memcpy(&ep->start, &current, sizeof(ep->start));
1089                 audio_sent = ep->samples * 1000000ll / out->cfg.rate;
1090                 audio_passed = timespec_diff_us(&current, &ep->start);
1091
1092                 /* if we're ahead of stream then wait for next write point
1093                  * if we're lagging more than 100ms then stop writing and just
1094                  * skip data until we're back in sync
1095                  */
1096                 if (audio_sent > audio_passed) {
1097                         struct timespec anchor;
1098
1099                         ep->resync = false;
1100
1101                         timespec_add(&ep->start, audio_sent, &anchor);
1102
1103                         while (true) {
1104                                 ret = clock_nanosleep(CLOCK_MONOTONIC,
1105                                                         TIMER_ABSTIME, &anchor,
1106                                                         NULL);
1107
1108                                 if (!ret)
1109                                         break;
1110
1111                                 if (ret != EINTR) {
1112                                         error("clock_nanosleep failed (%d)",
1113                                                                         ret);
1114                                         return false;
1115                                 }
1116                         }
1117                 } else if (!ep->resync) {
1118                         uint64_t diff = audio_passed - audio_sent;
1119
1120                         if (diff > MAX_DELAY) {
1121                                 warn("lag is %jums, resyncing", diff / 1000);
1122
1123                                 ep->codec->update_qos(ep->codec_data,
1124                                                         QOS_POLICY_DECREASE);
1125                                 ep->resync = true;
1126                         }
1127                 }
1128
1129                 /* in resync mode we'll just drop mediapackets */
1130                 if (!ep->resync) {
1131                         /* wait some time for socket to be ready for write,
1132                          * but we'll just skip writing data if timeout occurs
1133                          */
1134                         if (!wait_for_endpoint(ep, &do_write))
1135                                 return false;
1136
1137                         if (do_write)
1138                                 if (!write_to_endpoint(ep, written))
1139                                         return false;
1140                 }
1141
1142                 /* AudioFlinger provides 16bit PCM, so sample size is 2 bytes
1143                  * multiplied by number of channels. Number of channels is
1144                  * simply number of bits set in channels mask.
1145                  */
1146                 samples = read / (2 * popcount(out->cfg.channels));
1147                 ep->samples += samples;
1148                 consumed += read;
1149         }
1150
1151         return true;
1152 }
1153
1154 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
1155                                                                 size_t bytes)
1156 {
1157         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1158         const void *in_buf = buffer;
1159         size_t in_len = bytes;
1160
1161         /* just return in case we're closing */
1162         if (out->audio_state == AUDIO_A2DP_STATE_NONE)
1163                 return -1;
1164
1165         /* We can auto-start only from standby */
1166         if (out->audio_state == AUDIO_A2DP_STATE_STANDBY) {
1167                 DBG("stream in standby, auto-start");
1168
1169                 if (!resume_endpoint(out->ep))
1170                         return -1;
1171
1172                 out->audio_state = AUDIO_A2DP_STATE_STARTED;
1173         }
1174
1175         if (out->audio_state != AUDIO_A2DP_STATE_STARTED) {
1176                 error("audio: stream not started");
1177                 return -1;
1178         }
1179
1180         if (out->ep->fd < 0) {
1181                 error("audio: no transport socket");
1182                 return -1;
1183         }
1184
1185         /* currently Android audioflinger is not able to provide mono stream on
1186          * A2DP output so down mixing needs to be done in hal-audio plugin.
1187          *
1188          * for reference see
1189          * AudioFlinger::PlaybackThread::readOutputParameters()
1190          * frameworks/av/services/audioflinger/Threads.cpp:1631
1191          */
1192         if (out->cfg.channels == AUDIO_CHANNEL_OUT_MONO) {
1193                 if (!out->downmix_buf) {
1194                         error("audio: downmix buffer not initialized");
1195                         return -1;
1196                 }
1197
1198                 downmix_to_mono(out, buffer, bytes);
1199
1200                 in_buf = out->downmix_buf;
1201                 in_len = bytes / 2;
1202         }
1203
1204         if (!write_data(out, in_buf, in_len))
1205                 return -1;
1206
1207         return bytes;
1208 }
1209
1210 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
1211 {
1212         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1213
1214         DBG("");
1215
1216         return out->cfg.rate;
1217 }
1218
1219 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1220 {
1221         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1222
1223         DBG("");
1224
1225         if (rate != out->cfg.rate) {
1226                 warn("audio: cannot set sample rate to %d", rate);
1227                 return -1;
1228         }
1229
1230         return 0;
1231 }
1232
1233 static size_t out_get_buffer_size(const struct audio_stream *stream)
1234 {
1235         DBG("");
1236
1237         /* We should return proper buffer size calculated by codec (so each
1238          * input buffer is encoded into single media packed) but this does not
1239          * work well with AudioFlinger and causes problems. For this reason we
1240          * use magic value here and out_write code takes care of splitting
1241          * input buffer into multiple media packets.
1242          */
1243         return FIXED_BUFFER_SIZE;
1244 }
1245
1246 static uint32_t out_get_channels(const struct audio_stream *stream)
1247 {
1248         DBG("");
1249
1250         /* AudioFlinger can only provide stereo stream, so we return it here and
1251          * later we'll downmix this to mono in case codec requires it
1252          */
1253
1254         return AUDIO_CHANNEL_OUT_STEREO;
1255 }
1256
1257 static audio_format_t out_get_format(const struct audio_stream *stream)
1258 {
1259         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1260
1261         DBG("");
1262
1263         return out->cfg.format;
1264 }
1265
1266 static int out_set_format(struct audio_stream *stream, audio_format_t format)
1267 {
1268         DBG("");
1269         return -ENOSYS;
1270 }
1271
1272 static int out_standby(struct audio_stream *stream)
1273 {
1274         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1275
1276         DBG("");
1277
1278         if (out->audio_state == AUDIO_A2DP_STATE_STARTED) {
1279                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
1280                         return -1;
1281                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1282         }
1283
1284         return 0;
1285 }
1286
1287 static int out_dump(const struct audio_stream *stream, int fd)
1288 {
1289         DBG("");
1290         return -ENOSYS;
1291 }
1292
1293 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
1294 {
1295         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1296         char *kvpair;
1297         char *str;
1298         char *saveptr;
1299         bool enter_suspend = false;
1300         bool exit_suspend = false;
1301
1302         DBG("%s", kvpairs);
1303
1304         str = strdup(kvpairs);
1305         if (!str)
1306                 return -ENOMEM;
1307
1308         kvpair = strtok_r(str, ";", &saveptr);
1309
1310         for (; kvpair && *kvpair; kvpair = strtok_r(NULL, ";", &saveptr)) {
1311                 char *keyval;
1312
1313                 keyval = strchr(kvpair, '=');
1314                 if (!keyval)
1315                         continue;
1316
1317                 *keyval = '\0';
1318                 keyval++;
1319
1320                 if (!strcmp(kvpair, "closing")) {
1321                         if (!strcmp(keyval, "true"))
1322                                 out->audio_state = AUDIO_A2DP_STATE_NONE;
1323                 } else if (!strcmp(kvpair, "A2dpSuspended")) {
1324                         if (!strcmp(keyval, "true"))
1325                                 enter_suspend = true;
1326                         else
1327                                 exit_suspend = true;
1328                 }
1329         }
1330
1331         free(str);
1332
1333         if (enter_suspend && out->audio_state == AUDIO_A2DP_STATE_STARTED) {
1334                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
1335                         return -1;
1336                 out->audio_state = AUDIO_A2DP_STATE_SUSPENDED;
1337         }
1338
1339         if (exit_suspend && out->audio_state == AUDIO_A2DP_STATE_SUSPENDED)
1340                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1341
1342         return 0;
1343 }
1344
1345 static char *out_get_parameters(const struct audio_stream *stream,
1346                                                         const char *keys)
1347 {
1348         DBG("");
1349         return strdup("");
1350 }
1351
1352 static uint32_t out_get_latency(const struct audio_stream_out *stream)
1353 {
1354         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1355         struct audio_endpoint *ep = out->ep;
1356         size_t pkt_duration;
1357
1358         DBG("");
1359
1360         pkt_duration = ep->codec->get_mediapacket_duration(ep->codec_data);
1361
1362         return FIXED_A2DP_PLAYBACK_LATENCY_MS + pkt_duration / 1000;
1363 }
1364
1365 static int out_set_volume(struct audio_stream_out *stream, float left,
1366                                                                 float right)
1367 {
1368         DBG("");
1369         /* volume controlled in audioflinger mixer (digital) */
1370         return -ENOSYS;
1371 }
1372
1373 static int out_get_render_position(const struct audio_stream_out *stream,
1374                                                         uint32_t *dsp_frames)
1375 {
1376         DBG("");
1377         return -ENOSYS;
1378 }
1379
1380 static int out_add_audio_effect(const struct audio_stream *stream,
1381                                                         effect_handle_t effect)
1382 {
1383         DBG("");
1384         return -ENOSYS;
1385 }
1386
1387 static int out_remove_audio_effect(const struct audio_stream *stream,
1388                                                         effect_handle_t effect)
1389 {
1390         DBG("");
1391         return -ENOSYS;
1392 }
1393
1394 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
1395 {
1396         DBG("");
1397         return -ENOSYS;
1398 }
1399
1400 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1401 {
1402         DBG("");
1403         return -ENOSYS;
1404 }
1405
1406 static size_t in_get_buffer_size(const struct audio_stream *stream)
1407 {
1408         DBG("");
1409         return -ENOSYS;
1410 }
1411
1412 static uint32_t in_get_channels(const struct audio_stream *stream)
1413 {
1414         DBG("");
1415         return -ENOSYS;
1416 }
1417
1418 static audio_format_t in_get_format(const struct audio_stream *stream)
1419 {
1420         DBG("");
1421         return -ENOSYS;
1422 }
1423
1424 static int in_set_format(struct audio_stream *stream, audio_format_t format)
1425 {
1426         DBG("");
1427         return -ENOSYS;
1428 }
1429
1430 static int in_standby(struct audio_stream *stream)
1431 {
1432         DBG("");
1433         return -ENOSYS;
1434 }
1435
1436 static int in_dump(const struct audio_stream *stream, int fd)
1437 {
1438         DBG("");
1439         return -ENOSYS;
1440 }
1441
1442 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
1443 {
1444         DBG("");
1445         return -ENOSYS;
1446 }
1447
1448 static char *in_get_parameters(const struct audio_stream *stream,
1449                                                         const char *keys)
1450 {
1451         DBG("");
1452         return strdup("");
1453 }
1454
1455 static int in_set_gain(struct audio_stream_in *stream, float gain)
1456 {
1457         DBG("");
1458         return -ENOSYS;
1459 }
1460
1461 static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
1462                                                                 size_t bytes)
1463 {
1464         DBG("");
1465         return -ENOSYS;
1466 }
1467
1468 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
1469 {
1470         DBG("");
1471         return -ENOSYS;
1472 }
1473
1474 static int in_add_audio_effect(const struct audio_stream *stream,
1475                                                         effect_handle_t effect)
1476 {
1477         DBG("");
1478         return -ENOSYS;
1479 }
1480
1481 static int in_remove_audio_effect(const struct audio_stream *stream,
1482                                                         effect_handle_t effect)
1483 {
1484         DBG("");
1485         return -ENOSYS;
1486 }
1487
1488 static int audio_open_output_stream(struct audio_hw_device *dev,
1489                                         audio_io_handle_t handle,
1490                                         audio_devices_t devices,
1491                                         audio_output_flags_t flags,
1492                                         struct audio_config *config,
1493                                         struct audio_stream_out **stream_out)
1494
1495 {
1496         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1497         struct a2dp_stream_out *out;
1498
1499         out = calloc(1, sizeof(struct a2dp_stream_out));
1500         if (!out)
1501                 return -ENOMEM;
1502
1503         DBG("");
1504
1505         out->stream.common.get_sample_rate = out_get_sample_rate;
1506         out->stream.common.set_sample_rate = out_set_sample_rate;
1507         out->stream.common.get_buffer_size = out_get_buffer_size;
1508         out->stream.common.get_channels = out_get_channels;
1509         out->stream.common.get_format = out_get_format;
1510         out->stream.common.set_format = out_set_format;
1511         out->stream.common.standby = out_standby;
1512         out->stream.common.dump = out_dump;
1513         out->stream.common.set_parameters = out_set_parameters;
1514         out->stream.common.get_parameters = out_get_parameters;
1515         out->stream.common.add_audio_effect = out_add_audio_effect;
1516         out->stream.common.remove_audio_effect = out_remove_audio_effect;
1517         out->stream.get_latency = out_get_latency;
1518         out->stream.set_volume = out_set_volume;
1519         out->stream.write = out_write;
1520         out->stream.get_render_position = out_get_render_position;
1521
1522         /* TODO: for now we always use endpoint 0 */
1523         out->ep = &audio_endpoints[0];
1524
1525         if (!open_endpoint(out->ep, &out->cfg))
1526                 goto fail;
1527
1528         DBG("rate=%d channels=%d format=%d", out->cfg.rate,
1529                                         out->cfg.channels, out->cfg.format);
1530
1531         if (out->cfg.channels == AUDIO_CHANNEL_OUT_MONO) {
1532                 out->downmix_buf = malloc(FIXED_BUFFER_SIZE / 2);
1533                 if (!out->downmix_buf)
1534                         goto fail;
1535         }
1536
1537         *stream_out = &out->stream;
1538         a2dp_dev->out = out;
1539
1540         out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1541
1542         return 0;
1543
1544 fail:
1545         error("audio: cannot open output stream");
1546         free(out);
1547         *stream_out = NULL;
1548         return -EIO;
1549 }
1550
1551 static void audio_close_output_stream(struct audio_hw_device *dev,
1552                                         struct audio_stream_out *stream)
1553 {
1554         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1555         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1556
1557         DBG("");
1558
1559         close_endpoint(a2dp_dev->out->ep);
1560
1561         free(out->downmix_buf);
1562
1563         free(stream);
1564         a2dp_dev->out = NULL;
1565 }
1566
1567 static int audio_set_parameters(struct audio_hw_device *dev,
1568                                                         const char *kvpairs)
1569 {
1570         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1571         struct a2dp_stream_out *out = a2dp_dev->out;
1572
1573         DBG("");
1574
1575         if (!out)
1576                 return 0;
1577
1578         return out->stream.common.set_parameters((struct audio_stream *) out,
1579                                                                 kvpairs);
1580 }
1581
1582 static char *audio_get_parameters(const struct audio_hw_device *dev,
1583                                                         const char *keys)
1584 {
1585         DBG("");
1586         return strdup("");
1587 }
1588
1589 static int audio_init_check(const struct audio_hw_device *dev)
1590 {
1591         DBG("");
1592         return 0;
1593 }
1594
1595 static int audio_set_voice_volume(struct audio_hw_device *dev, float volume)
1596 {
1597         DBG("");
1598         return -ENOSYS;
1599 }
1600
1601 static int audio_set_master_volume(struct audio_hw_device *dev, float volume)
1602 {
1603         DBG("");
1604         return -ENOSYS;
1605 }
1606
1607 static int audio_set_mode(struct audio_hw_device *dev, int mode)
1608 {
1609         DBG("");
1610         return -ENOSYS;
1611 }
1612
1613 static int audio_set_mic_mute(struct audio_hw_device *dev, bool state)
1614 {
1615         DBG("");
1616         return -ENOSYS;
1617 }
1618
1619 static int audio_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1620 {
1621         DBG("");
1622         return -ENOSYS;
1623 }
1624
1625 static size_t audio_get_input_buffer_size(const struct audio_hw_device *dev,
1626                                         const struct audio_config *config)
1627 {
1628         DBG("");
1629         return -ENOSYS;
1630 }
1631
1632 static int audio_open_input_stream(struct audio_hw_device *dev,
1633                                         audio_io_handle_t handle,
1634                                         audio_devices_t devices,
1635                                         struct audio_config *config,
1636                                         struct audio_stream_in **stream_in)
1637 {
1638         struct audio_stream_in *in;
1639
1640         DBG("");
1641
1642         in = calloc(1, sizeof(struct audio_stream_in));
1643         if (!in)
1644                 return -ENOMEM;
1645
1646         in->common.get_sample_rate = in_get_sample_rate;
1647         in->common.set_sample_rate = in_set_sample_rate;
1648         in->common.get_buffer_size = in_get_buffer_size;
1649         in->common.get_channels = in_get_channels;
1650         in->common.get_format = in_get_format;
1651         in->common.set_format = in_set_format;
1652         in->common.standby = in_standby;
1653         in->common.dump = in_dump;
1654         in->common.set_parameters = in_set_parameters;
1655         in->common.get_parameters = in_get_parameters;
1656         in->common.add_audio_effect = in_add_audio_effect;
1657         in->common.remove_audio_effect = in_remove_audio_effect;
1658         in->set_gain = in_set_gain;
1659         in->read = in_read;
1660         in->get_input_frames_lost = in_get_input_frames_lost;
1661
1662         *stream_in = in;
1663
1664         return 0;
1665 }
1666
1667 static void audio_close_input_stream(struct audio_hw_device *dev,
1668                                         struct audio_stream_in *stream_in)
1669 {
1670         DBG("");
1671         free(stream_in);
1672 }
1673
1674 static int audio_dump(const audio_hw_device_t *device, int fd)
1675 {
1676         DBG("");
1677         return -ENOSYS;
1678 }
1679
1680 static int audio_close(hw_device_t *device)
1681 {
1682         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *)device;
1683
1684         DBG("");
1685
1686         unregister_endpoints();
1687
1688         shutdown(listen_sk, SHUT_RDWR);
1689         shutdown(audio_sk, SHUT_RDWR);
1690
1691         pthread_join(ipc_th, NULL);
1692
1693         close(listen_sk);
1694         listen_sk = -1;
1695
1696         free(a2dp_dev);
1697         return 0;
1698 }
1699
1700 static void *ipc_handler(void *data)
1701 {
1702         bool done = false;
1703         struct pollfd pfd;
1704         int sk;
1705
1706         DBG("");
1707
1708         while (!done) {
1709                 DBG("Waiting for connection ...");
1710
1711                 sk = accept(listen_sk, NULL, NULL);
1712                 if (sk < 0) {
1713                         int err = errno;
1714
1715                         if (err == EINTR)
1716                                 continue;
1717
1718                         if (err != ECONNABORTED && err != EINVAL)
1719                                 error("audio: Failed to accept socket: %d (%s)",
1720                                                         err, strerror(err));
1721
1722                         break;
1723                 }
1724
1725                 pthread_mutex_lock(&sk_mutex);
1726                 audio_sk = sk;
1727                 pthread_mutex_unlock(&sk_mutex);
1728
1729                 DBG("Audio IPC: Connected");
1730
1731                 if (register_endpoints() != AUDIO_STATUS_SUCCESS) {
1732                         error("audio: Failed to register endpoints");
1733
1734                         unregister_endpoints();
1735
1736                         pthread_mutex_lock(&sk_mutex);
1737                         shutdown(audio_sk, SHUT_RDWR);
1738                         close(audio_sk);
1739                         audio_sk = -1;
1740                         pthread_mutex_unlock(&sk_mutex);
1741
1742                         continue;
1743                 }
1744
1745                 memset(&pfd, 0, sizeof(pfd));
1746                 pfd.fd = audio_sk;
1747                 pfd.events = POLLHUP | POLLERR | POLLNVAL;
1748
1749                 /* Check if socket is still alive. Empty while loop.*/
1750                 while (poll(&pfd, 1, -1) < 0 && errno == EINTR);
1751
1752                 if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL)) {
1753                         info("Audio HAL: Socket closed");
1754
1755                         pthread_mutex_lock(&sk_mutex);
1756                         close(audio_sk);
1757                         audio_sk = -1;
1758                         pthread_mutex_unlock(&sk_mutex);
1759                 }
1760         }
1761
1762         /* audio_sk is closed at this point, just cleanup endpoints states */
1763         memset(audio_endpoints, 0, sizeof(audio_endpoints));
1764
1765         info("Closing Audio IPC thread");
1766         return NULL;
1767 }
1768
1769 static int audio_ipc_init(void)
1770 {
1771         struct sockaddr_un addr;
1772         int err;
1773         int sk;
1774
1775         DBG("");
1776
1777         sk = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
1778         if (sk < 0) {
1779                 err = -errno;
1780                 error("audio: Failed to create socket: %d (%s)", -err,
1781                                                                 strerror(-err));
1782                 return err;
1783         }
1784
1785         memset(&addr, 0, sizeof(addr));
1786         addr.sun_family = AF_UNIX;
1787
1788         memcpy(addr.sun_path, BLUEZ_AUDIO_SK_PATH,
1789                                         sizeof(BLUEZ_AUDIO_SK_PATH));
1790
1791         if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1792                 err = -errno;
1793                 error("audio: Failed to bind socket: %d (%s)", -err,
1794                                                                 strerror(-err));
1795                 goto failed;
1796         }
1797
1798         if (listen(sk, 1) < 0) {
1799                 err = -errno;
1800                 error("audio: Failed to listen on the socket: %d (%s)", -err,
1801                                                                 strerror(-err));
1802                 goto failed;
1803         }
1804
1805         listen_sk = sk;
1806
1807         err = pthread_create(&ipc_th, NULL, ipc_handler, NULL);
1808         if (err) {
1809                 err = -err;
1810                 ipc_th = 0;
1811                 error("audio: Failed to start Audio IPC thread: %d (%s)",
1812                                                         -err, strerror(-err));
1813                 goto failed;
1814         }
1815
1816         return 0;
1817
1818 failed:
1819         close(sk);
1820         return err;
1821 }
1822
1823 static int audio_open(const hw_module_t *module, const char *name,
1824                                                         hw_device_t **device)
1825 {
1826         struct a2dp_audio_dev *a2dp_dev;
1827         int err;
1828
1829         DBG("");
1830
1831         if (strcmp(name, AUDIO_HARDWARE_INTERFACE)) {
1832                 error("audio: interface %s not matching [%s]", name,
1833                                                 AUDIO_HARDWARE_INTERFACE);
1834                 return -EINVAL;
1835         }
1836
1837         err = audio_ipc_init();
1838         if (err < 0)
1839                 return err;
1840
1841         a2dp_dev = calloc(1, sizeof(struct a2dp_audio_dev));
1842         if (!a2dp_dev)
1843                 return -ENOMEM;
1844
1845         a2dp_dev->dev.common.tag = HARDWARE_DEVICE_TAG;
1846         a2dp_dev->dev.common.version = AUDIO_DEVICE_API_VERSION_CURRENT;
1847         a2dp_dev->dev.common.module = (struct hw_module_t *) module;
1848         a2dp_dev->dev.common.close = audio_close;
1849
1850         a2dp_dev->dev.init_check = audio_init_check;
1851         a2dp_dev->dev.set_voice_volume = audio_set_voice_volume;
1852         a2dp_dev->dev.set_master_volume = audio_set_master_volume;
1853         a2dp_dev->dev.set_mode = audio_set_mode;
1854         a2dp_dev->dev.set_mic_mute = audio_set_mic_mute;
1855         a2dp_dev->dev.get_mic_mute = audio_get_mic_mute;
1856         a2dp_dev->dev.set_parameters = audio_set_parameters;
1857         a2dp_dev->dev.get_parameters = audio_get_parameters;
1858         a2dp_dev->dev.get_input_buffer_size = audio_get_input_buffer_size;
1859         a2dp_dev->dev.open_output_stream = audio_open_output_stream;
1860         a2dp_dev->dev.close_output_stream = audio_close_output_stream;
1861         a2dp_dev->dev.open_input_stream = audio_open_input_stream;
1862         a2dp_dev->dev.close_input_stream = audio_close_input_stream;
1863         a2dp_dev->dev.dump = audio_dump;
1864
1865         /* Note that &a2dp_dev->dev.common is the same pointer as a2dp_dev.
1866          * This results from the structure of following structs:a2dp_audio_dev,
1867          * audio_hw_device. We will rely on this later in the code.*/
1868         *device = &a2dp_dev->dev.common;
1869
1870         return 0;
1871 }
1872
1873 static struct hw_module_methods_t hal_module_methods = {
1874         .open = audio_open,
1875 };
1876
1877 struct audio_module HAL_MODULE_INFO_SYM = {
1878         .common = {
1879                 .tag = HARDWARE_MODULE_TAG,
1880                 .version_major = 1,
1881                 .version_minor = 0,
1882                 .id = AUDIO_HARDWARE_MODULE_ID,
1883                 .name = "A2DP Bluez HW HAL",
1884                 .author = "Intel Corporation",
1885                 .methods = &hal_module_methods,
1886         },
1887 };