• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2009-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /*****************************************************************************
20  *
21  *  Filename:      audio_a2dp_hw.c
22  *
23  *  Description:   Implements hal for bluedroid a2dp audio device
24  *
25  *****************************************************************************/
26 
27 #include <errno.h>
28 #include <inttypes.h>
29 #include <pthread.h>
30 #include <stdint.h>
31 #include <sys/time.h>
32 #include <sys/socket.h>
33 #include <sys/un.h>
34 #include <sys/poll.h>
35 #include <sys/errno.h>
36 #include <sys/stat.h>
37 #include <unistd.h>
38 #include <fcntl.h>
39 #include <cutils/str_parms.h>
40 #include <cutils/sockets.h>
41 
42 #include <system/audio.h>
43 #include <hardware/audio.h>
44 
45 #include <hardware/hardware.h>
46 #include "audio_a2dp_hw.h"
47 #include "bt_utils.h"
48 
49 #define LOG_TAG "audio_a2dp_hw"
50 /* #define LOG_NDEBUG 0 */
51 #include <log/log.h>
52 
53 /*****************************************************************************
54 **  Constants & Macros
55 ******************************************************************************/
56 
57 #define CTRL_CHAN_RETRY_COUNT 3
58 #define USEC_PER_SEC 1000000L
59 
60 #define CASE_RETURN_STR(const) case const: return #const;
61 
62 #define FNLOG()             ALOGV("%s", __FUNCTION__);
63 #define DEBUG(fmt, ...)     ALOGV("%s: " fmt,__FUNCTION__, ## __VA_ARGS__)
64 #define INFO(fmt, ...)      ALOGI("%s: " fmt,__FUNCTION__, ## __VA_ARGS__)
65 #define ERROR(fmt, ...)     ALOGE("%s: " fmt,__FUNCTION__, ## __VA_ARGS__)
66 
67 #define ASSERTC(cond, msg, val) if (!(cond)) {ERROR("### ASSERT : %s line %d %s (%d) ###", __FILE__, __LINE__, msg, val);}
68 
69 /*****************************************************************************
70 **  Local type definitions
71 ******************************************************************************/
72 
73 typedef enum {
74     AUDIO_A2DP_STATE_STARTING,
75     AUDIO_A2DP_STATE_STARTED,
76     AUDIO_A2DP_STATE_STOPPING,
77     AUDIO_A2DP_STATE_STOPPED,
78     AUDIO_A2DP_STATE_SUSPENDED, /* need explicit set param call to resume (suspend=false) */
79     AUDIO_A2DP_STATE_STANDBY    /* allows write to autoresume */
80 } a2dp_state_t;
81 
82 struct a2dp_stream_in;
83 struct a2dp_stream_out;
84 
85 struct a2dp_audio_device {
86     struct audio_hw_device device;
87     struct a2dp_stream_in  *input;
88     struct a2dp_stream_out *output;
89 };
90 
91 struct a2dp_config {
92     uint32_t                rate;
93     uint32_t                channel_flags;
94     int                     format;
95 };
96 
97 /* move ctrl_fd outside output stream and keep open until HAL unloaded ? */
98 
99 struct a2dp_stream_common {
100     pthread_mutex_t         lock;
101     int                     ctrl_fd;
102     int                     audio_fd;
103     size_t                  buffer_sz;
104     struct a2dp_config      cfg;
105     a2dp_state_t            state;
106 };
107 
108 struct a2dp_stream_out {
109     struct audio_stream_out stream;
110     struct a2dp_stream_common common;
111 };
112 
113 struct a2dp_stream_in {
114     struct audio_stream_in  stream;
115     struct a2dp_stream_common common;
116 };
117 
118 /*****************************************************************************
119 **  Static variables
120 ******************************************************************************/
121 
122 /*****************************************************************************
123 **  Static functions
124 ******************************************************************************/
125 
126 static size_t out_get_buffer_size(const struct audio_stream *stream);
127 
128 /*****************************************************************************
129 **  Externs
130 ******************************************************************************/
131 
132 /*****************************************************************************
133 **  Functions
134 ******************************************************************************/
135 
136 /*****************************************************************************
137 **   Miscellaneous helper functions
138 ******************************************************************************/
139 
dump_a2dp_ctrl_event(char event)140 static const char* dump_a2dp_ctrl_event(char event)
141 {
142     switch(event)
143     {
144         CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
145         CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
146         CASE_RETURN_STR(A2DP_CTRL_CMD_START)
147         CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
148         CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
149         default:
150             return "UNKNOWN MSG ID";
151     }
152 }
153 
154 /* logs timestamp with microsec precision
155    pprev is optional in case a dedicated diff is required */
ts_log(char * tag,int val,struct timespec * pprev_opt)156 static void ts_log(char *tag, int val, struct timespec *pprev_opt)
157 {
158     struct timespec now;
159     static struct timespec prev = {0,0};
160     unsigned long long now_us;
161     unsigned long long diff_us;
162     UNUSED(tag);
163     UNUSED(val);
164 
165     clock_gettime(CLOCK_MONOTONIC, &now);
166 
167     now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
168 
169     if (pprev_opt)
170     {
171         diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
172         *pprev_opt = now;
173         DEBUG("[%s] ts %08lld, *diff %08lld, val %d", tag, now_us, diff_us, val);
174     }
175     else
176     {
177         diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
178         prev = now;
179         DEBUG("[%s] ts %08lld, diff %08lld, val %d", tag, now_us, diff_us, val);
180     }
181 }
182 
calc_audiotime(struct a2dp_config cfg,int bytes)183 static int calc_audiotime(struct a2dp_config cfg, int bytes)
184 {
185     int chan_count = popcount(cfg.channel_flags);
186 
187     ASSERTC(cfg.format == AUDIO_FORMAT_PCM_16_BIT,
188             "unsupported sample sz", cfg.format);
189 
190     return bytes*(1000000/(chan_count*2))/cfg.rate;
191 }
192 
193 /*****************************************************************************
194 **
195 **   bluedroid stack adaptation
196 **
197 *****************************************************************************/
198 
skt_connect(char * path,size_t buffer_sz)199 static int skt_connect(char *path, size_t buffer_sz)
200 {
201     int ret;
202     int skt_fd;
203     struct sockaddr_un remote;
204     int len;
205 
206     INFO("connect to %s (sz %zu)", path, buffer_sz);
207 
208     skt_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
209 
210     if(socket_local_client_connect(skt_fd, path,
211             ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) < 0)
212     {
213         ERROR("failed to connect (%s)", strerror(errno));
214         close(skt_fd);
215         return -1;
216     }
217 
218     len = buffer_sz;
219     ret = setsockopt(skt_fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, (int)sizeof(len));
220 
221     /* only issue warning if failed */
222     if (ret < 0)
223         ERROR("setsockopt failed (%s)", strerror(errno));
224 
225     ret = setsockopt(skt_fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, (int)sizeof(len));
226 
227     /* only issue warning if failed */
228     if (ret < 0)
229         ERROR("setsockopt failed (%s)", strerror(errno));
230 
231     INFO("connected to stack fd = %d", skt_fd);
232 
233     return skt_fd;
234 }
235 
skt_read(int fd,void * p,size_t len)236 static int skt_read(int fd, void *p, size_t len)
237 {
238     int read;
239     struct pollfd pfd;
240     struct timespec ts;
241 
242     FNLOG();
243 
244     ts_log("skt_read recv", len, NULL);
245 
246     if ((read = recv(fd, p, len, MSG_NOSIGNAL)) == -1)
247     {
248         ERROR("write failed with errno=%d\n", errno);
249         return -1;
250     }
251 
252     return read;
253 }
254 
skt_write(int fd,const void * p,size_t len)255 static int skt_write(int fd, const void *p, size_t len)
256 {
257     int sent;
258     struct pollfd pfd;
259 
260     FNLOG();
261 
262     pfd.fd = fd;
263     pfd.events = POLLOUT;
264 
265     /* poll for 500 ms */
266 
267     /* send time out */
268     if (poll(&pfd, 1, 500) == 0)
269         return 0;
270 
271     ts_log("skt_write", len, NULL);
272 
273     if ((sent = send(fd, p, len, MSG_NOSIGNAL)) == -1)
274     {
275         ERROR("write failed with errno=%d\n", errno);
276         return -1;
277     }
278 
279     return sent;
280 }
281 
skt_disconnect(int fd)282 static int skt_disconnect(int fd)
283 {
284     INFO("fd %d", fd);
285 
286     if (fd != AUDIO_SKT_DISCONNECTED)
287     {
288         shutdown(fd, SHUT_RDWR);
289         close(fd);
290     }
291     return 0;
292 }
293 
294 
295 
296 /*****************************************************************************
297 **
298 **  AUDIO CONTROL PATH
299 **
300 *****************************************************************************/
301 
a2dp_ctrl_receive(struct a2dp_stream_common * common,void * buffer,int length)302 static int a2dp_ctrl_receive(struct a2dp_stream_common *common, void* buffer, int length)
303 {
304     int ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
305     if (ret < 0)
306     {
307         ERROR("ack failed (%s)", strerror(errno));
308         if (errno == EINTR)
309         {
310             /* retry again */
311             ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
312             if (ret < 0)
313             {
314                ERROR("ack failed (%s)", strerror(errno));
315                skt_disconnect(common->ctrl_fd);
316                common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
317                return -1;
318             }
319         }
320         else
321         {
322                skt_disconnect(common->ctrl_fd);
323                common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
324                return -1;
325 
326         }
327     }
328     return ret;
329 }
330 
a2dp_command(struct a2dp_stream_common * common,char cmd)331 static int a2dp_command(struct a2dp_stream_common *common, char cmd)
332 {
333     char ack;
334 
335     DEBUG("A2DP COMMAND %s", dump_a2dp_ctrl_event(cmd));
336 
337     /* send command */
338     if (send(common->ctrl_fd, &cmd, 1, MSG_NOSIGNAL) == -1)
339     {
340         ERROR("cmd failed (%s)", strerror(errno));
341         skt_disconnect(common->ctrl_fd);
342         common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
343         return -1;
344     }
345 
346     /* wait for ack byte */
347     if (a2dp_ctrl_receive(common, &ack, 1) < 0)
348         return -1;
349 
350     DEBUG("A2DP COMMAND %s DONE STATUS %d", dump_a2dp_ctrl_event(cmd), ack);
351 
352     if (ack != A2DP_CTRL_ACK_SUCCESS)
353         return -1;
354 
355     return 0;
356 }
357 
check_a2dp_ready(struct a2dp_stream_common * common)358 static int check_a2dp_ready(struct a2dp_stream_common *common)
359 {
360     if (a2dp_command(common, A2DP_CTRL_CMD_CHECK_READY) < 0)
361     {
362         ERROR("check a2dp ready failed");
363         return -1;
364     }
365     return 0;
366 }
367 
a2dp_read_audio_config(struct a2dp_stream_common * common)368 static int a2dp_read_audio_config(struct a2dp_stream_common *common)
369 {
370     char cmd = A2DP_CTRL_GET_AUDIO_CONFIG;
371     uint32_t sample_rate;
372     uint8_t channel_count;
373 
374     if (a2dp_command(common, A2DP_CTRL_GET_AUDIO_CONFIG) < 0)
375     {
376         ERROR("check a2dp ready failed");
377         return -1;
378     }
379 
380     if (a2dp_ctrl_receive(common, &sample_rate, 4) < 0)
381         return -1;
382     if (a2dp_ctrl_receive(common, &channel_count, 1) < 0)
383         return -1;
384 
385     common->cfg.channel_flags = (channel_count == 1 ? AUDIO_CHANNEL_IN_MONO : AUDIO_CHANNEL_IN_STEREO);
386     common->cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
387     common->cfg.rate = sample_rate;
388 
389     INFO("got config %d %d", common->cfg.format, common->cfg.rate);
390 
391     return 0;
392 }
393 
a2dp_open_ctrl_path(struct a2dp_stream_common * common)394 static void a2dp_open_ctrl_path(struct a2dp_stream_common *common)
395 {
396     int i;
397 
398     /* retry logic to catch any timing variations on control channel */
399     for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
400     {
401         /* connect control channel if not already connected */
402         if ((common->ctrl_fd = skt_connect(A2DP_CTRL_PATH, common->buffer_sz)) > 0)
403         {
404             /* success, now check if stack is ready */
405             if (check_a2dp_ready(common) == 0)
406                 break;
407 
408             ERROR("error : a2dp not ready, wait 250 ms and retry");
409             usleep(250000);
410             skt_disconnect(common->ctrl_fd);
411             common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
412         }
413 
414         /* ctrl channel not ready, wait a bit */
415         usleep(250000);
416     }
417 }
418 
419 /*****************************************************************************
420 **
421 ** AUDIO DATA PATH
422 **
423 *****************************************************************************/
424 
a2dp_stream_common_init(struct a2dp_stream_common * common)425 static void a2dp_stream_common_init(struct a2dp_stream_common *common)
426 {
427     pthread_mutexattr_t lock_attr;
428 
429     FNLOG();
430 
431     pthread_mutexattr_init(&lock_attr);
432     pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
433     pthread_mutex_init(&common->lock, &lock_attr);
434 
435     common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
436     common->audio_fd = AUDIO_SKT_DISCONNECTED;
437     common->state = AUDIO_A2DP_STATE_STOPPED;
438 
439     /* manages max capacity of socket pipe */
440     common->buffer_sz = AUDIO_STREAM_OUTPUT_BUFFER_SZ;
441 }
442 
start_audio_datapath(struct a2dp_stream_common * common)443 static int start_audio_datapath(struct a2dp_stream_common *common)
444 {
445     int oldstate = common->state;
446 
447     INFO("state %d", common->state);
448 
449     if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED) {
450         INFO("AUDIO_SKT_DISCONNECTED");
451         return -1;
452     }
453 
454     common->state = AUDIO_A2DP_STATE_STARTING;
455 
456     if (a2dp_command(common, A2DP_CTRL_CMD_START) < 0)
457     {
458         ERROR("audiopath start failed");
459 
460         common->state = oldstate;
461         return -1;
462     }
463 
464     /* connect socket if not yet connected */
465     if (common->audio_fd == AUDIO_SKT_DISCONNECTED)
466     {
467         common->audio_fd = skt_connect(A2DP_DATA_PATH, common->buffer_sz);
468         if (common->audio_fd < 0)
469         {
470             common->state = oldstate;
471             return -1;
472         }
473 
474         common->state = AUDIO_A2DP_STATE_STARTED;
475     }
476 
477     return 0;
478 }
479 
480 
stop_audio_datapath(struct a2dp_stream_common * common)481 static int stop_audio_datapath(struct a2dp_stream_common *common)
482 {
483     int oldstate = common->state;
484 
485     INFO("state %d", common->state);
486 
487     if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
488          return -1;
489 
490     /* prevent any stray output writes from autostarting the stream
491        while stopping audiopath */
492     common->state = AUDIO_A2DP_STATE_STOPPING;
493 
494     if (a2dp_command(common, A2DP_CTRL_CMD_STOP) < 0)
495     {
496         ERROR("audiopath stop failed");
497         common->state = oldstate;
498         return -1;
499     }
500 
501     common->state = AUDIO_A2DP_STATE_STOPPED;
502 
503     /* disconnect audio path */
504     skt_disconnect(common->audio_fd);
505     common->audio_fd = AUDIO_SKT_DISCONNECTED;
506 
507     return 0;
508 }
509 
suspend_audio_datapath(struct a2dp_stream_common * common,bool standby)510 static int suspend_audio_datapath(struct a2dp_stream_common *common, bool standby)
511 {
512     INFO("state %d", common->state);
513 
514     if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
515          return -1;
516 
517     if (common->state == AUDIO_A2DP_STATE_STOPPING)
518         return -1;
519 
520     if (a2dp_command(common, A2DP_CTRL_CMD_SUSPEND) < 0)
521         return -1;
522 
523     if (standby)
524         common->state = AUDIO_A2DP_STATE_STANDBY;
525     else
526         common->state = AUDIO_A2DP_STATE_SUSPENDED;
527 
528     /* disconnect audio path */
529     skt_disconnect(common->audio_fd);
530 
531     common->audio_fd = AUDIO_SKT_DISCONNECTED;
532 
533     return 0;
534 }
535 
536 
537 /*****************************************************************************
538 **
539 **  audio output callbacks
540 **
541 *****************************************************************************/
542 
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)543 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
544                          size_t bytes)
545 {
546     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
547     int sent;
548 
549     DEBUG("write %zu bytes (fd %d)", bytes, out->common.audio_fd);
550 
551     if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
552     {
553         DEBUG("stream suspended");
554         return -1;
555     }
556 
557     /* only allow autostarting if we are in stopped or standby */
558     if ((out->common.state == AUDIO_A2DP_STATE_STOPPED) ||
559         (out->common.state == AUDIO_A2DP_STATE_STANDBY))
560     {
561         pthread_mutex_lock(&out->common.lock);
562 
563         if (start_audio_datapath(&out->common) < 0)
564         {
565             /* emulate time this write represents to avoid very fast write
566                failures during transition periods or remote suspend */
567 
568             int us_delay = calc_audiotime(out->common.cfg, bytes);
569 
570             DEBUG("emulate a2dp write delay (%d us)", us_delay);
571 
572             usleep(us_delay);
573             pthread_mutex_unlock(&out->common.lock);
574             return -1;
575         }
576 
577         pthread_mutex_unlock(&out->common.lock);
578     }
579     else if (out->common.state != AUDIO_A2DP_STATE_STARTED)
580     {
581         ERROR("stream not in stopped or standby");
582         return -1;
583     }
584 
585     sent = skt_write(out->common.audio_fd, buffer,  bytes);
586 
587     if (sent == -1)
588     {
589         skt_disconnect(out->common.audio_fd);
590         out->common.audio_fd = AUDIO_SKT_DISCONNECTED;
591         out->common.state = AUDIO_A2DP_STATE_STOPPED;
592     }
593 
594     DEBUG("wrote %d bytes out of %zu bytes", sent, bytes);
595     return sent;
596 }
597 
598 
out_get_sample_rate(const struct audio_stream * stream)599 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
600 {
601     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
602 
603     DEBUG("rate %" PRIu32,out->common.cfg.rate);
604 
605     return out->common.cfg.rate;
606 }
607 
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)608 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
609 {
610     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
611 
612     DEBUG("out_set_sample_rate : %" PRIu32, rate);
613 
614     if (rate != AUDIO_STREAM_DEFAULT_RATE)
615     {
616         ERROR("only rate %d supported", AUDIO_STREAM_DEFAULT_RATE);
617         return -1;
618     }
619 
620     out->common.cfg.rate = rate;
621 
622     return 0;
623 }
624 
out_get_buffer_size(const struct audio_stream * stream)625 static size_t out_get_buffer_size(const struct audio_stream *stream)
626 {
627     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
628 
629     DEBUG("buffer_size : %zu", out->common.buffer_sz);
630 
631     return out->common.buffer_sz;
632 }
633 
out_get_channels(const struct audio_stream * stream)634 static uint32_t out_get_channels(const struct audio_stream *stream)
635 {
636     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
637 
638     DEBUG("channels 0x%" PRIx32, out->common.cfg.channel_flags);
639 
640     return out->common.cfg.channel_flags;
641 }
642 
out_get_format(const struct audio_stream * stream)643 static audio_format_t out_get_format(const struct audio_stream *stream)
644 {
645     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
646     DEBUG("format 0x%x", out->common.cfg.format);
647     return out->common.cfg.format;
648 }
649 
out_set_format(struct audio_stream * stream,audio_format_t format)650 static int out_set_format(struct audio_stream *stream, audio_format_t format)
651 {
652     UNUSED(format);
653     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
654     DEBUG("setting format not yet supported (0x%x)", format);
655     return -ENOSYS;
656 }
657 
out_standby(struct audio_stream * stream)658 static int out_standby(struct audio_stream *stream)
659 {
660     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
661     int retVal = 0;
662 
663     FNLOG();
664 
665     pthread_mutex_lock(&out->common.lock);
666 
667     if (out->common.state == AUDIO_A2DP_STATE_STARTED)
668         retVal =  suspend_audio_datapath(&out->common, true);
669     else
670         retVal = 0;
671     pthread_mutex_unlock(&out->common.lock);
672 
673     return retVal;
674 }
675 
out_dump(const struct audio_stream * stream,int fd)676 static int out_dump(const struct audio_stream *stream, int fd)
677 {
678     UNUSED(fd);
679     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
680     FNLOG();
681     return 0;
682 }
683 
out_set_parameters(struct audio_stream * stream,const char * kvpairs)684 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
685 {
686     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
687     struct str_parms *parms;
688     char keyval[16];
689     int retval;
690     int status = 0;
691 
692     INFO("state %d", out->common.state);
693 
694     pthread_mutex_lock(&out->common.lock);
695 
696     parms = str_parms_create_str(kvpairs);
697 
698     /* dump params */
699     str_parms_dump(parms);
700 
701     retval = str_parms_get_str(parms, "closing", keyval, sizeof(keyval));
702 
703     if (retval >= 0)
704     {
705         if (strcmp(keyval, "true") == 0)
706         {
707             DEBUG("stream closing, disallow any writes");
708             out->common.state = AUDIO_A2DP_STATE_STOPPING;
709         }
710     }
711 
712     retval = str_parms_get_str(parms, "A2dpSuspended", keyval, sizeof(keyval));
713 
714     if (retval >= 0)
715     {
716         if (strcmp(keyval, "true") == 0)
717         {
718             if (out->common.state == AUDIO_A2DP_STATE_STARTED)
719                 status = suspend_audio_datapath(&out->common, false);
720         }
721         else
722         {
723             /* Do not start the streaming automatically. If the phone was streaming
724              * prior to being suspended, the next out_write shall trigger the
725              * AVDTP start procedure */
726             if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
727                 out->common.state = AUDIO_A2DP_STATE_STANDBY;
728             /* Irrespective of the state, return 0 */
729         }
730     }
731 
732     pthread_mutex_unlock(&out->common.lock);
733     str_parms_destroy(parms);
734 
735     return status;
736 }
737 
out_get_parameters(const struct audio_stream * stream,const char * keys)738 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
739 {
740     UNUSED(keys);
741     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
742 
743     FNLOG();
744 
745     /* add populating param here */
746 
747     return strdup("");
748 }
749 
out_get_latency(const struct audio_stream_out * stream)750 static uint32_t out_get_latency(const struct audio_stream_out *stream)
751 {
752     int latency_us;
753 
754     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
755 
756     FNLOG();
757 
758     latency_us = ((out->common.buffer_sz * 1000 ) /
759                     audio_stream_out_frame_size(&out->stream) /
760                     out->common.cfg.rate) * 1000;
761 
762 
763     return (latency_us / 1000) + 200;
764 }
765 
out_set_volume(struct audio_stream_out * stream,float left,float right)766 static int out_set_volume(struct audio_stream_out *stream, float left,
767                           float right)
768 {
769     UNUSED(stream);
770     UNUSED(left);
771     UNUSED(right);
772 
773     FNLOG();
774 
775     /* volume controlled in audioflinger mixer (digital) */
776 
777     return -ENOSYS;
778 }
779 
780 
781 
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)782 static int out_get_render_position(const struct audio_stream_out *stream,
783                                    uint32_t *dsp_frames)
784 {
785     UNUSED(stream);
786     UNUSED(dsp_frames);
787 
788     FNLOG();
789     return -EINVAL;
790 }
791 
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)792 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
793 {
794     UNUSED(stream);
795     UNUSED(effect);
796 
797     FNLOG();
798     return 0;
799 }
800 
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)801 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
802 {
803     UNUSED(stream);
804     UNUSED(effect);
805 
806     FNLOG();
807     return 0;
808 }
809 
810 /*
811  * AUDIO INPUT STREAM
812  */
813 
in_get_sample_rate(const struct audio_stream * stream)814 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
815 {
816     struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
817 
818     FNLOG();
819     return in->common.cfg.rate;
820 }
821 
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)822 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
823 {
824     struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
825 
826     FNLOG();
827 
828     if (in->common.cfg.rate > 0 && in->common.cfg.rate == rate)
829         return 0;
830     else
831         return -1;
832 }
833 
in_get_buffer_size(const struct audio_stream * stream)834 static size_t in_get_buffer_size(const struct audio_stream *stream)
835 {
836     UNUSED(stream);
837 
838     FNLOG();
839     return 320;
840 }
841 
in_get_channels(const struct audio_stream * stream)842 static uint32_t in_get_channels(const struct audio_stream *stream)
843 {
844     struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
845 
846     FNLOG();
847     return in->common.cfg.channel_flags;
848 }
849 
in_get_format(const struct audio_stream * stream)850 static audio_format_t in_get_format(const struct audio_stream *stream)
851 {
852     UNUSED(stream);
853 
854     FNLOG();
855     return AUDIO_FORMAT_PCM_16_BIT;
856 }
857 
in_set_format(struct audio_stream * stream,audio_format_t format)858 static int in_set_format(struct audio_stream *stream, audio_format_t format)
859 {
860     UNUSED(stream);
861     UNUSED(format);
862 
863     FNLOG();
864     if (format == AUDIO_FORMAT_PCM_16_BIT)
865         return 0;
866     else
867         return -1;
868 }
869 
in_standby(struct audio_stream * stream)870 static int in_standby(struct audio_stream *stream)
871 {
872     UNUSED(stream);
873 
874     FNLOG();
875     return 0;
876 }
877 
in_dump(const struct audio_stream * stream,int fd)878 static int in_dump(const struct audio_stream *stream, int fd)
879 {
880     UNUSED(stream);
881     UNUSED(fd);
882 
883     FNLOG();
884     return 0;
885 }
886 
in_set_parameters(struct audio_stream * stream,const char * kvpairs)887 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
888 {
889     UNUSED(stream);
890     UNUSED(kvpairs);
891 
892     FNLOG();
893     return 0;
894 }
895 
in_get_parameters(const struct audio_stream * stream,const char * keys)896 static char * in_get_parameters(const struct audio_stream *stream,
897                                 const char *keys)
898 {
899     UNUSED(stream);
900     UNUSED(keys);
901 
902     FNLOG();
903     return strdup("");
904 }
905 
in_set_gain(struct audio_stream_in * stream,float gain)906 static int in_set_gain(struct audio_stream_in *stream, float gain)
907 {
908     UNUSED(stream);
909     UNUSED(gain);
910 
911     FNLOG();
912     return 0;
913 }
914 
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)915 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
916                        size_t bytes)
917 {
918     struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
919     int read;
920 
921     DEBUG("read %zu bytes, state: %d", bytes, in->common.state);
922 
923     if (in->common.state == AUDIO_A2DP_STATE_SUSPENDED)
924     {
925         DEBUG("stream suspended");
926         return -1;
927     }
928 
929     /* only allow autostarting if we are in stopped or standby */
930     if ((in->common.state == AUDIO_A2DP_STATE_STOPPED) ||
931         (in->common.state == AUDIO_A2DP_STATE_STANDBY))
932     {
933         pthread_mutex_lock(&in->common.lock);
934 
935         if (start_audio_datapath(&in->common) < 0)
936         {
937             /* emulate time this write represents to avoid very fast write
938                failures during transition periods or remote suspend */
939 
940             int us_delay = calc_audiotime(in->common.cfg, bytes);
941 
942             DEBUG("emulate a2dp read delay (%d us)", us_delay);
943 
944             usleep(us_delay);
945             pthread_mutex_unlock(&in->common.lock);
946             return -1;
947         }
948 
949         pthread_mutex_unlock(&in->common.lock);
950     }
951     else if (in->common.state != AUDIO_A2DP_STATE_STARTED)
952     {
953         ERROR("stream not in stopped or standby");
954         return -1;
955     }
956 
957     read = skt_read(in->common.audio_fd, buffer, bytes);
958 
959     if (read == -1)
960     {
961         skt_disconnect(in->common.audio_fd);
962         in->common.audio_fd = AUDIO_SKT_DISCONNECTED;
963         in->common.state = AUDIO_A2DP_STATE_STOPPED;
964     } else if (read == 0) {
965         DEBUG("read time out - return zeros");
966         memset(buffer, 0, bytes);
967         read = bytes;
968     }
969 
970     DEBUG("read %d bytes out of %zu bytes", read, bytes);
971     return read;
972 }
973 
in_get_input_frames_lost(struct audio_stream_in * stream)974 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
975 {
976     UNUSED(stream);
977 
978     FNLOG();
979     return 0;
980 }
981 
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)982 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
983 {
984     UNUSED(stream);
985     UNUSED(effect);
986 
987     FNLOG();
988     return 0;
989 }
990 
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)991 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
992 {
993     UNUSED(stream);
994     UNUSED(effect);
995 
996     FNLOG();
997 
998     return 0;
999 }
1000 
adev_open_output_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,audio_output_flags_t flags,struct audio_config * config,struct audio_stream_out ** stream_out,const char * address __unused)1001 static int adev_open_output_stream(struct audio_hw_device *dev,
1002                                    audio_io_handle_t handle,
1003                                    audio_devices_t devices,
1004                                    audio_output_flags_t flags,
1005                                    struct audio_config *config,
1006                                    struct audio_stream_out **stream_out,
1007                                    const char *address __unused)
1008 
1009 {
1010     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
1011     struct a2dp_stream_out *out;
1012     int ret = 0;
1013     int i;
1014     UNUSED(handle);
1015     UNUSED(devices);
1016     UNUSED(flags);
1017 
1018     INFO("opening output");
1019 
1020     out = (struct a2dp_stream_out *)calloc(1, sizeof(struct a2dp_stream_out));
1021 
1022     if (!out)
1023         return -ENOMEM;
1024 
1025     out->stream.common.get_sample_rate = out_get_sample_rate;
1026     out->stream.common.set_sample_rate = out_set_sample_rate;
1027     out->stream.common.get_buffer_size = out_get_buffer_size;
1028     out->stream.common.get_channels = out_get_channels;
1029     out->stream.common.get_format = out_get_format;
1030     out->stream.common.set_format = out_set_format;
1031     out->stream.common.standby = out_standby;
1032     out->stream.common.dump = out_dump;
1033     out->stream.common.set_parameters = out_set_parameters;
1034     out->stream.common.get_parameters = out_get_parameters;
1035     out->stream.common.add_audio_effect = out_add_audio_effect;
1036     out->stream.common.remove_audio_effect = out_remove_audio_effect;
1037     out->stream.get_latency = out_get_latency;
1038     out->stream.set_volume = out_set_volume;
1039     out->stream.write = out_write;
1040     out->stream.get_render_position = out_get_render_position;
1041 
1042     /* initialize a2dp specifics */
1043     a2dp_stream_common_init(&out->common);
1044 
1045     out->common.cfg.channel_flags = AUDIO_STREAM_DEFAULT_CHANNEL_FLAG;
1046     out->common.cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
1047     out->common.cfg.rate = AUDIO_STREAM_DEFAULT_RATE;
1048 
1049    /* set output config values */
1050    if (config)
1051    {
1052       config->format = out_get_format((const struct audio_stream *)&out->stream);
1053       config->sample_rate = out_get_sample_rate((const struct audio_stream *)&out->stream);
1054       config->channel_mask = out_get_channels((const struct audio_stream *)&out->stream);
1055    }
1056     *stream_out = &out->stream;
1057     a2dp_dev->output = out;
1058 
1059     a2dp_open_ctrl_path(&out->common);
1060     if (out->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
1061     {
1062         ERROR("ctrl socket failed to connect (%s)", strerror(errno));
1063         ret = -1;
1064         goto err_open;
1065     }
1066 
1067     DEBUG("success");
1068     return 0;
1069 
1070 err_open:
1071     free(out);
1072     *stream_out = NULL;
1073     a2dp_dev->output = NULL;
1074     ERROR("failed");
1075     return ret;
1076 }
1077 
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)1078 static void adev_close_output_stream(struct audio_hw_device *dev,
1079                                      struct audio_stream_out *stream)
1080 {
1081     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
1082     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
1083 
1084     INFO("closing output (state %d)", out->common.state);
1085 
1086     if ((out->common.state == AUDIO_A2DP_STATE_STARTED) || (out->common.state == AUDIO_A2DP_STATE_STOPPING))
1087         stop_audio_datapath(&out->common);
1088 
1089     skt_disconnect(out->common.ctrl_fd);
1090     free(stream);
1091     a2dp_dev->output = NULL;
1092 
1093     DEBUG("done");
1094 }
1095 
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)1096 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
1097 {
1098     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
1099     struct a2dp_stream_out *out = a2dp_dev->output;
1100     int retval = 0;
1101 
1102     if (out == NULL)
1103         return retval;
1104 
1105     INFO("state %d", out->common.state);
1106 
1107     retval = out->stream.common.set_parameters((struct audio_stream *)out, kvpairs);
1108 
1109     return retval;
1110 }
1111 
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)1112 static char * adev_get_parameters(const struct audio_hw_device *dev,
1113                                   const char *keys)
1114 {
1115     struct str_parms *parms;
1116     UNUSED(dev);
1117 
1118     FNLOG();
1119 
1120     parms = str_parms_create_str(keys);
1121 
1122     str_parms_dump(parms);
1123 
1124     str_parms_destroy(parms);
1125 
1126     return strdup("");
1127 }
1128 
adev_init_check(const struct audio_hw_device * dev)1129 static int adev_init_check(const struct audio_hw_device *dev)
1130 {
1131     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device*)dev;
1132 
1133     FNLOG();
1134 
1135     return 0;
1136 }
1137 
adev_set_voice_volume(struct audio_hw_device * dev,float volume)1138 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
1139 {
1140     UNUSED(dev);
1141     UNUSED(volume);
1142 
1143     FNLOG();
1144 
1145     return -ENOSYS;
1146 }
1147 
adev_set_master_volume(struct audio_hw_device * dev,float volume)1148 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
1149 {
1150     UNUSED(dev);
1151     UNUSED(volume);
1152 
1153     FNLOG();
1154 
1155     return -ENOSYS;
1156 }
1157 
adev_set_mode(struct audio_hw_device * dev,int mode)1158 static int adev_set_mode(struct audio_hw_device *dev, int mode)
1159 {
1160     UNUSED(dev);
1161     UNUSED(mode);
1162 
1163     FNLOG();
1164 
1165     return 0;
1166 }
1167 
adev_set_mic_mute(struct audio_hw_device * dev,bool state)1168 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
1169 {
1170     UNUSED(dev);
1171     UNUSED(state);
1172 
1173     FNLOG();
1174 
1175     return -ENOSYS;
1176 }
1177 
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)1178 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1179 {
1180     UNUSED(dev);
1181     UNUSED(state);
1182 
1183     FNLOG();
1184 
1185     return -ENOSYS;
1186 }
1187 
adev_get_input_buffer_size(const struct audio_hw_device * dev,const struct audio_config * config)1188 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
1189                                          const struct audio_config *config)
1190 {
1191     UNUSED(dev);
1192     UNUSED(config);
1193 
1194     FNLOG();
1195 
1196     return 320;
1197 }
1198 
adev_open_input_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,struct audio_config * config,struct audio_stream_in ** stream_in,audio_input_flags_t flags __unused,const char * address __unused,audio_source_t source __unused)1199 static int adev_open_input_stream(struct audio_hw_device *dev,
1200                                   audio_io_handle_t handle,
1201                                   audio_devices_t devices,
1202                                   struct audio_config *config,
1203                                   struct audio_stream_in **stream_in,
1204                                   audio_input_flags_t flags __unused,
1205                                   const char *address __unused,
1206                                   audio_source_t source __unused)
1207 {
1208     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
1209     struct a2dp_stream_in *in;
1210     int ret;
1211     UNUSED(handle);
1212     UNUSED(devices);
1213     UNUSED(config);
1214 
1215     FNLOG();
1216 
1217     in = (struct a2dp_stream_in *)calloc(1, sizeof(struct a2dp_stream_in));
1218 
1219     if (!in)
1220         return -ENOMEM;
1221 
1222     in->stream.common.get_sample_rate = in_get_sample_rate;
1223     in->stream.common.set_sample_rate = in_set_sample_rate;
1224     in->stream.common.get_buffer_size = in_get_buffer_size;
1225     in->stream.common.get_channels = in_get_channels;
1226     in->stream.common.get_format = in_get_format;
1227     in->stream.common.set_format = in_set_format;
1228     in->stream.common.standby = in_standby;
1229     in->stream.common.dump = in_dump;
1230     in->stream.common.set_parameters = in_set_parameters;
1231     in->stream.common.get_parameters = in_get_parameters;
1232     in->stream.common.add_audio_effect = in_add_audio_effect;
1233     in->stream.common.remove_audio_effect = in_remove_audio_effect;
1234     in->stream.set_gain = in_set_gain;
1235     in->stream.read = in_read;
1236     in->stream.get_input_frames_lost = in_get_input_frames_lost;
1237 
1238     /* initialize a2dp specifics */
1239     a2dp_stream_common_init(&in->common);
1240 
1241     *stream_in = &in->stream;
1242     a2dp_dev->input = in;
1243 
1244     a2dp_open_ctrl_path(&in->common);
1245     if (in->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
1246     {
1247         ERROR("ctrl socket failed to connect (%s)", strerror(errno));
1248         ret = -1;
1249         goto err_open;
1250     }
1251 
1252     if (a2dp_read_audio_config(&in->common) < 0) {
1253         ERROR("a2dp_read_audio_config failed (%s)", strerror(errno));
1254         ret = -1;
1255         goto err_open;
1256     }
1257 
1258     DEBUG("success");
1259     return 0;
1260 
1261 err_open:
1262     free(in);
1263     *stream_in = NULL;
1264     a2dp_dev->input = NULL;
1265     ERROR("failed");
1266     return ret;
1267 }
1268 
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * stream)1269 static void adev_close_input_stream(struct audio_hw_device *dev,
1270                                    struct audio_stream_in *stream)
1271 {
1272     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
1273     struct a2dp_stream_in* in = (struct a2dp_stream_in *)stream;
1274     a2dp_state_t state = in->common.state;
1275 
1276     INFO("closing input (state %d)", state);
1277 
1278     if ((state == AUDIO_A2DP_STATE_STARTED) || (state == AUDIO_A2DP_STATE_STOPPING))
1279         stop_audio_datapath(&in->common);
1280 
1281     skt_disconnect(in->common.ctrl_fd);
1282     free(stream);
1283     a2dp_dev->input = NULL;
1284 
1285     DEBUG("done");
1286 }
1287 
adev_dump(const audio_hw_device_t * device,int fd)1288 static int adev_dump(const audio_hw_device_t *device, int fd)
1289 {
1290     UNUSED(device);
1291     UNUSED(fd);
1292 
1293     FNLOG();
1294 
1295     return 0;
1296 }
1297 
adev_close(hw_device_t * device)1298 static int adev_close(hw_device_t *device)
1299 {
1300     FNLOG();
1301 
1302     free(device);
1303     return 0;
1304 }
1305 
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)1306 static int adev_open(const hw_module_t* module, const char* name,
1307                      hw_device_t** device)
1308 {
1309     struct a2dp_audio_device *adev;
1310     int ret;
1311 
1312     INFO(" adev_open in A2dp_hw module");
1313     FNLOG();
1314 
1315     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
1316     {
1317         ERROR("interface %s not matching [%s]", name, AUDIO_HARDWARE_INTERFACE);
1318         return -EINVAL;
1319     }
1320 
1321     adev = calloc(1, sizeof(struct a2dp_audio_device));
1322 
1323     if (!adev)
1324         return -ENOMEM;
1325 
1326     adev->device.common.tag = HARDWARE_DEVICE_TAG;
1327     adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
1328     adev->device.common.module = (struct hw_module_t *) module;
1329     adev->device.common.close = adev_close;
1330 
1331     adev->device.init_check = adev_init_check;
1332     adev->device.set_voice_volume = adev_set_voice_volume;
1333     adev->device.set_master_volume = adev_set_master_volume;
1334     adev->device.set_mode = adev_set_mode;
1335     adev->device.set_mic_mute = adev_set_mic_mute;
1336     adev->device.get_mic_mute = adev_get_mic_mute;
1337     adev->device.set_parameters = adev_set_parameters;
1338     adev->device.get_parameters = adev_get_parameters;
1339     adev->device.get_input_buffer_size = adev_get_input_buffer_size;
1340     adev->device.open_output_stream = adev_open_output_stream;
1341     adev->device.close_output_stream = adev_close_output_stream;
1342     adev->device.open_input_stream = adev_open_input_stream;
1343     adev->device.close_input_stream = adev_close_input_stream;
1344     adev->device.dump = adev_dump;
1345 
1346     adev->output = NULL;
1347 
1348 
1349     *device = &adev->device.common;
1350 
1351     return 0;
1352 }
1353 
1354 static struct hw_module_methods_t hal_module_methods = {
1355     .open = adev_open,
1356 };
1357 
1358 struct audio_module HAL_MODULE_INFO_SYM = {
1359     .common = {
1360         .tag = HARDWARE_MODULE_TAG,
1361         .version_major = 1,
1362         .version_minor = 0,
1363         .id = AUDIO_HARDWARE_MODULE_ID,
1364         .name = "A2DP Audio HW HAL",
1365         .author = "The Android Open Source Project",
1366         .methods = &hal_module_methods,
1367     },
1368 };
1369 
1370