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 /*
7 * Types commonly used in the client and server are defined here.
8 */
9 #ifndef CRAS_TYPES_H_
10 #define CRAS_TYPES_H_
11
12 #include <stdbool.h>
13 #include <stdint.h>
14 #include <stdlib.h>
15
16 #include "cras_audio_format.h"
17 #include "cras_iodev_info.h"
18 #include "packet_status_logger.h"
19
20 /* Architecture independent timespec */
21 struct __attribute__((__packed__)) cras_timespec {
22 int64_t tv_sec;
23 int64_t tv_nsec;
24 };
25
26 /* Some special device index values. */
27 enum CRAS_SPECIAL_DEVICE {
28 NO_DEVICE,
29 SILENT_RECORD_DEVICE,
30 SILENT_PLAYBACK_DEVICE,
31 SILENT_HOTWORD_DEVICE,
32 MAX_SPECIAL_DEVICE_IDX
33 };
34
35 /*
36 * Types of test iodevs supported.
37 */
38 enum TEST_IODEV_TYPE {
39 TEST_IODEV_HOTWORD,
40 };
41
42 /* Commands for test iodevs. */
43 enum CRAS_TEST_IODEV_CMD {
44 TEST_IODEV_CMD_HOTWORD_TRIGGER,
45 };
46
47 /* CRAS client connection types. */
48 enum CRAS_CONNECTION_TYPE {
49 CRAS_CONTROL, // For legacy client.
50 CRAS_PLAYBACK, // For playback client.
51 CRAS_CAPTURE, // For capture client.
52 CRAS_VMS_LEGACY, // For legacy client in vms.
53 CRAS_VMS_UNIFIED, // For unified client in vms.
54 CRAS_PLUGIN_PLAYBACK, // For playback client in vms/plugin.
55 CRAS_PLUGIN_UNIFIED, // For unified client in vms/plugin.
56 CRAS_NUM_CONN_TYPE,
57 };
58
59 static inline bool
cras_validate_connection_type(enum CRAS_CONNECTION_TYPE conn_type)60 cras_validate_connection_type(enum CRAS_CONNECTION_TYPE conn_type)
61 {
62 return 0 <= conn_type && conn_type < CRAS_NUM_CONN_TYPE;
63 }
64
65 /* Directions of audio streams.
66 * Input, Output, or loopback.
67 *
68 * Note that we use enum CRAS_STREAM_DIRECTION to access the elements in
69 * num_active_streams in cras_server_state. For example,
70 * num_active_streams[CRAS_STREAM_OUTPUT] is the number of active
71 * streams with direction CRAS_STREAM_OUTPUT.
72 */
73 enum CRAS_STREAM_DIRECTION {
74 CRAS_STREAM_OUTPUT,
75 CRAS_STREAM_INPUT,
76 CRAS_STREAM_UNDEFINED,
77 CRAS_STREAM_POST_MIX_PRE_DSP,
78 CRAS_NUM_DIRECTIONS
79 };
80
81 /* Bitmask for supporting all CRAS_STREAM_DIRECTION. */
82 #define CRAS_STREAM_ALL_DIRECTION ((1 << CRAS_NUM_DIRECTIONS) - 1)
83
84 /* Converts CRAS_STREAM_DIRECTION to bitmask.
85 * Args:
86 * dir - An enum CRAS_STREAM_DIRECTION.
87 *
88 * Returns:
89 * bitmask for the given direction on success, negative on failure.
90 */
91 static inline int
cras_stream_direction_mask(const enum CRAS_STREAM_DIRECTION dir)92 cras_stream_direction_mask(const enum CRAS_STREAM_DIRECTION dir)
93 {
94 if (0 <= dir && dir < CRAS_NUM_DIRECTIONS)
95 return (1 << dir);
96 return -EINVAL;
97 }
98
99 /*
100 * Flags for stream types.
101 * BULK_AUDIO_OK - This stream is OK with receiving up to a full shm of samples
102 * in a single callback.
103 * USE_DEV_TIMING - Don't wake up based on stream timing. Only wake when the
104 * device is ready. Input streams only.
105 * HOTWORD_STREAM - This stream is used only to listen for hotwords such as "OK
106 * Google". Hardware will wake the device when this phrase is heard.
107 * TRIGGER_ONLY - This stream only wants to receive when the data is available
108 * and does not want to receive data. Used with HOTWORD_STREAM.
109 * SERVER_ONLY - This stream doesn't associate to a client. It's used mainly
110 * for audio data to flow from hardware through iodev's dsp pipeline.
111 */
112 enum CRAS_INPUT_STREAM_FLAG {
113 BULK_AUDIO_OK = 0x01,
114 USE_DEV_TIMING = 0x02,
115 HOTWORD_STREAM = BULK_AUDIO_OK | USE_DEV_TIMING,
116 TRIGGER_ONLY = 0x04,
117 SERVER_ONLY = 0x08,
118 };
119
120 /*
121 * Types of Loopback stream.
122 */
123 enum CRAS_LOOPBACK_TYPE {
124 LOOPBACK_POST_MIX_PRE_DSP,
125 LOOPBACK_POST_DSP,
126 LOOPBACK_NUM_TYPES,
127 };
128
cras_stream_uses_output_hw(enum CRAS_STREAM_DIRECTION dir)129 static inline int cras_stream_uses_output_hw(enum CRAS_STREAM_DIRECTION dir)
130 {
131 return dir == CRAS_STREAM_OUTPUT;
132 }
133
cras_stream_uses_input_hw(enum CRAS_STREAM_DIRECTION dir)134 static inline int cras_stream_uses_input_hw(enum CRAS_STREAM_DIRECTION dir)
135 {
136 return dir == CRAS_STREAM_INPUT;
137 }
138
cras_stream_has_input(enum CRAS_STREAM_DIRECTION dir)139 static inline int cras_stream_has_input(enum CRAS_STREAM_DIRECTION dir)
140 {
141 return dir != CRAS_STREAM_OUTPUT;
142 }
143
cras_stream_is_loopback(enum CRAS_STREAM_DIRECTION dir)144 static inline int cras_stream_is_loopback(enum CRAS_STREAM_DIRECTION dir)
145 {
146 return dir == CRAS_STREAM_POST_MIX_PRE_DSP;
147 }
148
149 /* Types of audio streams. */
150 enum CRAS_STREAM_TYPE {
151 CRAS_STREAM_TYPE_DEFAULT,
152 CRAS_STREAM_TYPE_MULTIMEDIA,
153 CRAS_STREAM_TYPE_VOICE_COMMUNICATION,
154 CRAS_STREAM_TYPE_SPEECH_RECOGNITION,
155 CRAS_STREAM_TYPE_PRO_AUDIO,
156 CRAS_STREAM_TYPE_ACCESSIBILITY,
157 CRAS_STREAM_NUM_TYPES,
158 };
159
160 /* Types of audio clients. */
161 enum CRAS_CLIENT_TYPE {
162 CRAS_CLIENT_TYPE_UNKNOWN, /* Unknown client */
163 CRAS_CLIENT_TYPE_LEGACY, /* A client with old craslib (CRAS_PROTO_VER = 3) */
164 CRAS_CLIENT_TYPE_TEST, /* cras_test_client */
165 CRAS_CLIENT_TYPE_PCM, /* A client using CRAS via pcm, like aplay */
166 CRAS_CLIENT_TYPE_CHROME, /* Chrome, UI */
167 CRAS_CLIENT_TYPE_ARC, /* ARC++ */
168 CRAS_CLIENT_TYPE_CROSVM, /* CROSVM */
169 CRAS_CLIENT_TYPE_SERVER_STREAM, /* Server stream */
170 CRAS_CLIENT_TYPE_LACROS, /* LaCrOS */
171 CRAS_CLIENT_TYPE_PLUGIN, /* PluginVM */
172 CRAS_CLIENT_TYPE_ARCVM, /* ARCVM */
173 CRAS_NUM_CLIENT_TYPE, /* numbers of CRAS_CLIENT_TYPE */
174 };
175
cras_validate_client_type(enum CRAS_CLIENT_TYPE client_type)176 static inline bool cras_validate_client_type(enum CRAS_CLIENT_TYPE client_type)
177 {
178 return 0 <= client_type && client_type < CRAS_NUM_CLIENT_TYPE;
179 }
180
181 #define ENUM_STR(x) \
182 case x: \
183 return #x;
184
185 static inline const char *
cras_stream_type_str(enum CRAS_STREAM_TYPE stream_type)186 cras_stream_type_str(enum CRAS_STREAM_TYPE stream_type)
187 {
188 // clang-format off
189 switch (stream_type) {
190 ENUM_STR(CRAS_STREAM_TYPE_DEFAULT)
191 ENUM_STR(CRAS_STREAM_TYPE_MULTIMEDIA)
192 ENUM_STR(CRAS_STREAM_TYPE_VOICE_COMMUNICATION)
193 ENUM_STR(CRAS_STREAM_TYPE_SPEECH_RECOGNITION)
194 ENUM_STR(CRAS_STREAM_TYPE_PRO_AUDIO)
195 ENUM_STR(CRAS_STREAM_TYPE_ACCESSIBILITY)
196 default:
197 return "INVALID_STREAM_TYPE";
198 }
199 // clang-format on
200 }
201
202 static inline const char *
cras_client_type_str(enum CRAS_CLIENT_TYPE client_type)203 cras_client_type_str(enum CRAS_CLIENT_TYPE client_type)
204 {
205 // clang-format off
206 switch (client_type) {
207 ENUM_STR(CRAS_CLIENT_TYPE_UNKNOWN)
208 ENUM_STR(CRAS_CLIENT_TYPE_LEGACY)
209 ENUM_STR(CRAS_CLIENT_TYPE_TEST)
210 ENUM_STR(CRAS_CLIENT_TYPE_PCM)
211 ENUM_STR(CRAS_CLIENT_TYPE_CHROME)
212 ENUM_STR(CRAS_CLIENT_TYPE_ARC)
213 ENUM_STR(CRAS_CLIENT_TYPE_CROSVM)
214 ENUM_STR(CRAS_CLIENT_TYPE_SERVER_STREAM)
215 ENUM_STR(CRAS_CLIENT_TYPE_LACROS)
216 ENUM_STR(CRAS_CLIENT_TYPE_PLUGIN)
217 ENUM_STR(CRAS_CLIENT_TYPE_ARCVM)
218 default:
219 return "INVALID_CLIENT_TYPE";
220 }
221 // clang-format on
222 }
223
224 /* Effects that can be enabled for a CRAS stream. */
225 enum CRAS_STREAM_EFFECT {
226 APM_ECHO_CANCELLATION = (1 << 0),
227 APM_NOISE_SUPRESSION = (1 << 1),
228 APM_GAIN_CONTROL = (1 << 2),
229 APM_VOICE_DETECTION = (1 << 3),
230 };
231
232 /* Information about a client attached to the server. */
233 struct __attribute__((__packed__)) cras_attached_client_info {
234 uint32_t id;
235 int32_t pid;
236 uint32_t uid;
237 uint32_t gid;
238 };
239
240 /* Each ionode has a unique id. The top 32 bits are the device index, lower 32
241 * are the node index. */
242 typedef uint64_t cras_node_id_t;
243
cras_make_node_id(uint32_t dev_index,uint32_t node_index)244 static inline cras_node_id_t cras_make_node_id(uint32_t dev_index,
245 uint32_t node_index)
246 {
247 cras_node_id_t id = dev_index;
248 return (id << 32) | node_index;
249 }
250
dev_index_of(cras_node_id_t id)251 static inline uint32_t dev_index_of(cras_node_id_t id)
252 {
253 return (uint32_t)(id >> 32);
254 }
255
node_index_of(cras_node_id_t id)256 static inline uint32_t node_index_of(cras_node_id_t id)
257 {
258 return (uint32_t)id;
259 }
260
261 #define CRAS_MAX_IODEVS 20
262 #define CRAS_MAX_IONODES 20
263 #define CRAS_MAX_ATTACHED_CLIENTS 20
264 #define CRAS_MAX_AUDIO_THREAD_SNAPSHOTS 10
265 #define CRAS_MAX_HOTWORD_MODEL_NAME_SIZE 12
266 #define MAX_DEBUG_DEVS 4
267 #define MAX_DEBUG_STREAMS 8
268 #define AUDIO_THREAD_EVENT_LOG_SIZE (1024 * 6)
269 #define CRAS_BT_EVENT_LOG_SIZE 1024
270 #define MAIN_THREAD_EVENT_LOG_SIZE 1024
271
272 /* There are 8 bits of space for events. */
273 enum AUDIO_THREAD_LOG_EVENTS {
274 AUDIO_THREAD_WAKE,
275 AUDIO_THREAD_SLEEP,
276 AUDIO_THREAD_READ_AUDIO,
277 AUDIO_THREAD_READ_AUDIO_TSTAMP,
278 AUDIO_THREAD_READ_AUDIO_DONE,
279 AUDIO_THREAD_READ_OVERRUN,
280 AUDIO_THREAD_FILL_AUDIO,
281 AUDIO_THREAD_FILL_AUDIO_TSTAMP,
282 AUDIO_THREAD_FILL_AUDIO_DONE,
283 AUDIO_THREAD_WRITE_STREAMS_WAIT,
284 AUDIO_THREAD_WRITE_STREAMS_WAIT_TO,
285 AUDIO_THREAD_WRITE_STREAMS_MIX,
286 AUDIO_THREAD_WRITE_STREAMS_MIXED,
287 AUDIO_THREAD_WRITE_STREAMS_STREAM,
288 AUDIO_THREAD_FETCH_STREAM,
289 AUDIO_THREAD_STREAM_ADDED,
290 AUDIO_THREAD_STREAM_REMOVED,
291 AUDIO_THREAD_A2DP_FLUSH,
292 AUDIO_THREAD_A2DP_THROTTLE_TIME,
293 AUDIO_THREAD_A2DP_WRITE,
294 AUDIO_THREAD_DEV_STREAM_MIX,
295 AUDIO_THREAD_CAPTURE_POST,
296 AUDIO_THREAD_CAPTURE_WRITE,
297 AUDIO_THREAD_CONV_COPY,
298 AUDIO_THREAD_STREAM_FETCH_PENDING,
299 AUDIO_THREAD_STREAM_RESCHEDULE,
300 AUDIO_THREAD_STREAM_SLEEP_TIME,
301 AUDIO_THREAD_STREAM_SLEEP_ADJUST,
302 AUDIO_THREAD_STREAM_SKIP_CB,
303 AUDIO_THREAD_DEV_SLEEP_TIME,
304 AUDIO_THREAD_SET_DEV_WAKE,
305 AUDIO_THREAD_DEV_ADDED,
306 AUDIO_THREAD_DEV_REMOVED,
307 AUDIO_THREAD_IODEV_CB,
308 AUDIO_THREAD_PB_MSG,
309 AUDIO_THREAD_ODEV_NO_STREAMS,
310 AUDIO_THREAD_ODEV_START,
311 AUDIO_THREAD_ODEV_LEAVE_NO_STREAMS,
312 AUDIO_THREAD_ODEV_DEFAULT_NO_STREAMS,
313 AUDIO_THREAD_FILL_ODEV_ZEROS,
314 AUDIO_THREAD_UNDERRUN,
315 AUDIO_THREAD_SEVERE_UNDERRUN,
316 AUDIO_THREAD_CAPTURE_DROP_TIME,
317 AUDIO_THREAD_DEV_DROP_FRAMES,
318 AUDIO_THREAD_LOOPBACK_PUT,
319 AUDIO_THREAD_LOOPBACK_GET,
320 AUDIO_THREAD_LOOPBACK_SAMPLE_HOOK,
321 AUDIO_THREAD_DEV_OVERRUN,
322 };
323
324 /* Important events in main thread.
325 * MAIN_THREAD_DEV_CLOSE - When an iodev closes at stream removal.
326 * MAIN_THREAD_DEV_DISABLE - When an iodev is removed from active dev list.
327 * MAIN_THREAD_DEV_INIT - When an iodev opens when stream attachs.
328 * MAIN_THREAD_DEV_REOPEN - When an iodev reopens for format change.
329 * MAIN_THREAD_ADD_ACTIVE_NODE - When an iodev is set as an additional
330 * active device.
331 * MAIN_THREAD_SELECT_NODE - When UI selects an iodev as active.
332 * MAIN_THREAD_NODE_PLUGGED - When a jack of iodev is plugged/unplugged.
333 * MAIN_THREAD_ADD_TO_DEV_LIST - When iodev is added to list.
334 * MAIN_THREAD_INPUT_NODE_GAIN - When input node gain changes.
335 * MAIN_THREAD_OUTPUT_NODE_VOLUME - When output node volume changes.
336 * MAIN_THREAD_SET_OUTPUT_USER_MUTE - When output mute state is set.
337 * MAIN_THREAD_RESUME_DEVS - When system resumes and notifies CRAS.
338 * MAIN_THREAD_SUSPEND_DEVS - When system suspends and notifies CRAS.
339 * MAIN_THREAD_STREAM_ADDED - When an audio stream is added.
340 * MAIN_THREAD_STREAM_REMOVED - When an audio stream is removed.
341 */
342 enum MAIN_THREAD_LOG_EVENTS {
343 /* iodev related */
344 MAIN_THREAD_DEV_CLOSE,
345 MAIN_THREAD_DEV_DISABLE,
346 MAIN_THREAD_DEV_INIT,
347 MAIN_THREAD_DEV_REOPEN,
348 MAIN_THREAD_ADD_ACTIVE_NODE,
349 MAIN_THREAD_SELECT_NODE,
350 MAIN_THREAD_NODE_PLUGGED,
351 MAIN_THREAD_ADD_TO_DEV_LIST,
352 MAIN_THREAD_INPUT_NODE_GAIN,
353 MAIN_THREAD_OUTPUT_NODE_VOLUME,
354 MAIN_THREAD_SET_OUTPUT_USER_MUTE,
355 MAIN_THREAD_RESUME_DEVS,
356 MAIN_THREAD_SUSPEND_DEVS,
357 /* stream related */
358 MAIN_THREAD_STREAM_ADDED,
359 MAIN_THREAD_STREAM_REMOVED,
360 };
361
362 /* There are 8 bits of space for events. */
363 enum CRAS_BT_LOG_EVENTS {
364 BT_ADAPTER_ADDED,
365 BT_ADAPTER_REMOVED,
366 BT_AUDIO_GATEWAY_INIT,
367 BT_AUDIO_GATEWAY_START,
368 BT_AVAILABLE_CODECS,
369 BT_A2DP_CONFIGURED,
370 BT_A2DP_START,
371 BT_A2DP_SUSPENDED,
372 BT_CODEC_SELECTION,
373 BT_DEV_CONNECTED,
374 BT_DEV_DISCONNECTED,
375 BT_DEV_CONN_WATCH_CB,
376 BT_DEV_SUSPEND_CB,
377 BT_HFP_NEW_CONNECTION,
378 BT_HFP_REQUEST_DISCONNECT,
379 BT_HFP_SUPPORTED_FEATURES,
380 BT_HFP_HF_INDICATOR,
381 BT_HFP_SET_SPEAKER_GAIN,
382 BT_HFP_UPDATE_SPEAKER_GAIN,
383 BT_HSP_NEW_CONNECTION,
384 BT_HSP_REQUEST_DISCONNECT,
385 BT_NEW_AUDIO_PROFILE_AFTER_CONNECT,
386 BT_RESET,
387 BT_SCO_CONNECT,
388 BT_TRANSPORT_ACQUIRE,
389 BT_TRANSPORT_RELEASE,
390 BT_TRANSPORT_SET_VOLUME,
391 BT_TRANSPORT_UPDATE_VOLUME,
392 };
393
394 struct __attribute__((__packed__)) audio_thread_event {
395 uint32_t tag_sec;
396 uint32_t nsec;
397 uint32_t data1;
398 uint32_t data2;
399 uint32_t data3;
400 };
401
402 /* Ring buffer of log events from the audio thread. */
403 struct __attribute__((__packed__)) audio_thread_event_log {
404 uint64_t write_pos;
405 uint64_t sync_write_pos;
406 uint32_t len;
407 struct audio_thread_event log[AUDIO_THREAD_EVENT_LOG_SIZE];
408 };
409
410 struct __attribute__((__packed__)) audio_dev_debug_info {
411 char dev_name[CRAS_NODE_NAME_BUFFER_SIZE];
412 uint32_t buffer_size;
413 uint32_t min_buffer_level;
414 uint32_t min_cb_level;
415 uint32_t max_cb_level;
416 uint32_t frame_rate;
417 uint32_t num_channels;
418 double est_rate_ratio;
419 uint8_t direction;
420 uint32_t num_underruns;
421 uint32_t num_severe_underruns;
422 uint32_t highest_hw_level;
423 uint32_t runtime_sec;
424 uint32_t runtime_nsec;
425 uint32_t longest_wake_sec;
426 uint32_t longest_wake_nsec;
427 double software_gain_scaler;
428 };
429
430 struct __attribute__((__packed__)) audio_stream_debug_info {
431 uint64_t stream_id;
432 uint32_t dev_idx;
433 uint32_t direction;
434 uint32_t stream_type;
435 uint32_t client_type;
436 uint32_t buffer_frames;
437 uint32_t cb_threshold;
438 uint64_t effects;
439 uint32_t flags;
440 uint32_t frame_rate;
441 uint32_t num_channels;
442 uint32_t longest_fetch_sec;
443 uint32_t longest_fetch_nsec;
444 uint32_t num_missed_cb;
445 uint32_t num_overruns;
446 uint32_t is_pinned;
447 uint32_t pinned_dev_idx;
448 uint32_t runtime_sec;
449 uint32_t runtime_nsec;
450 double stream_volume;
451 int8_t channel_layout[CRAS_CH_MAX];
452 };
453
454 /* Debug info shared from server to client. */
455 struct __attribute__((__packed__)) audio_debug_info {
456 uint32_t num_streams;
457 uint32_t num_devs;
458 struct audio_dev_debug_info devs[MAX_DEBUG_DEVS];
459 struct audio_stream_debug_info streams[MAX_DEBUG_STREAMS];
460 struct audio_thread_event_log log;
461 };
462
463 struct __attribute__((__packed__)) main_thread_event {
464 uint32_t tag_sec;
465 uint32_t nsec;
466 uint32_t data1;
467 uint32_t data2;
468 uint32_t data3;
469 };
470
471 struct __attribute__((__packed__)) main_thread_event_log {
472 uint32_t write_pos;
473 uint32_t len;
474 struct main_thread_event log[MAIN_THREAD_EVENT_LOG_SIZE];
475 };
476
477 struct __attribute__((__packed__)) main_thread_debug_info {
478 struct main_thread_event_log main_log;
479 };
480
481 struct __attribute__((__packed__)) cras_bt_event {
482 uint32_t tag_sec;
483 uint32_t nsec;
484 uint32_t data1;
485 uint32_t data2;
486 };
487
488 struct __attribute__((__packed__)) cras_bt_event_log {
489 uint32_t write_pos;
490 uint32_t len;
491 struct cras_bt_event log[CRAS_BT_EVENT_LOG_SIZE];
492 };
493
494 struct __attribute__((__packed__)) cras_bt_debug_info {
495 struct cras_bt_event_log bt_log;
496 struct packet_status_logger wbs_logger;
497 };
498
499 /*
500 * All event enums should be less then AUDIO_THREAD_EVENT_TYPE_COUNT,
501 * or they will be ignored by the handler.
502 */
503 enum CRAS_AUDIO_THREAD_EVENT_TYPE {
504 AUDIO_THREAD_EVENT_A2DP_OVERRUN,
505 AUDIO_THREAD_EVENT_A2DP_THROTTLE,
506 AUDIO_THREAD_EVENT_BUSYLOOP,
507 AUDIO_THREAD_EVENT_DEBUG,
508 AUDIO_THREAD_EVENT_SEVERE_UNDERRUN,
509 AUDIO_THREAD_EVENT_UNDERRUN,
510 AUDIO_THREAD_EVENT_DROP_SAMPLES,
511 AUDIO_THREAD_EVENT_DEV_OVERRUN,
512 AUDIO_THREAD_EVENT_TYPE_COUNT,
513 };
514
515 /*
516 * Structure of snapshot for audio thread.
517 */
518 struct __attribute__((__packed__)) cras_audio_thread_snapshot {
519 struct timespec timestamp;
520 enum CRAS_AUDIO_THREAD_EVENT_TYPE event_type;
521 struct audio_debug_info audio_debug_info;
522 };
523
524 /*
525 * Ring buffer for storing snapshots.
526 */
527 struct __attribute__((__packed__)) cras_audio_thread_snapshot_buffer {
528 struct cras_audio_thread_snapshot
529 snapshots[CRAS_MAX_AUDIO_THREAD_SNAPSHOTS];
530 int pos;
531 };
532
533 /* The server state that is shared with clients.
534 * state_version - Version of this structure.
535 * volume - index from 0-100.
536 * min_volume_dBFS - volume in dB * 100 when volume = 1.
537 * max_volume_dBFS - volume in dB * 100 when volume = max.
538 * mute - 0 = unmuted, 1 = muted by system (device switch, suspend, etc).
539 * user_mute - 0 = unmuted, 1 = muted by user.
540 * mute_locked - 0 = unlocked, 1 = locked.
541 * suspended - 1 = suspended, 0 = resumed.
542 * capture_gain - Capture gain in dBFS * 100.
543 * capture_mute - 0 = unmuted, 1 = muted.
544 * capture_mute_locked - 0 = unlocked, 1 = locked.
545 * num_streams_attached - Total number of streams since server started.
546 * num_output_devs - Number of available output devices.
547 * num_input_devs - Number of available input devices.
548 * output_devs - Output audio devices currently attached.
549 * input_devs - Input audio devices currently attached.
550 * num_output_nodes - Number of available output nodes.
551 * num_input_nodes - Number of available input nodes.
552 * output_nodes - Output nodes currently attached.
553 * input_nodes - Input nodes currently attached.
554 * num_attached_clients - Number of clients attached to server.
555 * client_info - List of first 20 attached clients.
556 * update_count - Incremented twice each time the struct is updated. Odd
557 * during updates.
558 * num_active_streams - An array containing numbers or active
559 * streams of different directions.
560 * last_active_stream_time - Time the last stream was removed. Can be used
561 * to determine how long audio has been idle.
562 * audio_debug_info - Debug data filled in when a client requests it. This
563 * isn't protected against concurrent updating, only one client should
564 * use it.
565 * default_output_buffer_size - Default output buffer size in frames.
566 * non_empty_status - Whether any non-empty audio is being
567 * played/captured.
568 * aec_supported - Flag to indicate if system aec is supported.
569 * aec_group_id - Group ID for the system aec to use for separating aec
570 * tunings.
571 * snapshot_buffer - ring buffer for storing audio thread snapshots.
572 * bt_debug_info - ring buffer for storing bluetooth event logs.
573 * bt_wbs_enabled - Whether or not bluetooth wideband speech is enabled.
574 * deprioritize_bt_wbs_mic - Whether Bluetooth wideband speech mic
575 * should be deprioritized for selecting as default audio input.
576 * main_thread_debug_info - ring buffer for storing main thread event logs.
577 * num_input_streams_with_permission - An array containing numbers of input
578 * streams with permission in each client type.
579 * noise_cancellation_enabled - Whether or not Noise Cancellation is enabled.
580 * hotword_pause_at_suspend - 1 = Pause hotword detection when the system
581 * suspends. Hotword detection is resumed after system resumes.
582 * 0 - Hotword detection is allowed to continue running after system
583 * suspends, so a detected hotword can wake up the device.
584 *
585 */
586 #define CRAS_SERVER_STATE_VERSION 2
587 struct __attribute__((packed, aligned(4))) cras_server_state {
588 uint32_t state_version;
589 uint32_t volume;
590 int32_t min_volume_dBFS;
591 int32_t max_volume_dBFS;
592 int32_t mute;
593 int32_t user_mute;
594 int32_t mute_locked;
595 int32_t suspended;
596 int32_t capture_gain;
597 int32_t capture_mute;
598 int32_t capture_mute_locked;
599 uint32_t num_streams_attached;
600 uint32_t num_output_devs;
601 uint32_t num_input_devs;
602 struct cras_iodev_info output_devs[CRAS_MAX_IODEVS];
603 struct cras_iodev_info input_devs[CRAS_MAX_IODEVS];
604 uint32_t num_output_nodes;
605 uint32_t num_input_nodes;
606 struct cras_ionode_info output_nodes[CRAS_MAX_IONODES];
607 struct cras_ionode_info input_nodes[CRAS_MAX_IONODES];
608 uint32_t num_attached_clients;
609 struct cras_attached_client_info client_info[CRAS_MAX_ATTACHED_CLIENTS];
610 uint32_t update_count;
611 uint32_t num_active_streams[CRAS_NUM_DIRECTIONS];
612 struct cras_timespec last_active_stream_time;
613 struct audio_debug_info audio_debug_info;
614 int32_t default_output_buffer_size;
615 int32_t non_empty_status;
616 int32_t aec_supported;
617 int32_t aec_group_id;
618 struct cras_audio_thread_snapshot_buffer snapshot_buffer;
619 struct cras_bt_debug_info bt_debug_info;
620 int32_t bt_wbs_enabled;
621 int32_t deprioritize_bt_wbs_mic;
622 struct main_thread_debug_info main_thread_debug_info;
623 uint32_t num_input_streams_with_permission[CRAS_NUM_CLIENT_TYPE];
624 int32_t noise_cancellation_enabled;
625 int32_t hotword_pause_at_suspend;
626 };
627
628 /* Actions for card add/remove/change. */
629 enum cras_notify_device_action {
630 /* Must match gavd action definitions. */
631 CRAS_DEVICE_ACTION_ADD = 0,
632 CRAS_DEVICE_ACTION_REMOVE = 1,
633 CRAS_DEVICE_ACTION_CHANGE = 2,
634 };
635
636 /* Information about an ALSA card to be added to the system.
637 * card_type - Either internal card or a USB sound card.
638 * card_index - Index ALSA uses to refer to the card. The X in "hw:X".
639 * priority - Base priority to give devices found on this card. Zero is the
640 * lowest priority. Non-primary devices on the card will be given a
641 * lowered priority.
642 * usb_vendor_id - vendor ID if the device is on the USB bus.
643 * usb_product_id - product ID if the device is on the USB bus.
644 * usb_serial_number - serial number if the device is on the USB bus.
645 * usb_desc_checksum - the checksum of the USB descriptors if the device
646 * is on the USB bus.
647 */
648 enum CRAS_ALSA_CARD_TYPE {
649 ALSA_CARD_TYPE_INTERNAL,
650 ALSA_CARD_TYPE_USB,
651 };
652 #define USB_SERIAL_NUMBER_BUFFER_SIZE 64
653 struct __attribute__((__packed__)) cras_alsa_card_info {
654 enum CRAS_ALSA_CARD_TYPE card_type;
655 uint32_t card_index;
656 uint32_t usb_vendor_id;
657 uint32_t usb_product_id;
658 char usb_serial_number[USB_SERIAL_NUMBER_BUFFER_SIZE];
659 uint32_t usb_desc_checksum;
660 };
661
662 /* Unique identifier for each active stream.
663 * The top 16 bits are the client number, lower 16 are the stream number.
664 */
665 typedef uint32_t cras_stream_id_t;
666 /* Generates a stream id for client stream. */
cras_get_stream_id(uint16_t client_id,uint16_t stream_id)667 static inline cras_stream_id_t cras_get_stream_id(uint16_t client_id,
668 uint16_t stream_id)
669 {
670 return (cras_stream_id_t)(((client_id & 0x0000ffff) << 16) |
671 (stream_id & 0x0000ffff));
672 }
673 /* Verify if the stream_id fits the given client_id */
cras_valid_stream_id(cras_stream_id_t stream_id,uint16_t client_id)674 static inline bool cras_valid_stream_id(cras_stream_id_t stream_id,
675 uint16_t client_id)
676 {
677 return ((stream_id >> 16) ^ client_id) == 0;
678 }
679
680 enum CRAS_NODE_TYPE {
681 /* These value can be used for output nodes. */
682 CRAS_NODE_TYPE_INTERNAL_SPEAKER,
683 CRAS_NODE_TYPE_HEADPHONE,
684 CRAS_NODE_TYPE_HDMI,
685 CRAS_NODE_TYPE_HAPTIC,
686 CRAS_NODE_TYPE_LINEOUT,
687 /* These value can be used for input nodes. */
688 CRAS_NODE_TYPE_MIC,
689 CRAS_NODE_TYPE_HOTWORD,
690 CRAS_NODE_TYPE_POST_MIX_PRE_DSP,
691 CRAS_NODE_TYPE_POST_DSP,
692 /* Type for the legacy BT narrow band mic .*/
693 CRAS_NODE_TYPE_BLUETOOTH_NB_MIC,
694 /* These value can be used for both output and input nodes. */
695 CRAS_NODE_TYPE_USB,
696 CRAS_NODE_TYPE_BLUETOOTH,
697 CRAS_NODE_TYPE_FALLBACK_NORMAL,
698 CRAS_NODE_TYPE_FALLBACK_ABNORMAL,
699 CRAS_NODE_TYPE_UNKNOWN,
700 CRAS_NODE_TYPE_ECHO_REFERENCE,
701 CRAS_NODE_TYPE_ALSA_LOOPBACK,
702 };
703
704 /* Position values to described where a node locates on the system.
705 * NODE_POSITION_EXTERNAL - The node works only when peripheral
706 * is plugged.
707 * NODE_POSITION_INTERNAL - The node lives on the system and doesn't
708 * have specific direction.
709 * NODE_POSITION_FRONT - The node locates on the side of system that
710 * faces user.
711 * NODE_POSITION_REAR - The node locates on the opposite side of
712 * the system that faces user.
713 * NODE_POSITION_KEYBOARD - The node locates under the keyboard.
714 */
715 enum CRAS_NODE_POSITION {
716 NODE_POSITION_EXTERNAL,
717 NODE_POSITION_INTERNAL,
718 NODE_POSITION_FRONT,
719 NODE_POSITION_REAR,
720 NODE_POSITION_KEYBOARD,
721 };
722
723 #endif /* CRAS_TYPES_H_ */
724