OSDN Git Service

android/hal-audio: Add support to control audio quality
[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         return true;
975 }
976
977 static void downmix_to_mono(struct a2dp_stream_out *out, const uint8_t *buffer,
978                                                                 size_t bytes)
979 {
980         const int16_t *input = (const void *) buffer;
981         int16_t *output = (void *) out->downmix_buf;
982         size_t i;
983
984         for (i = 0; i < bytes / 2; i++) {
985                 int16_t l = le16_to_cpu(get_unaligned(&input[i * 2]));
986                 int16_t r = le16_to_cpu(get_unaligned(&input[i * 2 + 1]));
987
988                 put_unaligned(cpu_to_le16((l + r) / 2), &output[i]);
989         }
990 }
991
992 static bool wait_for_endpoint(struct audio_endpoint *ep, bool *writable)
993 {
994         int ret;
995
996         while (true) {
997                 struct pollfd pollfd;
998
999                 pollfd.fd = ep->fd;
1000                 pollfd.events = POLLOUT;
1001                 pollfd.revents = 0;
1002
1003                 ret = poll(&pollfd, 1, 500);
1004
1005                 if (ret >= 0) {
1006                         *writable = !!(pollfd.revents & POLLOUT);
1007                         break;
1008                 }
1009
1010                 if (errno != EINTR) {
1011                         ret = errno;
1012                         error("poll failed (%d)", ret);
1013                         return false;
1014                 }
1015         }
1016
1017         return true;
1018 }
1019
1020 static bool write_to_endpoint(struct audio_endpoint *ep, size_t bytes)
1021 {
1022         struct media_packet *mp = (struct media_packet *) ep->mp;
1023         int ret;
1024
1025         while (true) {
1026                 ret = write(ep->fd, mp, sizeof(*mp) + bytes);
1027
1028                 if (ret >= 0)
1029                         break;
1030
1031                 /* this should not happen so let's issue warning, but do not
1032                  * fail, we can try to write next packet
1033                  */
1034                 if (errno == EAGAIN) {
1035                         ret = errno;
1036                         warn("write failed (%d)", ret);
1037                         break;
1038                 }
1039
1040                 if (errno != EINTR) {
1041                         ret = errno;
1042                         error("write failed (%d)", ret);
1043                         return false;
1044                 }
1045         }
1046
1047         return true;
1048 }
1049
1050 static bool write_data(struct a2dp_stream_out *out, const void *buffer,
1051                                                                 size_t bytes)
1052 {
1053         struct audio_endpoint *ep = out->ep;
1054         struct media_packet *mp = (struct media_packet *) ep->mp;
1055         size_t free_space = ep->mp_data_len;
1056         size_t consumed = 0;
1057
1058         while (consumed < bytes) {
1059                 size_t written = 0;
1060                 ssize_t read;
1061                 uint32_t samples;
1062                 int ret;
1063                 struct timespec current;
1064                 uint64_t audio_sent, audio_passed;
1065                 bool do_write = false;
1066
1067                 /* prepare media packet in advance so we don't waste time after
1068                  * wakeup
1069                  */
1070                 mp->hdr.sequence_number = htons(ep->seq++);
1071                 mp->hdr.timestamp = htonl(ep->samples);
1072                 read = ep->codec->encode_mediapacket(ep->codec_data,
1073                                                 buffer + consumed,
1074                                                 bytes - consumed, mp,
1075                                                 free_space, &written);
1076
1077                 /* not much we can do here, let's just ignore remaining
1078                  * data and continue
1079                  */
1080                 if (read <= 0)
1081                         return true;
1082
1083                 /* calculate where are we and where we should be */
1084                 clock_gettime(CLOCK_MONOTONIC, &current);
1085                 if (!ep->samples)
1086                         memcpy(&ep->start, &current, sizeof(ep->start));
1087                 audio_sent = ep->samples * 1000000ll / out->cfg.rate;
1088                 audio_passed = timespec_diff_us(&current, &ep->start);
1089
1090                 /* if we're ahead of stream then wait for next write point
1091                  * if we're lagging more than 100ms then stop writing and just
1092                  * skip data until we're back in sync
1093                  */
1094                 if (audio_sent > audio_passed) {
1095                         struct timespec anchor;
1096
1097                         ep->resync = false;
1098
1099                         timespec_add(&ep->start, audio_sent, &anchor);
1100
1101                         while (true) {
1102                                 ret = clock_nanosleep(CLOCK_MONOTONIC,
1103                                                         TIMER_ABSTIME, &anchor,
1104                                                         NULL);
1105
1106                                 if (!ret)
1107                                         break;
1108
1109                                 if (ret != EINTR) {
1110                                         error("clock_nanosleep failed (%d)",
1111                                                                         ret);
1112                                         return false;
1113                                 }
1114                         }
1115                 } else if (!ep->resync) {
1116                         uint64_t diff = audio_passed - audio_sent;
1117
1118                         if (diff > MAX_DELAY) {
1119                                 warn("lag is %jums, resyncing", diff / 1000);
1120                                 ep->resync = true;
1121                         }
1122                 }
1123
1124                 /* in resync mode we'll just drop mediapackets */
1125                 if (!ep->resync) {
1126                         /* wait some time for socket to be ready for write,
1127                          * but we'll just skip writing data if timeout occurs
1128                          */
1129                         if (!wait_for_endpoint(ep, &do_write))
1130                                 return false;
1131
1132                         if (do_write)
1133                                 if (!write_to_endpoint(ep, written))
1134                                         return false;
1135                 }
1136
1137                 /* AudioFlinger provides 16bit PCM, so sample size is 2 bytes
1138                  * multiplied by number of channels. Number of channels is
1139                  * simply number of bits set in channels mask.
1140                  */
1141                 samples = read / (2 * popcount(out->cfg.channels));
1142                 ep->samples += samples;
1143                 consumed += read;
1144         }
1145
1146         return true;
1147 }
1148
1149 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
1150                                                                 size_t bytes)
1151 {
1152         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1153         const void *in_buf = buffer;
1154         size_t in_len = bytes;
1155
1156         /* just return in case we're closing */
1157         if (out->audio_state == AUDIO_A2DP_STATE_NONE)
1158                 return -1;
1159
1160         /* We can auto-start only from standby */
1161         if (out->audio_state == AUDIO_A2DP_STATE_STANDBY) {
1162                 DBG("stream in standby, auto-start");
1163
1164                 if (!resume_endpoint(out->ep))
1165                         return -1;
1166
1167                 out->audio_state = AUDIO_A2DP_STATE_STARTED;
1168         }
1169
1170         if (out->audio_state != AUDIO_A2DP_STATE_STARTED) {
1171                 error("audio: stream not started");
1172                 return -1;
1173         }
1174
1175         if (out->ep->fd < 0) {
1176                 error("audio: no transport socket");
1177                 return -1;
1178         }
1179
1180         /* currently Android audioflinger is not able to provide mono stream on
1181          * A2DP output so down mixing needs to be done in hal-audio plugin.
1182          *
1183          * for reference see
1184          * AudioFlinger::PlaybackThread::readOutputParameters()
1185          * frameworks/av/services/audioflinger/Threads.cpp:1631
1186          */
1187         if (out->cfg.channels == AUDIO_CHANNEL_OUT_MONO) {
1188                 if (!out->downmix_buf) {
1189                         error("audio: downmix buffer not initialized");
1190                         return -1;
1191                 }
1192
1193                 downmix_to_mono(out, buffer, bytes);
1194
1195                 in_buf = out->downmix_buf;
1196                 in_len = bytes / 2;
1197         }
1198
1199         if (!write_data(out, in_buf, in_len))
1200                 return -1;
1201
1202         return bytes;
1203 }
1204
1205 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
1206 {
1207         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1208
1209         DBG("");
1210
1211         return out->cfg.rate;
1212 }
1213
1214 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1215 {
1216         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1217
1218         DBG("");
1219
1220         if (rate != out->cfg.rate) {
1221                 warn("audio: cannot set sample rate to %d", rate);
1222                 return -1;
1223         }
1224
1225         return 0;
1226 }
1227
1228 static size_t out_get_buffer_size(const struct audio_stream *stream)
1229 {
1230         DBG("");
1231
1232         /* We should return proper buffer size calculated by codec (so each
1233          * input buffer is encoded into single media packed) but this does not
1234          * work well with AudioFlinger and causes problems. For this reason we
1235          * use magic value here and out_write code takes care of splitting
1236          * input buffer into multiple media packets.
1237          */
1238         return FIXED_BUFFER_SIZE;
1239 }
1240
1241 static uint32_t out_get_channels(const struct audio_stream *stream)
1242 {
1243         DBG("");
1244
1245         /* AudioFlinger can only provide stereo stream, so we return it here and
1246          * later we'll downmix this to mono in case codec requires it
1247          */
1248
1249         return AUDIO_CHANNEL_OUT_STEREO;
1250 }
1251
1252 static audio_format_t out_get_format(const struct audio_stream *stream)
1253 {
1254         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1255
1256         DBG("");
1257
1258         return out->cfg.format;
1259 }
1260
1261 static int out_set_format(struct audio_stream *stream, audio_format_t format)
1262 {
1263         DBG("");
1264         return -ENOSYS;
1265 }
1266
1267 static int out_standby(struct audio_stream *stream)
1268 {
1269         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1270
1271         DBG("");
1272
1273         if (out->audio_state == AUDIO_A2DP_STATE_STARTED) {
1274                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
1275                         return -1;
1276                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1277         }
1278
1279         return 0;
1280 }
1281
1282 static int out_dump(const struct audio_stream *stream, int fd)
1283 {
1284         DBG("");
1285         return -ENOSYS;
1286 }
1287
1288 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
1289 {
1290         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1291         char *kvpair;
1292         char *str;
1293         char *saveptr;
1294         bool enter_suspend = false;
1295         bool exit_suspend = false;
1296
1297         DBG("%s", kvpairs);
1298
1299         str = strdup(kvpairs);
1300         if (!str)
1301                 return -ENOMEM;
1302
1303         kvpair = strtok_r(str, ";", &saveptr);
1304
1305         for (; kvpair && *kvpair; kvpair = strtok_r(NULL, ";", &saveptr)) {
1306                 char *keyval;
1307
1308                 keyval = strchr(kvpair, '=');
1309                 if (!keyval)
1310                         continue;
1311
1312                 *keyval = '\0';
1313                 keyval++;
1314
1315                 if (!strcmp(kvpair, "closing")) {
1316                         if (!strcmp(keyval, "true"))
1317                                 out->audio_state = AUDIO_A2DP_STATE_NONE;
1318                 } else if (!strcmp(kvpair, "A2dpSuspended")) {
1319                         if (!strcmp(keyval, "true"))
1320                                 enter_suspend = true;
1321                         else
1322                                 exit_suspend = true;
1323                 }
1324         }
1325
1326         free(str);
1327
1328         if (enter_suspend && out->audio_state == AUDIO_A2DP_STATE_STARTED) {
1329                 if (ipc_suspend_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
1330                         return -1;
1331                 out->audio_state = AUDIO_A2DP_STATE_SUSPENDED;
1332         }
1333
1334         if (exit_suspend && out->audio_state == AUDIO_A2DP_STATE_SUSPENDED)
1335                 out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1336
1337         return 0;
1338 }
1339
1340 static char *out_get_parameters(const struct audio_stream *stream,
1341                                                         const char *keys)
1342 {
1343         DBG("");
1344         return strdup("");
1345 }
1346
1347 static uint32_t out_get_latency(const struct audio_stream_out *stream)
1348 {
1349         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1350         struct audio_endpoint *ep = out->ep;
1351         size_t pkt_duration;
1352
1353         DBG("");
1354
1355         pkt_duration = ep->codec->get_mediapacket_duration(ep->codec_data);
1356
1357         return FIXED_A2DP_PLAYBACK_LATENCY_MS + pkt_duration / 1000;
1358 }
1359
1360 static int out_set_volume(struct audio_stream_out *stream, float left,
1361                                                                 float right)
1362 {
1363         DBG("");
1364         /* volume controlled in audioflinger mixer (digital) */
1365         return -ENOSYS;
1366 }
1367
1368 static int out_get_render_position(const struct audio_stream_out *stream,
1369                                                         uint32_t *dsp_frames)
1370 {
1371         DBG("");
1372         return -ENOSYS;
1373 }
1374
1375 static int out_add_audio_effect(const struct audio_stream *stream,
1376                                                         effect_handle_t effect)
1377 {
1378         DBG("");
1379         return -ENOSYS;
1380 }
1381
1382 static int out_remove_audio_effect(const struct audio_stream *stream,
1383                                                         effect_handle_t effect)
1384 {
1385         DBG("");
1386         return -ENOSYS;
1387 }
1388
1389 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
1390 {
1391         DBG("");
1392         return -ENOSYS;
1393 }
1394
1395 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1396 {
1397         DBG("");
1398         return -ENOSYS;
1399 }
1400
1401 static size_t in_get_buffer_size(const struct audio_stream *stream)
1402 {
1403         DBG("");
1404         return -ENOSYS;
1405 }
1406
1407 static uint32_t in_get_channels(const struct audio_stream *stream)
1408 {
1409         DBG("");
1410         return -ENOSYS;
1411 }
1412
1413 static audio_format_t in_get_format(const struct audio_stream *stream)
1414 {
1415         DBG("");
1416         return -ENOSYS;
1417 }
1418
1419 static int in_set_format(struct audio_stream *stream, audio_format_t format)
1420 {
1421         DBG("");
1422         return -ENOSYS;
1423 }
1424
1425 static int in_standby(struct audio_stream *stream)
1426 {
1427         DBG("");
1428         return -ENOSYS;
1429 }
1430
1431 static int in_dump(const struct audio_stream *stream, int fd)
1432 {
1433         DBG("");
1434         return -ENOSYS;
1435 }
1436
1437 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
1438 {
1439         DBG("");
1440         return -ENOSYS;
1441 }
1442
1443 static char *in_get_parameters(const struct audio_stream *stream,
1444                                                         const char *keys)
1445 {
1446         DBG("");
1447         return strdup("");
1448 }
1449
1450 static int in_set_gain(struct audio_stream_in *stream, float gain)
1451 {
1452         DBG("");
1453         return -ENOSYS;
1454 }
1455
1456 static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
1457                                                                 size_t bytes)
1458 {
1459         DBG("");
1460         return -ENOSYS;
1461 }
1462
1463 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
1464 {
1465         DBG("");
1466         return -ENOSYS;
1467 }
1468
1469 static int in_add_audio_effect(const struct audio_stream *stream,
1470                                                         effect_handle_t effect)
1471 {
1472         DBG("");
1473         return -ENOSYS;
1474 }
1475
1476 static int in_remove_audio_effect(const struct audio_stream *stream,
1477                                                         effect_handle_t effect)
1478 {
1479         DBG("");
1480         return -ENOSYS;
1481 }
1482
1483 static int audio_open_output_stream(struct audio_hw_device *dev,
1484                                         audio_io_handle_t handle,
1485                                         audio_devices_t devices,
1486                                         audio_output_flags_t flags,
1487                                         struct audio_config *config,
1488                                         struct audio_stream_out **stream_out)
1489
1490 {
1491         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1492         struct a2dp_stream_out *out;
1493
1494         out = calloc(1, sizeof(struct a2dp_stream_out));
1495         if (!out)
1496                 return -ENOMEM;
1497
1498         DBG("");
1499
1500         out->stream.common.get_sample_rate = out_get_sample_rate;
1501         out->stream.common.set_sample_rate = out_set_sample_rate;
1502         out->stream.common.get_buffer_size = out_get_buffer_size;
1503         out->stream.common.get_channels = out_get_channels;
1504         out->stream.common.get_format = out_get_format;
1505         out->stream.common.set_format = out_set_format;
1506         out->stream.common.standby = out_standby;
1507         out->stream.common.dump = out_dump;
1508         out->stream.common.set_parameters = out_set_parameters;
1509         out->stream.common.get_parameters = out_get_parameters;
1510         out->stream.common.add_audio_effect = out_add_audio_effect;
1511         out->stream.common.remove_audio_effect = out_remove_audio_effect;
1512         out->stream.get_latency = out_get_latency;
1513         out->stream.set_volume = out_set_volume;
1514         out->stream.write = out_write;
1515         out->stream.get_render_position = out_get_render_position;
1516
1517         /* TODO: for now we always use endpoint 0 */
1518         out->ep = &audio_endpoints[0];
1519
1520         if (!open_endpoint(out->ep, &out->cfg))
1521                 goto fail;
1522
1523         DBG("rate=%d channels=%d format=%d", out->cfg.rate,
1524                                         out->cfg.channels, out->cfg.format);
1525
1526         if (out->cfg.channels == AUDIO_CHANNEL_OUT_MONO) {
1527                 out->downmix_buf = malloc(FIXED_BUFFER_SIZE / 2);
1528                 if (!out->downmix_buf)
1529                         goto fail;
1530         }
1531
1532         *stream_out = &out->stream;
1533         a2dp_dev->out = out;
1534
1535         out->audio_state = AUDIO_A2DP_STATE_STANDBY;
1536
1537         return 0;
1538
1539 fail:
1540         error("audio: cannot open output stream");
1541         free(out);
1542         *stream_out = NULL;
1543         return -EIO;
1544 }
1545
1546 static void audio_close_output_stream(struct audio_hw_device *dev,
1547                                         struct audio_stream_out *stream)
1548 {
1549         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1550         struct a2dp_stream_out *out = (struct a2dp_stream_out *) stream;
1551
1552         DBG("");
1553
1554         close_endpoint(a2dp_dev->out->ep);
1555
1556         free(out->downmix_buf);
1557
1558         free(stream);
1559         a2dp_dev->out = NULL;
1560 }
1561
1562 static int audio_set_parameters(struct audio_hw_device *dev,
1563                                                         const char *kvpairs)
1564 {
1565         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *) dev;
1566         struct a2dp_stream_out *out = a2dp_dev->out;
1567
1568         DBG("");
1569
1570         if (!out)
1571                 return 0;
1572
1573         return out->stream.common.set_parameters((struct audio_stream *) out,
1574                                                                 kvpairs);
1575 }
1576
1577 static char *audio_get_parameters(const struct audio_hw_device *dev,
1578                                                         const char *keys)
1579 {
1580         DBG("");
1581         return strdup("");
1582 }
1583
1584 static int audio_init_check(const struct audio_hw_device *dev)
1585 {
1586         DBG("");
1587         return 0;
1588 }
1589
1590 static int audio_set_voice_volume(struct audio_hw_device *dev, float volume)
1591 {
1592         DBG("");
1593         return -ENOSYS;
1594 }
1595
1596 static int audio_set_master_volume(struct audio_hw_device *dev, float volume)
1597 {
1598         DBG("");
1599         return -ENOSYS;
1600 }
1601
1602 static int audio_set_mode(struct audio_hw_device *dev, int mode)
1603 {
1604         DBG("");
1605         return -ENOSYS;
1606 }
1607
1608 static int audio_set_mic_mute(struct audio_hw_device *dev, bool state)
1609 {
1610         DBG("");
1611         return -ENOSYS;
1612 }
1613
1614 static int audio_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1615 {
1616         DBG("");
1617         return -ENOSYS;
1618 }
1619
1620 static size_t audio_get_input_buffer_size(const struct audio_hw_device *dev,
1621                                         const struct audio_config *config)
1622 {
1623         DBG("");
1624         return -ENOSYS;
1625 }
1626
1627 static int audio_open_input_stream(struct audio_hw_device *dev,
1628                                         audio_io_handle_t handle,
1629                                         audio_devices_t devices,
1630                                         struct audio_config *config,
1631                                         struct audio_stream_in **stream_in)
1632 {
1633         struct audio_stream_in *in;
1634
1635         DBG("");
1636
1637         in = calloc(1, sizeof(struct audio_stream_in));
1638         if (!in)
1639                 return -ENOMEM;
1640
1641         in->common.get_sample_rate = in_get_sample_rate;
1642         in->common.set_sample_rate = in_set_sample_rate;
1643         in->common.get_buffer_size = in_get_buffer_size;
1644         in->common.get_channels = in_get_channels;
1645         in->common.get_format = in_get_format;
1646         in->common.set_format = in_set_format;
1647         in->common.standby = in_standby;
1648         in->common.dump = in_dump;
1649         in->common.set_parameters = in_set_parameters;
1650         in->common.get_parameters = in_get_parameters;
1651         in->common.add_audio_effect = in_add_audio_effect;
1652         in->common.remove_audio_effect = in_remove_audio_effect;
1653         in->set_gain = in_set_gain;
1654         in->read = in_read;
1655         in->get_input_frames_lost = in_get_input_frames_lost;
1656
1657         *stream_in = in;
1658
1659         return 0;
1660 }
1661
1662 static void audio_close_input_stream(struct audio_hw_device *dev,
1663                                         struct audio_stream_in *stream_in)
1664 {
1665         DBG("");
1666         free(stream_in);
1667 }
1668
1669 static int audio_dump(const audio_hw_device_t *device, int fd)
1670 {
1671         DBG("");
1672         return -ENOSYS;
1673 }
1674
1675 static int audio_close(hw_device_t *device)
1676 {
1677         struct a2dp_audio_dev *a2dp_dev = (struct a2dp_audio_dev *)device;
1678
1679         DBG("");
1680
1681         unregister_endpoints();
1682
1683         shutdown(listen_sk, SHUT_RDWR);
1684         shutdown(audio_sk, SHUT_RDWR);
1685
1686         pthread_join(ipc_th, NULL);
1687
1688         close(listen_sk);
1689         listen_sk = -1;
1690
1691         free(a2dp_dev);
1692         return 0;
1693 }
1694
1695 static void *ipc_handler(void *data)
1696 {
1697         bool done = false;
1698         struct pollfd pfd;
1699         int sk;
1700
1701         DBG("");
1702
1703         while (!done) {
1704                 DBG("Waiting for connection ...");
1705
1706                 sk = accept(listen_sk, NULL, NULL);
1707                 if (sk < 0) {
1708                         int err = errno;
1709
1710                         if (err == EINTR)
1711                                 continue;
1712
1713                         if (err != ECONNABORTED && err != EINVAL)
1714                                 error("audio: Failed to accept socket: %d (%s)",
1715                                                         err, strerror(err));
1716
1717                         break;
1718                 }
1719
1720                 pthread_mutex_lock(&sk_mutex);
1721                 audio_sk = sk;
1722                 pthread_mutex_unlock(&sk_mutex);
1723
1724                 DBG("Audio IPC: Connected");
1725
1726                 if (register_endpoints() != AUDIO_STATUS_SUCCESS) {
1727                         error("audio: Failed to register endpoints");
1728
1729                         unregister_endpoints();
1730
1731                         pthread_mutex_lock(&sk_mutex);
1732                         shutdown(audio_sk, SHUT_RDWR);
1733                         close(audio_sk);
1734                         audio_sk = -1;
1735                         pthread_mutex_unlock(&sk_mutex);
1736
1737                         continue;
1738                 }
1739
1740                 memset(&pfd, 0, sizeof(pfd));
1741                 pfd.fd = audio_sk;
1742                 pfd.events = POLLHUP | POLLERR | POLLNVAL;
1743
1744                 /* Check if socket is still alive. Empty while loop.*/
1745                 while (poll(&pfd, 1, -1) < 0 && errno == EINTR);
1746
1747                 if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL)) {
1748                         info("Audio HAL: Socket closed");
1749
1750                         pthread_mutex_lock(&sk_mutex);
1751                         close(audio_sk);
1752                         audio_sk = -1;
1753                         pthread_mutex_unlock(&sk_mutex);
1754                 }
1755         }
1756
1757         /* audio_sk is closed at this point, just cleanup endpoints states */
1758         memset(audio_endpoints, 0, sizeof(audio_endpoints));
1759
1760         info("Closing Audio IPC thread");
1761         return NULL;
1762 }
1763
1764 static int audio_ipc_init(void)
1765 {
1766         struct sockaddr_un addr;
1767         int err;
1768         int sk;
1769
1770         DBG("");
1771
1772         sk = socket(PF_LOCAL, SOCK_SEQPACKET, 0);
1773         if (sk < 0) {
1774                 err = -errno;
1775                 error("audio: Failed to create socket: %d (%s)", -err,
1776                                                                 strerror(-err));
1777                 return err;
1778         }
1779
1780         memset(&addr, 0, sizeof(addr));
1781         addr.sun_family = AF_UNIX;
1782
1783         memcpy(addr.sun_path, BLUEZ_AUDIO_SK_PATH,
1784                                         sizeof(BLUEZ_AUDIO_SK_PATH));
1785
1786         if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1787                 err = -errno;
1788                 error("audio: Failed to bind socket: %d (%s)", -err,
1789                                                                 strerror(-err));
1790                 goto failed;
1791         }
1792
1793         if (listen(sk, 1) < 0) {
1794                 err = -errno;
1795                 error("audio: Failed to listen on the socket: %d (%s)", -err,
1796                                                                 strerror(-err));
1797                 goto failed;
1798         }
1799
1800         listen_sk = sk;
1801
1802         err = pthread_create(&ipc_th, NULL, ipc_handler, NULL);
1803         if (err) {
1804                 err = -err;
1805                 ipc_th = 0;
1806                 error("audio: Failed to start Audio IPC thread: %d (%s)",
1807                                                         -err, strerror(-err));
1808                 goto failed;
1809         }
1810
1811         return 0;
1812
1813 failed:
1814         close(sk);
1815         return err;
1816 }
1817
1818 static int audio_open(const hw_module_t *module, const char *name,
1819                                                         hw_device_t **device)
1820 {
1821         struct a2dp_audio_dev *a2dp_dev;
1822         int err;
1823
1824         DBG("");
1825
1826         if (strcmp(name, AUDIO_HARDWARE_INTERFACE)) {
1827                 error("audio: interface %s not matching [%s]", name,
1828                                                 AUDIO_HARDWARE_INTERFACE);
1829                 return -EINVAL;
1830         }
1831
1832         err = audio_ipc_init();
1833         if (err < 0)
1834                 return err;
1835
1836         a2dp_dev = calloc(1, sizeof(struct a2dp_audio_dev));
1837         if (!a2dp_dev)
1838                 return -ENOMEM;
1839
1840         a2dp_dev->dev.common.tag = HARDWARE_DEVICE_TAG;
1841         a2dp_dev->dev.common.version = AUDIO_DEVICE_API_VERSION_CURRENT;
1842         a2dp_dev->dev.common.module = (struct hw_module_t *) module;
1843         a2dp_dev->dev.common.close = audio_close;
1844
1845         a2dp_dev->dev.init_check = audio_init_check;
1846         a2dp_dev->dev.set_voice_volume = audio_set_voice_volume;
1847         a2dp_dev->dev.set_master_volume = audio_set_master_volume;
1848         a2dp_dev->dev.set_mode = audio_set_mode;
1849         a2dp_dev->dev.set_mic_mute = audio_set_mic_mute;
1850         a2dp_dev->dev.get_mic_mute = audio_get_mic_mute;
1851         a2dp_dev->dev.set_parameters = audio_set_parameters;
1852         a2dp_dev->dev.get_parameters = audio_get_parameters;
1853         a2dp_dev->dev.get_input_buffer_size = audio_get_input_buffer_size;
1854         a2dp_dev->dev.open_output_stream = audio_open_output_stream;
1855         a2dp_dev->dev.close_output_stream = audio_close_output_stream;
1856         a2dp_dev->dev.open_input_stream = audio_open_input_stream;
1857         a2dp_dev->dev.close_input_stream = audio_close_input_stream;
1858         a2dp_dev->dev.dump = audio_dump;
1859
1860         /* Note that &a2dp_dev->dev.common is the same pointer as a2dp_dev.
1861          * This results from the structure of following structs:a2dp_audio_dev,
1862          * audio_hw_device. We will rely on this later in the code.*/
1863         *device = &a2dp_dev->dev.common;
1864
1865         return 0;
1866 }
1867
1868 static struct hw_module_methods_t hal_module_methods = {
1869         .open = audio_open,
1870 };
1871
1872 struct audio_module HAL_MODULE_INFO_SYM = {
1873         .common = {
1874         .tag = HARDWARE_MODULE_TAG,
1875         .version_major = 1,
1876         .version_minor = 0,
1877         .id = AUDIO_HARDWARE_MODULE_ID,
1878         .name = "A2DP Bluez HW HAL",
1879         .author = "Intel Corporation",
1880         .methods = &hal_module_methods,
1881         },
1882 };