1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6 #include <syslog.h>
7
8 #include "audio_thread.h"
9 #include "cras_empty_iodev.h"
10 #include "cras_iodev.h"
11 #include "cras_iodev_info.h"
12 #include "cras_iodev_list.h"
13 #include "cras_loopback_iodev.h"
14 #include "cras_observer.h"
15 #include "cras_rstream.h"
16 #include "cras_server.h"
17 #include "cras_tm.h"
18 #include "cras_types.h"
19 #include "cras_system_state.h"
20 #include "server_stream.h"
21 #include "stream_list.h"
22 #include "test_iodev.h"
23 #include "utlist.h"
24
25 const struct timespec idle_timeout_interval = {
26 .tv_sec = 10,
27 .tv_nsec = 0
28 };
29
30 /* Linked list of available devices. */
31 struct iodev_list {
32 struct cras_iodev *iodevs;
33 size_t size;
34 };
35
36 /* List of enabled input/output devices.
37 * dev - The device.
38 * init_timer - Timer for a delayed call to init this iodev.
39 */
40 struct enabled_dev {
41 struct cras_iodev *dev;
42 struct enabled_dev *prev, *next;
43 };
44
45 struct dev_init_retry {
46 int dev_idx;
47 struct cras_timer *init_timer;
48 struct dev_init_retry *next, *prev;
49 };
50
51 struct device_enabled_cb {
52 device_enabled_callback_t enabled_cb;
53 device_disabled_callback_t disabled_cb;
54 void *cb_data;
55 struct device_enabled_cb *next, *prev;
56 };
57
58 /* Lists for devs[CRAS_STREAM_INPUT] and devs[CRAS_STREAM_OUTPUT]. */
59 static struct iodev_list devs[CRAS_NUM_DIRECTIONS];
60 /* The observer client iodev_list used to listen on various events. */
61 static struct cras_observer_client *list_observer;
62 /* Keep a list of enabled inputs and outputs. */
63 static struct enabled_dev *enabled_devs[CRAS_NUM_DIRECTIONS];
64 /* Keep an empty device per direction. */
65 static struct cras_iodev *fallback_devs[CRAS_NUM_DIRECTIONS];
66 /* Special empty device for hotword streams. */
67 static struct cras_iodev *empty_hotword_dev;
68 /* Loopback devices. */
69 static struct cras_iodev *loopdev_post_mix;
70 static struct cras_iodev *loopdev_post_dsp;
71 /* List of pending device init retries. */
72 static struct dev_init_retry *init_retries;
73
74 /* Keep a constantly increasing index for iodevs. Index 0 is reserved
75 * to mean "no device". */
76 static uint32_t next_iodev_idx = MAX_SPECIAL_DEVICE_IDX;
77
78 /* Call when a device is enabled or disabled. */
79 struct device_enabled_cb *device_enable_cbs;
80
81 /* Thread that handles audio input and output. */
82 static struct audio_thread *audio_thread;
83 /* List of all streams. */
84 static struct stream_list *stream_list;
85 /* Idle device timer. */
86 static struct cras_timer *idle_timer;
87 /* Flag to indicate that the stream list is disconnected from audio thread. */
88 static int stream_list_suspended = 0;
89 /* If init device failed, retry after 1 second. */
90 static const unsigned int INIT_DEV_DELAY_MS = 1000;
91 /* Flag to indicate that hotword streams are suspended. */
92 static int hotword_suspended = 0;
93
94 static void idle_dev_check(struct cras_timer *timer, void *data);
95
find_dev(size_t dev_index)96 static struct cras_iodev *find_dev(size_t dev_index)
97 {
98 struct cras_iodev *dev;
99
100 DL_FOREACH(devs[CRAS_STREAM_OUTPUT].iodevs, dev)
101 if (dev->info.idx == dev_index)
102 return dev;
103
104 DL_FOREACH(devs[CRAS_STREAM_INPUT].iodevs, dev)
105 if (dev->info.idx == dev_index)
106 return dev;
107
108 return NULL;
109 }
110
find_node(cras_node_id_t id)111 static struct cras_ionode *find_node(cras_node_id_t id)
112 {
113 struct cras_iodev *dev;
114 struct cras_ionode *node;
115 uint32_t dev_index, node_index;
116
117 dev_index = dev_index_of(id);
118 node_index = node_index_of(id);
119
120 dev = find_dev(dev_index);
121 if (!dev)
122 return NULL;
123
124 DL_FOREACH(dev->nodes, node)
125 if (node->idx == node_index)
126 return node;
127
128 return NULL;
129 }
130
131 /* Adds a device to the list. Used from add_input and add_output. */
add_dev_to_list(struct cras_iodev * dev)132 static int add_dev_to_list(struct cras_iodev *dev)
133 {
134 struct cras_iodev *tmp;
135 uint32_t new_idx;
136 struct iodev_list *list = &devs[dev->direction];
137
138 DL_FOREACH(list->iodevs, tmp)
139 if (tmp == dev)
140 return -EEXIST;
141
142 dev->format = NULL;
143 dev->ext_format = NULL;
144 dev->prev = dev->next = NULL;
145
146 /* Move to the next index and make sure it isn't taken. */
147 new_idx = next_iodev_idx;
148 while (1) {
149 if (new_idx < MAX_SPECIAL_DEVICE_IDX)
150 new_idx = MAX_SPECIAL_DEVICE_IDX;
151 DL_SEARCH_SCALAR(list->iodevs, tmp, info.idx, new_idx);
152 if (tmp == NULL)
153 break;
154 new_idx++;
155 }
156 dev->info.idx = new_idx;
157 next_iodev_idx = new_idx + 1;
158 list->size++;
159
160 syslog(LOG_INFO, "Adding %s dev at index %u.",
161 dev->direction == CRAS_STREAM_OUTPUT ? "output" : "input",
162 dev->info.idx);
163 DL_PREPEND(list->iodevs, dev);
164
165 cras_iodev_list_update_device_list();
166 return 0;
167 }
168
169 /* Removes a device to the list. Used from rm_input and rm_output. */
rm_dev_from_list(struct cras_iodev * dev)170 static int rm_dev_from_list(struct cras_iodev *dev)
171 {
172 struct cras_iodev *tmp;
173
174 DL_FOREACH(devs[dev->direction].iodevs, tmp)
175 if (tmp == dev) {
176 if (cras_iodev_is_open(dev))
177 return -EBUSY;
178 DL_DELETE(devs[dev->direction].iodevs, dev);
179 devs[dev->direction].size--;
180 return 0;
181 }
182
183 /* Device not found. */
184 return -EINVAL;
185 }
186
187 /* Fills a dev_info array from the iodev_list. */
fill_dev_list(struct iodev_list * list,struct cras_iodev_info * dev_info,size_t out_size)188 static void fill_dev_list(struct iodev_list *list,
189 struct cras_iodev_info *dev_info,
190 size_t out_size)
191 {
192 int i = 0;
193 struct cras_iodev *tmp;
194 DL_FOREACH(list->iodevs, tmp) {
195 memcpy(&dev_info[i], &tmp->info, sizeof(dev_info[0]));
196 i++;
197 if (i == out_size)
198 return;
199 }
200 }
201
node_type_to_str(struct cras_ionode * node)202 static const char *node_type_to_str(struct cras_ionode *node)
203 {
204 switch (node->type) {
205 case CRAS_NODE_TYPE_INTERNAL_SPEAKER:
206 return "INTERNAL_SPEAKER";
207 case CRAS_NODE_TYPE_HEADPHONE:
208 return "HEADPHONE";
209 case CRAS_NODE_TYPE_HDMI:
210 return "HDMI";
211 case CRAS_NODE_TYPE_HAPTIC:
212 return "HAPTIC";
213 case CRAS_NODE_TYPE_MIC:
214 switch (node->position) {
215 case NODE_POSITION_INTERNAL:
216 return "INTERNAL_MIC";
217 case NODE_POSITION_FRONT:
218 return "FRONT_MIC";
219 case NODE_POSITION_REAR:
220 return "REAR_MIC";
221 case NODE_POSITION_KEYBOARD:
222 return "KEYBOARD_MIC";
223 case NODE_POSITION_EXTERNAL:
224 default:
225 return "MIC";
226 }
227 case CRAS_NODE_TYPE_HOTWORD:
228 return "HOTWORD";
229 case CRAS_NODE_TYPE_LINEOUT:
230 return "LINEOUT";
231 case CRAS_NODE_TYPE_POST_MIX_PRE_DSP:
232 return "POST_MIX_LOOPBACK";
233 case CRAS_NODE_TYPE_POST_DSP:
234 return "POST_DSP_LOOPBACK";
235 case CRAS_NODE_TYPE_USB:
236 return "USB";
237 case CRAS_NODE_TYPE_BLUETOOTH:
238 return "BLUETOOTH";
239 case CRAS_NODE_TYPE_UNKNOWN:
240 default:
241 return "UNKNOWN";
242 }
243 }
244
245 /* Fills an ionode_info array from the iodev_list. */
fill_node_list(struct iodev_list * list,struct cras_ionode_info * node_info,size_t out_size)246 static int fill_node_list(struct iodev_list *list,
247 struct cras_ionode_info *node_info,
248 size_t out_size)
249 {
250 int i = 0;
251 struct cras_iodev *dev;
252 struct cras_ionode *node;
253 DL_FOREACH(list->iodevs, dev) {
254 DL_FOREACH(dev->nodes, node) {
255 node_info->iodev_idx = dev->info.idx;
256 node_info->ionode_idx = node->idx;
257 node_info->plugged = node->plugged;
258 node_info->plugged_time.tv_sec =
259 node->plugged_time.tv_sec;
260 node_info->plugged_time.tv_usec =
261 node->plugged_time.tv_usec;
262 node_info->active = dev->is_enabled &&
263 (dev->active_node == node);
264 node_info->volume = node->volume;
265 node_info->capture_gain = node->capture_gain;
266 node_info->left_right_swapped = node->left_right_swapped;
267 node_info->stable_id = node->stable_id;
268 node_info->stable_id_new = node->stable_id_new;
269 strcpy(node_info->mic_positions, node->mic_positions);
270 strcpy(node_info->name, node->name);
271 strcpy(node_info->active_hotword_model,
272 node->active_hotword_model);
273 snprintf(node_info->type, sizeof(node_info->type), "%s",
274 node_type_to_str(node));
275 node_info->type_enum = node->type;
276 node_info++;
277 i++;
278 if (i == out_size)
279 return i;
280 }
281 }
282 return i;
283 }
284
285 /* Copies the info for each device in the list to "list_out". */
get_dev_list(struct iodev_list * list,struct cras_iodev_info ** list_out)286 static int get_dev_list(struct iodev_list *list,
287 struct cras_iodev_info **list_out)
288 {
289 struct cras_iodev_info *dev_info;
290
291 if (!list_out)
292 return list->size;
293
294 *list_out = NULL;
295 if (list->size == 0)
296 return 0;
297
298 dev_info = malloc(sizeof(*list_out[0]) * list->size);
299 if (dev_info == NULL)
300 return -ENOMEM;
301
302 fill_dev_list(list, dev_info, list->size);
303
304 *list_out = dev_info;
305 return list->size;
306 }
307
308 /* Called when the system volume changes. Pass the current volume setting to
309 * the default output if it is active. */
sys_vol_change(void * context,int32_t volume)310 static void sys_vol_change(void *context, int32_t volume)
311 {
312 struct cras_iodev *dev;
313
314 DL_FOREACH(devs[CRAS_STREAM_OUTPUT].iodevs, dev) {
315 if (dev->set_volume && cras_iodev_is_open(dev))
316 dev->set_volume(dev);
317 }
318 }
319
320 /*
321 * Checks if a device should start ramping for mute/unmute change.
322 * Device must meet all the conditions:
323 *
324 * - Device is enabled in iodev_list.
325 * - Device has ramp support.
326 * - Device is in normal run state, that is, it must be running with valid
327 * streams.
328 * - Device volume, which considers both system volume and adjusted active
329 * node volume, is not zero. If device volume is zero, all the samples are
330 * suppressed to zero and there is no need to ramp.
331 */
device_should_start_ramp_for_mute(const struct cras_iodev * dev)332 static int device_should_start_ramp_for_mute(const struct cras_iodev *dev)
333 {
334 return (cras_iodev_list_dev_is_enabled(dev) && dev->ramp &&
335 cras_iodev_state(dev) == CRAS_IODEV_STATE_NORMAL_RUN &&
336 !cras_iodev_is_zero_volume(dev));
337 }
338
339 /* Called when the system mute state changes. Pass the current mute setting
340 * to the default output if it is active. */
sys_mute_change(void * context,int muted,int user_muted,int mute_locked)341 static void sys_mute_change(void *context, int muted, int user_muted,
342 int mute_locked)
343 {
344 struct cras_iodev *dev;
345 int should_mute = muted || user_muted;
346
347 DL_FOREACH(devs[CRAS_STREAM_OUTPUT].iodevs, dev) {
348 if (device_should_start_ramp_for_mute(dev)) {
349 /*
350 * Start ramping in audio thread and set mute/unmute
351 * state on device. This should only be done when
352 * device is running with valid streams.
353 *
354 * 1. Mute -> Unmute: Set device unmute state after
355 * ramping is started.
356 * 2. Unmute -> Mute: Set device mute state after
357 * ramping is done.
358 *
359 * The above transition will be handled by
360 * cras_iodev_ramp_start.
361 */
362 audio_thread_dev_start_ramp(
363 audio_thread,
364 dev,
365 (should_mute ?
366 CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE :
367 CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE));
368
369 } else {
370 /* For device without ramp, just set its mute state. */
371 cras_iodev_set_mute(dev);
372 }
373 }
374 }
375
remove_all_streams_from_dev(struct cras_iodev * dev)376 static void remove_all_streams_from_dev(struct cras_iodev *dev)
377 {
378 struct cras_rstream *rstream;
379
380 audio_thread_rm_open_dev(audio_thread, dev);
381
382 DL_FOREACH(stream_list_get(stream_list), rstream) {
383 if (rstream->apm_list == NULL)
384 continue;
385 cras_apm_list_remove(rstream->apm_list, dev);
386 }
387 }
388
389 /*
390 * If output dev has an echo reference dev associated, add a server
391 * stream to read audio data from it so APM can analyze.
392 */
possibly_enable_echo_reference(struct cras_iodev * dev)393 static void possibly_enable_echo_reference(struct cras_iodev *dev)
394 {
395 if (dev->direction != CRAS_STREAM_OUTPUT)
396 return;
397
398 if (dev->echo_reference_dev == NULL)
399 return;
400
401 server_stream_create(stream_list, dev->echo_reference_dev->info.idx);
402 }
403
404 /*
405 * If output dev has an echo reference dev associated, check if there
406 * is server stream opened for it and remove it.
407 */
possibly_disable_echo_reference(struct cras_iodev * dev)408 static void possibly_disable_echo_reference(struct cras_iodev *dev)
409 {
410 if (dev->echo_reference_dev == NULL)
411 return;
412
413 server_stream_destroy(stream_list, dev->echo_reference_dev->info.idx);
414 }
415
416 /*
417 * Close dev if it's opened, without the extra call to idle_dev_check.
418 * This is useful for closing a dev inside idle_dev_check function to
419 * avoid infinite recursive call.
420 *
421 * Returns:
422 * -EINVAL if device was not opened, otherwise return 0.
423 */
close_dev_without_idle_check(struct cras_iodev * dev)424 static int close_dev_without_idle_check(struct cras_iodev *dev)
425 {
426 if (!cras_iodev_is_open(dev))
427 return -EINVAL;
428 if (cras_iodev_has_pinned_stream(dev))
429 syslog(LOG_ERR, "Closing device with pinned streams.");
430
431 remove_all_streams_from_dev(dev);
432 dev->idle_timeout.tv_sec = 0;
433 cras_iodev_close(dev);
434 possibly_disable_echo_reference(dev);
435 return 0;
436 }
437
close_dev(struct cras_iodev * dev)438 static void close_dev(struct cras_iodev *dev)
439 {
440 if (close_dev_without_idle_check(dev))
441 return;
442
443 if (idle_timer)
444 cras_tm_cancel_timer(cras_system_state_get_tm(), idle_timer);
445 idle_dev_check(NULL, NULL);
446 }
447
idle_dev_check(struct cras_timer * timer,void * data)448 static void idle_dev_check(struct cras_timer *timer, void *data)
449 {
450 struct enabled_dev *edev;
451 struct timespec now;
452 struct timespec min_idle_expiration;
453 unsigned int num_idle_devs = 0;
454 unsigned int min_idle_timeout_ms;
455
456 clock_gettime(CLOCK_MONOTONIC_RAW, &now);
457 min_idle_expiration.tv_sec = 0;
458 min_idle_expiration.tv_nsec = 0;
459
460 DL_FOREACH(enabled_devs[CRAS_STREAM_OUTPUT], edev) {
461 if (edev->dev->idle_timeout.tv_sec == 0)
462 continue;
463 if (timespec_after(&now, &edev->dev->idle_timeout)) {
464 close_dev_without_idle_check(edev->dev);
465 continue;
466 }
467 num_idle_devs++;
468 if (min_idle_expiration.tv_sec == 0 ||
469 timespec_after(&min_idle_expiration,
470 &edev->dev->idle_timeout))
471 min_idle_expiration = edev->dev->idle_timeout;
472 }
473
474 idle_timer = NULL;
475 if (!num_idle_devs)
476 return;
477 if (timespec_after(&now, &min_idle_expiration)) {
478 min_idle_timeout_ms = 0;
479 } else {
480 struct timespec timeout;
481 subtract_timespecs(&min_idle_expiration, &now, &timeout);
482 min_idle_timeout_ms = timespec_to_ms(&timeout);
483 }
484 /* Wake up when it is time to close the next idle device. Sleep for a
485 * minimum of 10 milliseconds. */
486 idle_timer = cras_tm_create_timer(cras_system_state_get_tm(),
487 MAX(min_idle_timeout_ms, 10),
488 idle_dev_check, NULL);
489 }
490
491 /*
492 * Cancel pending init tries. Called at device initialization or when device
493 * is disabled.
494 */
cancel_pending_init_retries(unsigned int dev_idx)495 static void cancel_pending_init_retries(unsigned int dev_idx)
496 {
497 struct dev_init_retry *retry;
498
499 DL_FOREACH(init_retries, retry) {
500 if (retry->dev_idx != dev_idx)
501 continue;
502 cras_tm_cancel_timer(cras_system_state_get_tm(),
503 retry->init_timer);
504 DL_DELETE(init_retries, retry);
505 free(retry);
506 }
507 }
508
509 /* Open the device potentially filling the output with a pre buffer. */
init_device(struct cras_iodev * dev,struct cras_rstream * rstream)510 static int init_device(struct cras_iodev *dev,
511 struct cras_rstream *rstream)
512 {
513 int rc;
514
515 dev->idle_timeout.tv_sec = 0;
516
517 if (cras_iodev_is_open(dev))
518 return 0;
519 cancel_pending_init_retries(dev->info.idx);
520
521 rc = cras_iodev_open(dev, rstream->cb_threshold, &rstream->format);
522 if (rc)
523 return rc;
524
525 rc = audio_thread_add_open_dev(audio_thread, dev);
526 if (rc)
527 cras_iodev_close(dev);
528
529 possibly_enable_echo_reference(dev);
530
531 return rc;
532 }
533
suspend_devs()534 static void suspend_devs()
535 {
536 struct enabled_dev *edev;
537 struct cras_rstream *rstream;
538
539 DL_FOREACH(stream_list_get(stream_list), rstream) {
540 if (rstream->is_pinned) {
541 struct cras_iodev *dev;
542
543 if ((rstream->flags & HOTWORD_STREAM) == HOTWORD_STREAM)
544 continue;
545
546 dev = find_dev(rstream->pinned_dev_idx);
547 if (dev) {
548 audio_thread_disconnect_stream(audio_thread,
549 rstream, dev);
550 if (!cras_iodev_list_dev_is_enabled(dev))
551 close_dev(dev);
552 }
553 } else {
554 audio_thread_disconnect_stream(audio_thread, rstream,
555 NULL);
556 }
557 }
558 stream_list_suspended = 1;
559
560 DL_FOREACH(enabled_devs[CRAS_STREAM_OUTPUT], edev) {
561 close_dev(edev->dev);
562 }
563 DL_FOREACH(enabled_devs[CRAS_STREAM_INPUT], edev) {
564 close_dev(edev->dev);
565 }
566 }
567
568 static int stream_added_cb(struct cras_rstream *rstream);
569
resume_devs()570 static void resume_devs()
571 {
572 struct cras_rstream *rstream;
573
574 stream_list_suspended = 0;
575 DL_FOREACH(stream_list_get(stream_list), rstream) {
576 if ((rstream->flags & HOTWORD_STREAM) == HOTWORD_STREAM)
577 continue;
578 stream_added_cb(rstream);
579 }
580 }
581
582 /* Called when the system audio is suspended or resumed. */
sys_suspend_change(void * arg,int suspended)583 void sys_suspend_change(void *arg, int suspended)
584 {
585 if (suspended)
586 suspend_devs();
587 else
588 resume_devs();
589 }
590
591 /* Called when the system capture gain changes. Pass the current capture_gain
592 * setting to the default input if it is active. */
sys_cap_gain_change(void * context,int32_t gain)593 void sys_cap_gain_change(void *context, int32_t gain)
594 {
595 struct cras_iodev *dev;
596
597 DL_FOREACH(devs[CRAS_STREAM_INPUT].iodevs, dev) {
598 if (dev->set_capture_gain && cras_iodev_is_open(dev))
599 dev->set_capture_gain(dev);
600 }
601 }
602
603 /* Called when the system capture mute state changes. Pass the current capture
604 * mute setting to the default input if it is active. */
sys_cap_mute_change(void * context,int muted,int mute_locked)605 static void sys_cap_mute_change(void *context, int muted, int mute_locked)
606 {
607 struct cras_iodev *dev;
608
609 DL_FOREACH(devs[CRAS_STREAM_INPUT].iodevs, dev) {
610 if (dev->set_capture_mute && cras_iodev_is_open(dev))
611 dev->set_capture_mute(dev);
612 }
613 }
614
615 static int disable_device(struct enabled_dev *edev, bool force);
616 static int enable_device(struct cras_iodev *dev);
617
possibly_disable_fallback(enum CRAS_STREAM_DIRECTION dir)618 static void possibly_disable_fallback(enum CRAS_STREAM_DIRECTION dir)
619 {
620 struct enabled_dev *edev;
621
622 DL_FOREACH(enabled_devs[dir], edev) {
623 if (edev->dev == fallback_devs[dir])
624 disable_device(edev, false);
625 }
626 }
627
possibly_enable_fallback(enum CRAS_STREAM_DIRECTION dir)628 static void possibly_enable_fallback(enum CRAS_STREAM_DIRECTION dir)
629 {
630 if (fallback_devs[dir] == NULL)
631 return;
632 if (!cras_iodev_list_dev_is_enabled(fallback_devs[dir]))
633 enable_device(fallback_devs[dir]);
634 }
635
636 /*
637 * Adds stream to one or more open iodevs. If the stream has processing effect
638 * turned on, create new APM instance and add to the list. This makes sure the
639 * time consuming APM creation happens in main thread.
640 */
add_stream_to_open_devs(struct cras_rstream * stream,struct cras_iodev ** iodevs,unsigned int num_iodevs)641 static int add_stream_to_open_devs(struct cras_rstream *stream,
642 struct cras_iodev **iodevs,
643 unsigned int num_iodevs)
644 {
645 int i;
646 if (stream->apm_list) {
647 for (i = 0; i < num_iodevs; i++)
648 cras_apm_list_add(stream->apm_list,
649 iodevs[i],
650 iodevs[i]->ext_format);
651 }
652 return audio_thread_add_stream(audio_thread,
653 stream, iodevs, num_iodevs);
654 }
655
init_and_attach_streams(struct cras_iodev * dev)656 static int init_and_attach_streams(struct cras_iodev *dev)
657 {
658 int rc;
659 enum CRAS_STREAM_DIRECTION dir = dev->direction;
660 struct cras_rstream *stream;
661 int dev_enabled = cras_iodev_list_dev_is_enabled(dev);
662
663 /* If called after suspend, for example bluetooth
664 * profile switching, don't add back the stream list. */
665 if (stream_list_suspended)
666 return 0;
667
668 /* If there are active streams to attach to this device,
669 * open it. */
670 DL_FOREACH(stream_list_get(stream_list), stream) {
671 if (stream->direction != dir)
672 continue;
673 /*
674 * Don't attach this stream if (1) this stream pins to a
675 * different device, or (2) this is a normal stream, but
676 * device is not enabled.
677 */
678 if(stream->is_pinned) {
679 if (stream->pinned_dev_idx != dev->info.idx)
680 continue;
681 } else if (!dev_enabled) {
682 continue;
683 }
684
685 rc = init_device(dev, stream);
686 if (rc) {
687 syslog(LOG_ERR, "Enable %s failed, rc = %d",
688 dev->info.name, rc);
689 return rc;
690 }
691 add_stream_to_open_devs(stream, &dev, 1);
692 }
693 return 0;
694 }
695
init_device_cb(struct cras_timer * timer,void * arg)696 static void init_device_cb(struct cras_timer *timer, void *arg)
697 {
698 int rc;
699 struct dev_init_retry *retry = (struct dev_init_retry *)arg;
700 struct cras_iodev *dev = find_dev(retry->dev_idx);
701
702 /*
703 * First of all, remove retry record to avoid confusion to the
704 * actual device init work.
705 */
706 DL_DELETE(init_retries, retry);
707 free(retry);
708
709 if (cras_iodev_is_open(dev))
710 return;
711
712 rc = init_and_attach_streams(dev);
713 if (rc < 0)
714 syslog(LOG_ERR, "Init device retry failed");
715 else
716 possibly_disable_fallback(dev->direction);
717 }
718
schedule_init_device_retry(struct cras_iodev * dev)719 static int schedule_init_device_retry(struct cras_iodev *dev)
720 {
721 struct dev_init_retry *retry;
722 struct cras_tm *tm = cras_system_state_get_tm();
723
724 retry = (struct dev_init_retry *)calloc(1, sizeof(*retry));
725 if (!retry)
726 return -ENOMEM;
727
728 retry->dev_idx = dev->info.idx;
729 retry->init_timer = cras_tm_create_timer(
730 tm, INIT_DEV_DELAY_MS, init_device_cb, retry);
731 DL_APPEND(init_retries, retry);
732 return 0;
733 }
734
init_pinned_device(struct cras_iodev * dev,struct cras_rstream * rstream)735 static int init_pinned_device(struct cras_iodev *dev,
736 struct cras_rstream *rstream)
737 {
738 int rc;
739
740 if (audio_thread_is_dev_open(audio_thread, dev))
741 return 0;
742
743 /* Make sure the active node is configured properly, it could be
744 * disabled when last normal stream removed. */
745 dev->update_active_node(dev, dev->active_node->idx, 1);
746
747 /* Negative EAGAIN code indicates dev will be opened later. */
748 rc = init_device(dev, rstream);
749 if (rc && (rc != -EAGAIN))
750 return rc;
751 return 0;
752 }
753
close_pinned_device(struct cras_iodev * dev)754 static int close_pinned_device(struct cras_iodev *dev)
755 {
756 close_dev(dev);
757 dev->update_active_node(dev, dev->active_node->idx, 0);
758 return 0;
759 }
760
find_pinned_device(struct cras_rstream * rstream)761 static struct cras_iodev *find_pinned_device(struct cras_rstream *rstream)
762 {
763 struct cras_iodev *dev;
764 if (!rstream->is_pinned)
765 return NULL;
766
767 dev = find_dev(rstream->pinned_dev_idx);
768
769 if ((rstream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
770 return dev;
771
772 /* Double check node type for hotword stream */
773 if (dev && dev->active_node->type != CRAS_NODE_TYPE_HOTWORD) {
774 syslog(LOG_ERR, "Hotword stream pinned to invalid dev %u",
775 dev->info.idx);
776 return NULL;
777 }
778
779 return hotword_suspended ? empty_hotword_dev : dev;
780 }
781
pinned_stream_added(struct cras_rstream * rstream)782 static int pinned_stream_added(struct cras_rstream *rstream)
783 {
784 struct cras_iodev *dev;
785 int rc;
786
787 /* Check that the target device is valid for pinned streams. */
788 dev = find_pinned_device(rstream);
789 if (!dev)
790 return -EINVAL;
791
792 rc = init_pinned_device(dev, rstream);
793 if (rc) {
794 syslog(LOG_INFO, "init_pinned_device failed, rc %d", rc);
795 return schedule_init_device_retry(dev);
796 }
797
798 return add_stream_to_open_devs(rstream, &dev, 1);
799 }
800
stream_added_cb(struct cras_rstream * rstream)801 static int stream_added_cb(struct cras_rstream *rstream)
802 {
803 struct enabled_dev *edev;
804 struct cras_iodev *iodevs[10];
805 unsigned int num_iodevs;
806 int rc;
807
808 if (stream_list_suspended)
809 return 0;
810
811 if (rstream->is_pinned)
812 return pinned_stream_added(rstream);
813
814 /* Add the new stream to all enabled iodevs at once to avoid offset
815 * in shm level between different ouput iodevs. */
816 num_iodevs = 0;
817 DL_FOREACH(enabled_devs[rstream->direction], edev) {
818 if (num_iodevs >= ARRAY_SIZE(iodevs)) {
819 syslog(LOG_ERR, "too many enabled devices");
820 break;
821 }
822
823 rc = init_device(edev->dev, rstream);
824 if (rc) {
825 /* Error log but don't return error here, because
826 * stopping audio could block video playback.
827 */
828 syslog(LOG_ERR, "Init %s failed, rc = %d",
829 edev->dev->info.name, rc);
830 schedule_init_device_retry(edev->dev);
831 continue;
832 }
833
834 iodevs[num_iodevs++] = edev->dev;
835 }
836 if (num_iodevs) {
837 rc = add_stream_to_open_devs(rstream, iodevs, num_iodevs);
838 if (rc) {
839 syslog(LOG_ERR, "adding stream to thread fail");
840 return rc;
841 }
842 } else {
843 /* Enable fallback device if no other iodevs can be initialized
844 * successfully.
845 * For error codes like EAGAIN and ENOENT, a new iodev will be
846 * enabled soon so streams are going to route there. As for the
847 * rest of the error cases, silence will be played or recorded
848 * so client won't be blocked.
849 * The enabled fallback device will be disabled when
850 * cras_iodev_list_select_node() is called to re-select the
851 * active node.
852 */
853 possibly_enable_fallback(rstream->direction);
854 }
855 return 0;
856 }
857
possibly_close_enabled_devs(enum CRAS_STREAM_DIRECTION dir)858 static int possibly_close_enabled_devs(enum CRAS_STREAM_DIRECTION dir)
859 {
860 struct enabled_dev *edev;
861 const struct cras_rstream *s;
862
863 /* Check if there are still default streams attached. */
864 DL_FOREACH(stream_list_get(stream_list), s) {
865 if (s->direction == dir && !s->is_pinned)
866 return 0;
867 }
868
869 /* No more default streams, close any device that doesn't have a stream
870 * pinned to it. */
871 DL_FOREACH(enabled_devs[dir], edev) {
872 if (cras_iodev_has_pinned_stream(edev->dev))
873 continue;
874 if (dir == CRAS_STREAM_INPUT) {
875 close_dev(edev->dev);
876 continue;
877 }
878 /* Allow output devs to drain before closing. */
879 clock_gettime(CLOCK_MONOTONIC_RAW, &edev->dev->idle_timeout);
880 add_timespecs(&edev->dev->idle_timeout, &idle_timeout_interval);
881 idle_dev_check(NULL, NULL);
882 }
883
884 return 0;
885 }
886
pinned_stream_removed(struct cras_rstream * rstream)887 static void pinned_stream_removed(struct cras_rstream *rstream)
888 {
889 struct cras_iodev *dev;
890
891 dev = find_pinned_device(rstream);
892 if (!dev)
893 return;
894 if (!cras_iodev_list_dev_is_enabled(dev) &&
895 !cras_iodev_has_pinned_stream(dev))
896 close_pinned_device(dev);
897 }
898
899 /* Returns the number of milliseconds left to drain this stream. This is passed
900 * directly from the audio thread. */
stream_removed_cb(struct cras_rstream * rstream)901 static int stream_removed_cb(struct cras_rstream *rstream)
902 {
903 enum CRAS_STREAM_DIRECTION direction = rstream->direction;
904 int rc;
905
906 rc = audio_thread_drain_stream(audio_thread, rstream);
907 if (rc)
908 return rc;
909
910 if (rstream->is_pinned)
911 pinned_stream_removed(rstream);
912
913 possibly_close_enabled_devs(direction);
914
915 return 0;
916 }
917
enable_device(struct cras_iodev * dev)918 static int enable_device(struct cras_iodev *dev)
919 {
920 int rc;
921 struct enabled_dev *edev;
922 enum CRAS_STREAM_DIRECTION dir = dev->direction;
923 struct device_enabled_cb *callback;
924
925 DL_FOREACH(enabled_devs[dir], edev) {
926 if (edev->dev == dev)
927 return -EEXIST;
928 }
929
930 edev = calloc(1, sizeof(*edev));
931 edev->dev = dev;
932 DL_APPEND(enabled_devs[dir], edev);
933 dev->is_enabled = 1;
934
935 rc = init_and_attach_streams(dev);
936 if (rc < 0) {
937 syslog(LOG_INFO, "Enable device fail, rc %d", rc);
938 schedule_init_device_retry(dev);
939 return rc;
940 }
941
942 DL_FOREACH(device_enable_cbs, callback)
943 callback->enabled_cb(dev, callback->cb_data);
944
945 return 0;
946 }
947
948 /* Set `force to true to flush any pinned streams before closing the device. */
disable_device(struct enabled_dev * edev,bool force)949 static int disable_device(struct enabled_dev *edev, bool force)
950 {
951 struct cras_iodev *dev = edev->dev;
952 enum CRAS_STREAM_DIRECTION dir = dev->direction;
953 struct cras_rstream *stream;
954 struct device_enabled_cb *callback;
955
956 /*
957 * Remove from enabled dev list. However this dev could have a stream
958 * pinned to it, only cancel pending init timers when force flag is set.
959 */
960 DL_DELETE(enabled_devs[dir], edev);
961 free(edev);
962 dev->is_enabled = 0;
963 if (force)
964 cancel_pending_init_retries(dev->info.idx);
965
966 /*
967 * Pull all default streams off this device.
968 * Pull all pinned streams off as well if force is true.
969 */
970 DL_FOREACH(stream_list_get(stream_list), stream) {
971 if (stream->direction != dev->direction)
972 continue;
973 if (stream->is_pinned && !force)
974 continue;
975 audio_thread_disconnect_stream(audio_thread, stream, dev);
976 }
977 if (cras_iodev_has_pinned_stream(dev))
978 return 0;
979 DL_FOREACH(device_enable_cbs, callback)
980 callback->disabled_cb(dev, callback->cb_data);
981 close_dev(dev);
982 dev->update_active_node(dev, dev->active_node->idx, 0);
983
984 return 0;
985 }
986
987 /*
988 * Assume the device is not in enabled_devs list.
989 * Assume there is no default stream on the device.
990 * An example is that this device is unplugged while it is playing
991 * a pinned stream. The device and stream may have been removed in
992 * audio thread due to I/O error handling.
993 */
force_close_pinned_only_device(struct cras_iodev * dev)994 static int force_close_pinned_only_device(struct cras_iodev *dev)
995 {
996 struct cras_rstream *rstream;
997
998 /* Pull pinned streams off this device. */
999 DL_FOREACH(stream_list_get(stream_list), rstream) {
1000 if (rstream->direction != dev->direction)
1001 continue;
1002 if (!rstream->is_pinned)
1003 continue;
1004 if (dev->info.idx != rstream->pinned_dev_idx)
1005 continue;
1006 audio_thread_disconnect_stream(audio_thread, rstream, dev);
1007 }
1008 if (cras_iodev_has_pinned_stream(dev))
1009 return -EEXIST;
1010 close_dev(dev);
1011 dev->update_active_node(dev, dev->active_node->idx, 0);
1012 return 0;
1013 }
1014
1015 /*
1016 * Exported Interface.
1017 */
1018
cras_iodev_list_init()1019 void cras_iodev_list_init()
1020 {
1021 struct cras_observer_ops observer_ops;
1022
1023 memset(&observer_ops, 0, sizeof(observer_ops));
1024 observer_ops.output_volume_changed = sys_vol_change;
1025 observer_ops.output_mute_changed = sys_mute_change;
1026 observer_ops.capture_gain_changed = sys_cap_gain_change;
1027 observer_ops.capture_mute_changed = sys_cap_mute_change;
1028 observer_ops.suspend_changed = sys_suspend_change;
1029 list_observer = cras_observer_add(&observer_ops, NULL);
1030 idle_timer = NULL;
1031
1032 /* Create the audio stream list for the system. */
1033 stream_list = stream_list_create(stream_added_cb, stream_removed_cb,
1034 cras_rstream_create,
1035 cras_rstream_destroy,
1036 cras_system_state_get_tm());
1037
1038 /* Add an empty device so there is always something to play to or
1039 * capture from. */
1040 fallback_devs[CRAS_STREAM_OUTPUT] = empty_iodev_create(
1041 CRAS_STREAM_OUTPUT,
1042 CRAS_NODE_TYPE_UNKNOWN);
1043 fallback_devs[CRAS_STREAM_INPUT] = empty_iodev_create(
1044 CRAS_STREAM_INPUT,
1045 CRAS_NODE_TYPE_UNKNOWN);
1046 enable_device(fallback_devs[CRAS_STREAM_OUTPUT]);
1047 enable_device(fallback_devs[CRAS_STREAM_INPUT]);
1048
1049 empty_hotword_dev = empty_iodev_create(
1050 CRAS_STREAM_INPUT,
1051 CRAS_NODE_TYPE_HOTWORD);
1052
1053 /* Create loopback devices. */
1054 loopdev_post_mix = loopback_iodev_create(LOOPBACK_POST_MIX_PRE_DSP);
1055 loopdev_post_dsp = loopback_iodev_create(LOOPBACK_POST_DSP);
1056
1057 audio_thread = audio_thread_create();
1058 if (!audio_thread) {
1059 syslog(LOG_ERR, "Fatal: audio thread init");
1060 exit(-ENOMEM);
1061 }
1062 audio_thread_start(audio_thread);
1063
1064 cras_iodev_list_update_device_list();
1065 }
1066
cras_iodev_list_deinit()1067 void cras_iodev_list_deinit()
1068 {
1069 audio_thread_destroy(audio_thread);
1070 loopback_iodev_destroy(loopdev_post_dsp);
1071 loopback_iodev_destroy(loopdev_post_mix);
1072 empty_iodev_destroy(empty_hotword_dev);
1073 empty_iodev_destroy(fallback_devs[CRAS_STREAM_INPUT]);
1074 empty_iodev_destroy(fallback_devs[CRAS_STREAM_OUTPUT]);
1075 stream_list_destroy(stream_list);
1076 if (list_observer) {
1077 cras_observer_remove(list_observer);
1078 list_observer = NULL;
1079 }
1080 }
1081
cras_iodev_list_dev_is_enabled(const struct cras_iodev * dev)1082 int cras_iodev_list_dev_is_enabled(const struct cras_iodev *dev)
1083 {
1084 struct enabled_dev *edev;
1085
1086 DL_FOREACH(enabled_devs[dev->direction], edev) {
1087 if (edev->dev == dev)
1088 return 1;
1089 }
1090
1091 return 0;
1092 }
1093
cras_iodev_list_enable_dev(struct cras_iodev * dev)1094 void cras_iodev_list_enable_dev(struct cras_iodev *dev)
1095 {
1096 possibly_disable_fallback(dev->direction);
1097 /* Enable ucm setting of active node. */
1098 dev->update_active_node(dev, dev->active_node->idx, 1);
1099 enable_device(dev);
1100 cras_iodev_list_notify_active_node_changed(dev->direction);
1101 }
1102
cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,cras_node_id_t node_id)1103 void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,
1104 cras_node_id_t node_id)
1105 {
1106 struct cras_iodev *new_dev;
1107 new_dev = find_dev(dev_index_of(node_id));
1108 if (!new_dev || new_dev->direction != dir)
1109 return;
1110
1111 /* If the new dev is already enabled but its active node needs to be
1112 * changed. Disable new dev first, update active node, and then
1113 * re-enable it again.
1114 */
1115 if (cras_iodev_list_dev_is_enabled(new_dev)) {
1116 if (node_index_of(node_id) == new_dev->active_node->idx)
1117 return;
1118 else
1119 cras_iodev_list_disable_dev(new_dev, true);
1120 }
1121
1122 new_dev->update_active_node(new_dev, node_index_of(node_id), 1);
1123 cras_iodev_list_enable_dev(new_dev);
1124 }
1125
1126 /*
1127 * Disables device which may or may not be in enabled_devs list.
1128 */
cras_iodev_list_disable_dev(struct cras_iodev * dev,bool force_close)1129 void cras_iodev_list_disable_dev(struct cras_iodev *dev, bool force_close)
1130 {
1131 struct enabled_dev *edev, *edev_to_disable = NULL;
1132
1133 int is_the_only_enabled_device = 1;
1134
1135 DL_FOREACH(enabled_devs[dev->direction], edev) {
1136 if (edev->dev == dev)
1137 edev_to_disable = edev;
1138 else
1139 is_the_only_enabled_device = 0;
1140 }
1141
1142 /*
1143 * Disables the device for these two cases:
1144 * 1. Disable a device in the enabled_devs list.
1145 * 2. Force close a device that is not in the enabled_devs list,
1146 * but it is running a pinned stream.
1147 */
1148 if (!edev_to_disable) {
1149 if (force_close)
1150 force_close_pinned_only_device(dev);
1151 return;
1152 }
1153
1154 /* If the device to be closed is the only enabled device, we should
1155 * enable the fallback device first then disable the target
1156 * device. */
1157 if (is_the_only_enabled_device && fallback_devs[dev->direction])
1158 enable_device(fallback_devs[dev->direction]);
1159
1160 disable_device(edev_to_disable, force_close);
1161
1162 cras_iodev_list_notify_active_node_changed(dev->direction);
1163 return;
1164 }
1165
cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,cras_node_id_t node_id)1166 void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,
1167 cras_node_id_t node_id)
1168 {
1169 struct cras_iodev *dev;
1170
1171 dev = find_dev(dev_index_of(node_id));
1172 if (!dev)
1173 return;
1174
1175 cras_iodev_list_disable_dev(dev, false);
1176 }
1177
cras_iodev_list_add_output(struct cras_iodev * output)1178 int cras_iodev_list_add_output(struct cras_iodev *output)
1179 {
1180 int rc;
1181
1182 if (output->direction != CRAS_STREAM_OUTPUT)
1183 return -EINVAL;
1184
1185 rc = add_dev_to_list(output);
1186 if (rc)
1187 return rc;
1188
1189 return 0;
1190 }
1191
cras_iodev_list_add_input(struct cras_iodev * input)1192 int cras_iodev_list_add_input(struct cras_iodev *input)
1193 {
1194 int rc;
1195
1196 if (input->direction != CRAS_STREAM_INPUT)
1197 return -EINVAL;
1198
1199 rc = add_dev_to_list(input);
1200 if (rc)
1201 return rc;
1202
1203 return 0;
1204 }
1205
cras_iodev_list_rm_output(struct cras_iodev * dev)1206 int cras_iodev_list_rm_output(struct cras_iodev *dev)
1207 {
1208 int res;
1209
1210 /* Retire the current active output device before removing it from
1211 * list, otherwise it could be busy and remain in the list.
1212 */
1213 cras_iodev_list_disable_dev(dev, true);
1214 res = rm_dev_from_list(dev);
1215 if (res == 0)
1216 cras_iodev_list_update_device_list();
1217 return res;
1218 }
1219
cras_iodev_list_rm_input(struct cras_iodev * dev)1220 int cras_iodev_list_rm_input(struct cras_iodev *dev)
1221 {
1222 int res;
1223
1224 /* Retire the current active input device before removing it from
1225 * list, otherwise it could be busy and remain in the list.
1226 */
1227 cras_iodev_list_disable_dev(dev, true);
1228 res = rm_dev_from_list(dev);
1229 if (res == 0)
1230 cras_iodev_list_update_device_list();
1231 return res;
1232 }
1233
cras_iodev_list_get_outputs(struct cras_iodev_info ** list_out)1234 int cras_iodev_list_get_outputs(struct cras_iodev_info **list_out)
1235 {
1236 return get_dev_list(&devs[CRAS_STREAM_OUTPUT], list_out);
1237 }
1238
cras_iodev_list_get_inputs(struct cras_iodev_info ** list_out)1239 int cras_iodev_list_get_inputs(struct cras_iodev_info **list_out)
1240 {
1241 return get_dev_list(&devs[CRAS_STREAM_INPUT], list_out);
1242 }
1243
cras_iodev_list_get_first_enabled_iodev(enum CRAS_STREAM_DIRECTION direction)1244 struct cras_iodev *cras_iodev_list_get_first_enabled_iodev(
1245 enum CRAS_STREAM_DIRECTION direction)
1246 {
1247 struct enabled_dev *edev = enabled_devs[direction];
1248
1249 return edev ? edev->dev : NULL;
1250 }
1251
cras_iodev_list_get_active_node_id(enum CRAS_STREAM_DIRECTION direction)1252 cras_node_id_t cras_iodev_list_get_active_node_id(
1253 enum CRAS_STREAM_DIRECTION direction)
1254 {
1255 struct enabled_dev *edev = enabled_devs[direction];
1256
1257 if (!edev || !edev->dev || !edev->dev->active_node)
1258 return 0;
1259
1260 return cras_make_node_id(edev->dev->info.idx,
1261 edev->dev->active_node->idx);
1262 }
1263
cras_iodev_list_update_device_list()1264 void cras_iodev_list_update_device_list()
1265 {
1266 struct cras_server_state *state;
1267
1268 state = cras_system_state_update_begin();
1269 if (!state)
1270 return;
1271
1272 state->num_output_devs = devs[CRAS_STREAM_OUTPUT].size;
1273 state->num_input_devs = devs[CRAS_STREAM_INPUT].size;
1274 fill_dev_list(&devs[CRAS_STREAM_OUTPUT], &state->output_devs[0],
1275 CRAS_MAX_IODEVS);
1276 fill_dev_list(&devs[CRAS_STREAM_INPUT], &state->input_devs[0],
1277 CRAS_MAX_IODEVS);
1278
1279 state->num_output_nodes = fill_node_list(&devs[CRAS_STREAM_OUTPUT],
1280 &state->output_nodes[0],
1281 CRAS_MAX_IONODES);
1282 state->num_input_nodes = fill_node_list(&devs[CRAS_STREAM_INPUT],
1283 &state->input_nodes[0],
1284 CRAS_MAX_IONODES);
1285
1286 cras_system_state_update_complete();
1287 }
1288
1289 /* Look up the first hotword stream and the device it pins to. */
find_hotword_stream_dev(struct cras_iodev ** dev,struct cras_rstream ** stream)1290 int find_hotword_stream_dev(struct cras_iodev **dev,
1291 struct cras_rstream **stream)
1292 {
1293 DL_FOREACH(stream_list_get(stream_list), *stream) {
1294 if (((*stream)->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
1295 continue;
1296
1297 *dev = find_dev((*stream)->pinned_dev_idx);
1298 if (*dev == NULL)
1299 return -ENOENT;
1300 break;
1301 }
1302 return 0;
1303 }
1304
1305 /* Suspend/resume hotword streams functions are used to provide seamless
1306 * experience to cras clients when there's hardware limitation about concurrent
1307 * DSP and normal recording. The empty hotword iodev is used to hold all
1308 * hotword streams during suspend, so client side will not know about the
1309 * transition, and can still remove or add streams. At resume, the real hotword
1310 * device will be initialized and opened again to re-arm the DSP.
1311 */
cras_iodev_list_suspend_hotword_streams()1312 int cras_iodev_list_suspend_hotword_streams()
1313 {
1314 struct cras_iodev *hotword_dev;
1315 struct cras_rstream *stream = NULL;
1316 int rc;
1317
1318 rc = find_hotword_stream_dev(&hotword_dev, &stream);
1319 if (rc)
1320 return rc;
1321
1322 if (stream == NULL) {
1323 hotword_suspended = 1;
1324 return 0;
1325 }
1326 /* Move all existing hotword streams to the empty hotword iodev. */
1327 init_pinned_device(empty_hotword_dev, stream);
1328 DL_FOREACH(stream_list_get(stream_list), stream) {
1329 if ((stream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
1330 continue;
1331 if (stream->pinned_dev_idx != hotword_dev->info.idx) {
1332 syslog(LOG_ERR,
1333 "Failed to suspend hotword stream on dev %u",
1334 stream->pinned_dev_idx);
1335 continue;
1336 }
1337
1338 audio_thread_disconnect_stream(audio_thread, stream, hotword_dev);
1339 audio_thread_add_stream(audio_thread, stream, &empty_hotword_dev, 1);
1340 }
1341 close_pinned_device(hotword_dev);
1342 hotword_suspended = 1;
1343 return 0;
1344 }
1345
cras_iodev_list_resume_hotword_stream()1346 int cras_iodev_list_resume_hotword_stream()
1347 {
1348 struct cras_iodev *hotword_dev;
1349 struct cras_rstream *stream = NULL;
1350 int rc;
1351
1352 rc = find_hotword_stream_dev(&hotword_dev, &stream);
1353 if (rc)
1354 return rc;
1355
1356 if (stream == NULL) {
1357 hotword_suspended = 0;
1358 return 0;
1359 }
1360 /* Move all existing hotword streams to the real hotword iodev. */
1361 init_pinned_device(hotword_dev, stream);
1362 DL_FOREACH(stream_list_get(stream_list), stream) {
1363 if ((stream->flags & HOTWORD_STREAM) != HOTWORD_STREAM)
1364 continue;
1365 if (stream->pinned_dev_idx != hotword_dev->info.idx) {
1366 syslog(LOG_ERR,
1367 "Fail to resume hotword stream on dev %u",
1368 stream->pinned_dev_idx);
1369 continue;
1370 }
1371
1372 audio_thread_disconnect_stream(audio_thread, stream, empty_hotword_dev);
1373 audio_thread_add_stream(audio_thread, stream, &hotword_dev, 1);
1374 }
1375 close_pinned_device(empty_hotword_dev);
1376 hotword_suspended = 0;
1377 return 0;
1378 }
1379
cras_iodev_list_get_hotword_models(cras_node_id_t node_id)1380 char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id)
1381 {
1382 struct cras_iodev *dev = NULL;
1383
1384 dev = find_dev(dev_index_of(node_id));
1385 if (!dev || !dev->get_hotword_models ||
1386 (dev->active_node->type != CRAS_NODE_TYPE_HOTWORD))
1387 return NULL;
1388
1389 return dev->get_hotword_models(dev);
1390 }
1391
cras_iodev_list_set_hotword_model(cras_node_id_t node_id,const char * model_name)1392 int cras_iodev_list_set_hotword_model(cras_node_id_t node_id,
1393 const char *model_name)
1394 {
1395 int ret;
1396 struct cras_iodev *dev =
1397 find_dev(dev_index_of(node_id));
1398 if (!dev || !dev->get_hotword_models ||
1399 (dev->active_node->type != CRAS_NODE_TYPE_HOTWORD))
1400 return -EINVAL;
1401
1402 ret = dev->set_hotword_model(dev, model_name);
1403 if (!ret)
1404 strncpy(dev->active_node->active_hotword_model, model_name,
1405 sizeof(dev->active_node->active_hotword_model) - 1);
1406 return ret;
1407 }
1408
cras_iodev_list_notify_nodes_changed()1409 void cras_iodev_list_notify_nodes_changed()
1410 {
1411 cras_observer_notify_nodes();
1412 }
1413
cras_iodev_list_notify_active_node_changed(enum CRAS_STREAM_DIRECTION direction)1414 void cras_iodev_list_notify_active_node_changed(
1415 enum CRAS_STREAM_DIRECTION direction)
1416 {
1417 cras_observer_notify_active_node(direction,
1418 cras_iodev_list_get_active_node_id(direction));
1419 }
1420
cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)1421 void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
1422 cras_node_id_t node_id)
1423 {
1424 struct cras_iodev *new_dev = NULL;
1425 struct enabled_dev *edev;
1426 int new_node_already_enabled = 0;
1427 int rc;
1428
1429 /* find the devices for the id. */
1430 new_dev = find_dev(dev_index_of(node_id));
1431
1432 /* Do nothing if the direction is mismatched. The new_dev == NULL case
1433 could happen if node_id is 0 (no selection), or the client tries
1434 to select a non-existing node (maybe it's unplugged just before
1435 the client selects it). We will just behave like there is no selected
1436 node. */
1437 if (new_dev && new_dev->direction != direction)
1438 return;
1439
1440 /* Determine whether the new device and node are already enabled - if
1441 * they are, the selection algorithm should avoid disabling the new
1442 * device. */
1443 DL_FOREACH(enabled_devs[direction], edev) {
1444 if (edev->dev == new_dev &&
1445 edev->dev->active_node->idx == node_index_of(node_id)) {
1446 new_node_already_enabled = 1;
1447 break;
1448 }
1449 }
1450
1451 /* Enable fallback device during the transition so client will not be
1452 * blocked in this duration, which is as long as 300 ms on some boards
1453 * before new device is opened.
1454 * Note that the fallback node is not needed if the new node is already
1455 * enabled - the new node will remain enabled. */
1456 if (!new_node_already_enabled)
1457 possibly_enable_fallback(direction);
1458
1459 /* Disable all devices except for fallback device, and the new device,
1460 * provided it is already enabled. */
1461 DL_FOREACH(enabled_devs[direction], edev) {
1462 if (edev->dev != fallback_devs[direction] &&
1463 !(new_node_already_enabled && edev->dev == new_dev)) {
1464 disable_device(edev, false);
1465 }
1466 }
1467
1468 if (new_dev && !new_node_already_enabled) {
1469 new_dev->update_active_node(new_dev, node_index_of(node_id), 1);
1470 rc = enable_device(new_dev);
1471 if (rc == 0) {
1472 /* Disable fallback device after new device is enabled.
1473 * Leave the fallback device enabled if new_dev failed
1474 * to open, or the new_dev == NULL case. */
1475 possibly_disable_fallback(direction);
1476 }
1477 }
1478
1479 cras_iodev_list_notify_active_node_changed(direction);
1480 }
1481
cras_iodev_list_set_node_attr(cras_node_id_t node_id,enum ionode_attr attr,int value)1482 int cras_iodev_list_set_node_attr(cras_node_id_t node_id,
1483 enum ionode_attr attr, int value)
1484 {
1485 struct cras_ionode *node;
1486 int rc;
1487
1488 node = find_node(node_id);
1489 if (!node)
1490 return -EINVAL;
1491
1492 rc = cras_iodev_set_node_attr(node, attr, value);
1493 return rc;
1494 }
1495
cras_iodev_list_notify_node_volume(struct cras_ionode * node)1496 void cras_iodev_list_notify_node_volume(struct cras_ionode *node)
1497 {
1498 cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
1499 cras_iodev_list_update_device_list();
1500 cras_observer_notify_output_node_volume(id, node->volume);
1501 }
1502
cras_iodev_list_notify_node_left_right_swapped(struct cras_ionode * node)1503 void cras_iodev_list_notify_node_left_right_swapped(struct cras_ionode *node)
1504 {
1505 cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
1506 cras_iodev_list_update_device_list();
1507 cras_observer_notify_node_left_right_swapped(id,
1508 node->left_right_swapped);
1509 }
1510
cras_iodev_list_notify_node_capture_gain(struct cras_ionode * node)1511 void cras_iodev_list_notify_node_capture_gain(struct cras_ionode *node)
1512 {
1513 cras_node_id_t id = cras_make_node_id(node->dev->info.idx, node->idx);
1514 cras_iodev_list_update_device_list();
1515 cras_observer_notify_input_node_gain(id, node->capture_gain);
1516 }
1517
cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type)1518 void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type)
1519 {
1520 if (type != TEST_IODEV_HOTWORD)
1521 return;
1522 test_iodev_create(CRAS_STREAM_INPUT, type);
1523 }
1524
cras_iodev_list_test_dev_command(unsigned int iodev_idx,enum CRAS_TEST_IODEV_CMD command,unsigned int data_len,const uint8_t * data)1525 void cras_iodev_list_test_dev_command(unsigned int iodev_idx,
1526 enum CRAS_TEST_IODEV_CMD command,
1527 unsigned int data_len,
1528 const uint8_t *data)
1529 {
1530 struct cras_iodev *dev = find_dev(iodev_idx);
1531
1532 if (!dev)
1533 return;
1534
1535 test_iodev_command(dev, command, data_len, data);
1536 }
1537
cras_iodev_list_get_audio_thread()1538 struct audio_thread *cras_iodev_list_get_audio_thread()
1539 {
1540 return audio_thread;
1541 }
1542
cras_iodev_list_get_stream_list()1543 struct stream_list *cras_iodev_list_get_stream_list()
1544 {
1545 return stream_list;
1546 }
1547
cras_iodev_list_set_device_enabled_callback(device_enabled_callback_t enabled_cb,device_disabled_callback_t disabled_cb,void * cb_data)1548 int cras_iodev_list_set_device_enabled_callback(
1549 device_enabled_callback_t enabled_cb,
1550 device_disabled_callback_t disabled_cb,
1551 void *cb_data)
1552 {
1553 struct device_enabled_cb *callback;
1554
1555 DL_FOREACH(device_enable_cbs, callback) {
1556 if (callback->cb_data != cb_data)
1557 continue;
1558
1559 DL_DELETE(device_enable_cbs, callback);
1560 free(callback);
1561 }
1562
1563 if (enabled_cb && disabled_cb) {
1564 callback = (struct device_enabled_cb *)
1565 calloc(1, sizeof(*callback));
1566 callback->enabled_cb = enabled_cb;
1567 callback->disabled_cb = disabled_cb;
1568 callback->cb_data = cb_data;
1569 DL_APPEND(device_enable_cbs, callback);
1570 }
1571
1572 return 0;
1573 }
1574
cras_iodev_list_reset()1575 void cras_iodev_list_reset()
1576 {
1577 struct enabled_dev *edev;
1578
1579 DL_FOREACH(enabled_devs[CRAS_STREAM_OUTPUT], edev) {
1580 DL_DELETE(enabled_devs[CRAS_STREAM_OUTPUT], edev);
1581 free(edev);
1582 }
1583 enabled_devs[CRAS_STREAM_OUTPUT] = NULL;
1584 DL_FOREACH(enabled_devs[CRAS_STREAM_INPUT], edev) {
1585 DL_DELETE(enabled_devs[CRAS_STREAM_INPUT], edev);
1586 free(edev);
1587 }
1588 enabled_devs[CRAS_STREAM_INPUT] = NULL;
1589 devs[CRAS_STREAM_OUTPUT].iodevs = NULL;
1590 devs[CRAS_STREAM_INPUT].iodevs = NULL;
1591 devs[CRAS_STREAM_OUTPUT].size = 0;
1592 devs[CRAS_STREAM_INPUT].size = 0;
1593 }
1594