• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * Messages sent between the server and clients.
8  */
9 #ifndef CRAS_MESSAGES_H_
10 #define CRAS_MESSAGES_H_
11 
12 #include <stdint.h>
13 
14 #include "cras_iodev_info.h"
15 #include "cras_types.h"
16 
17 /* Rev when message format changes. If new messages are added, or message ID
18  * values change. */
19 #define CRAS_PROTO_VER 1
20 #define CRAS_SERV_MAX_MSG_SIZE 256
21 #define CRAS_CLIENT_MAX_MSG_SIZE 256
22 #define CRAS_HOTWORD_NAME_MAX_SIZE 8
23 
24 /* Message IDs. */
25 enum CRAS_SERVER_MESSAGE_ID {
26 	/* Client -> Server*/
27 	CRAS_SERVER_CONNECT_STREAM,
28 	CRAS_SERVER_DISCONNECT_STREAM,
29 	CRAS_SERVER_SWITCH_STREAM_TYPE_IODEV, /* Unused */
30 	CRAS_SERVER_SET_SYSTEM_VOLUME,
31 	CRAS_SERVER_SET_SYSTEM_MUTE,
32 	CRAS_SERVER_SET_USER_MUTE,
33 	CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED,
34 	CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN,
35 	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE,
36 	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED,
37 	CRAS_SERVER_SET_NODE_ATTR,
38 	CRAS_SERVER_SELECT_NODE,
39 	CRAS_SERVER_RELOAD_DSP,
40 	CRAS_SERVER_DUMP_DSP_INFO,
41 	CRAS_SERVER_DUMP_AUDIO_THREAD,
42 	CRAS_SERVER_ADD_ACTIVE_NODE,
43 	CRAS_SERVER_RM_ACTIVE_NODE,
44 	CRAS_SERVER_ADD_TEST_DEV,
45 	CRAS_SERVER_TEST_DEV_COMMAND,
46 	CRAS_SERVER_SUSPEND,
47 	CRAS_SERVER_RESUME,
48 	CRAS_CONFIG_GLOBAL_REMIX,
49 	CRAS_SERVER_GET_HOTWORD_MODELS,
50 	CRAS_SERVER_SET_HOTWORD_MODEL,
51 	CRAS_SERVER_REGISTER_NOTIFICATION,
52 };
53 
54 enum CRAS_CLIENT_MESSAGE_ID {
55 	/* Server -> Client */
56 	CRAS_CLIENT_CONNECTED,
57 	CRAS_CLIENT_STREAM_CONNECTED,
58 	CRAS_CLIENT_AUDIO_DEBUG_INFO_READY,
59 	CRAS_CLIENT_GET_HOTWORD_MODELS_READY,
60 	/* System status messages */
61 	CRAS_CLIENT_OUTPUT_VOLUME_CHANGED,
62 	CRAS_CLIENT_OUTPUT_MUTE_CHANGED,
63 	CRAS_CLIENT_CAPTURE_GAIN_CHANGED,
64 	CRAS_CLIENT_CAPTURE_MUTE_CHANGED,
65 	CRAS_CLIENT_NODES_CHANGED,
66 	CRAS_CLIENT_ACTIVE_NODE_CHANGED,
67 	CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED,
68 	CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
69 	CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED,
70 	CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED,
71 };
72 
73 /* Messages that control the server. These are sent from the client to affect
74  * and action on the server. */
75 struct __attribute__ ((__packed__)) cras_server_message {
76 	uint32_t length;
77 	enum CRAS_SERVER_MESSAGE_ID id;
78 };
79 
80 /* Messages that control the client. These are sent from the server to affect
81  * and action on the client. */
82 struct __attribute__ ((__packed__)) cras_client_message {
83 	uint32_t length;
84 	enum CRAS_CLIENT_MESSAGE_ID id;
85 };
86 
87 /*
88  * Messages from client to server.
89  */
90 
91 /* Sent by a client to connect a stream to the server. */
92 struct __attribute__ ((__packed__)) cras_connect_message {
93 	struct cras_server_message header;
94 	uint32_t proto_version;
95 	enum CRAS_STREAM_DIRECTION direction; /* input/output/loopback */
96 	cras_stream_id_t stream_id; /* unique id for this stream */
97 	enum CRAS_STREAM_TYPE stream_type; /* media, or call, etc. */
98 	uint32_t buffer_frames; /* Buffer size in frames. */
99 	uint32_t cb_threshold; /* callback client when this much is left */
100 	uint32_t flags;
101 	struct cras_audio_format_packed format; /* rate, channel, sample size */
102 	uint32_t dev_idx; /* device to attach stream, 0 if none */
103 };
cras_fill_connect_message(struct cras_connect_message * m,enum CRAS_STREAM_DIRECTION direction,cras_stream_id_t stream_id,enum CRAS_STREAM_TYPE stream_type,size_t buffer_frames,size_t cb_threshold,uint32_t flags,struct cras_audio_format format,uint32_t dev_idx)104 static inline void cras_fill_connect_message(struct cras_connect_message *m,
105 					   enum CRAS_STREAM_DIRECTION direction,
106 					   cras_stream_id_t stream_id,
107 					   enum CRAS_STREAM_TYPE stream_type,
108 					   size_t buffer_frames,
109 					   size_t cb_threshold,
110 					   uint32_t flags,
111 					   struct cras_audio_format format,
112 					   uint32_t dev_idx)
113 {
114 	m->proto_version = CRAS_PROTO_VER;
115 	m->direction = direction;
116 	m->stream_id = stream_id;
117 	m->stream_type = stream_type;
118 	m->buffer_frames = buffer_frames;
119 	m->cb_threshold = cb_threshold;
120 	m->flags = flags;
121 	pack_cras_audio_format(&m->format, &format);
122 	m->dev_idx = dev_idx;
123 	m->header.id = CRAS_SERVER_CONNECT_STREAM;
124 	m->header.length = sizeof(struct cras_connect_message);
125 }
126 
127 /* Sent by a client to remove a stream from the server. */
128 struct __attribute__ ((__packed__)) cras_disconnect_stream_message {
129 	struct cras_server_message header;
130 	cras_stream_id_t stream_id;
131 };
cras_fill_disconnect_stream_message(struct cras_disconnect_stream_message * m,cras_stream_id_t stream_id)132 static inline void cras_fill_disconnect_stream_message(
133 		struct cras_disconnect_stream_message *m,
134 		cras_stream_id_t stream_id)
135 {
136 	m->stream_id = stream_id;
137 	m->header.id = CRAS_SERVER_DISCONNECT_STREAM;
138 	m->header.length = sizeof(struct cras_disconnect_stream_message);
139 }
140 
141 /* Move streams of "type" to the iodev at "iodev_idx". */
142 struct __attribute__ ((__packed__)) cras_switch_stream_type_iodev {
143 	struct cras_server_message header;
144 	enum CRAS_STREAM_TYPE stream_type;
145 	uint32_t iodev_idx;
146 };
147 
148 /* Set the system volume. */
149 struct __attribute__ ((__packed__)) cras_set_system_volume {
150 	struct cras_server_message header;
151 	uint32_t volume;
152 };
cras_fill_set_system_volume(struct cras_set_system_volume * m,size_t volume)153 static inline void cras_fill_set_system_volume(
154 		struct cras_set_system_volume *m,
155 		size_t volume)
156 {
157 	m->volume = volume;
158 	m->header.id = CRAS_SERVER_SET_SYSTEM_VOLUME;
159 	m->header.length = sizeof(*m);
160 }
161 
162 /* Sets the capture gain. */
163 struct __attribute__ ((__packed__)) cras_set_system_capture_gain {
164 	struct cras_server_message header;
165 	int32_t gain;
166 };
cras_fill_set_system_capture_gain(struct cras_set_system_capture_gain * m,long gain)167 static inline void cras_fill_set_system_capture_gain(
168 		struct cras_set_system_capture_gain *m,
169 		long gain)
170 {
171 	m->gain = gain;
172 	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN;
173 	m->header.length = sizeof(*m);
174 }
175 
176 /* Set the system mute state. */
177 struct __attribute__ ((__packed__)) cras_set_system_mute {
178 	struct cras_server_message header;
179 	int32_t mute; /* 0 = un-mute, 1 = mute. */
180 };
cras_fill_set_system_mute(struct cras_set_system_mute * m,int mute)181 static inline void cras_fill_set_system_mute(
182 		struct cras_set_system_mute *m,
183 		int mute)
184 {
185 	m->mute = mute;
186 	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE;
187 	m->header.length = sizeof(*m);
188 }
cras_fill_set_user_mute(struct cras_set_system_mute * m,int mute)189 static inline void cras_fill_set_user_mute(
190 		struct cras_set_system_mute *m,
191 		int mute)
192 {
193 	m->mute = mute;
194 	m->header.id = CRAS_SERVER_SET_USER_MUTE;
195 	m->header.length = sizeof(*m);
196 }
cras_fill_set_system_mute_locked(struct cras_set_system_mute * m,int locked)197 static inline void cras_fill_set_system_mute_locked(
198 		struct cras_set_system_mute *m,
199 		int locked)
200 {
201 	m->mute = locked;
202 	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED;
203 	m->header.length = sizeof(*m);
204 }
cras_fill_set_system_capture_mute(struct cras_set_system_mute * m,int mute)205 static inline void cras_fill_set_system_capture_mute(
206 		struct cras_set_system_mute *m,
207 		int mute)
208 {
209 	m->mute = mute;
210 	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE;
211 	m->header.length = sizeof(*m);
212 }
cras_fill_set_system_capture_mute_locked(struct cras_set_system_mute * m,int locked)213 static inline void cras_fill_set_system_capture_mute_locked(
214 		struct cras_set_system_mute *m,
215 		int locked)
216 {
217 	m->mute = locked;
218 	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED;
219 	m->header.length = sizeof(*m);
220 }
221 
222 /* Set an attribute of an ionode. */
223 struct __attribute__ ((__packed__)) cras_set_node_attr {
224 	struct cras_server_message header;
225 	cras_node_id_t node_id;
226 	enum ionode_attr attr;
227 	int32_t value;
228 };
cras_fill_set_node_attr(struct cras_set_node_attr * m,cras_node_id_t node_id,enum ionode_attr attr,int value)229 static inline void cras_fill_set_node_attr(
230 		struct cras_set_node_attr *m,
231 		cras_node_id_t node_id,
232 		enum ionode_attr attr,
233 		int value)
234 {
235 	m->header.id = CRAS_SERVER_SET_NODE_ATTR;
236 	m->node_id = node_id;
237 	m->attr = attr;
238 	m->value = value;
239 	m->header.length = sizeof(*m);
240 }
241 
242 /* Set an attribute of an ionode. */
243 struct __attribute__ ((__packed__)) cras_select_node {
244 	struct cras_server_message header;
245 	enum CRAS_STREAM_DIRECTION direction;
246 	cras_node_id_t node_id;
247 };
cras_fill_select_node(struct cras_select_node * m,enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)248 static inline void cras_fill_select_node(
249 		struct cras_select_node *m,
250 		enum CRAS_STREAM_DIRECTION direction,
251 		cras_node_id_t node_id)
252 {
253 	m->header.id = CRAS_SERVER_SELECT_NODE;
254 	m->direction = direction;
255 	m->node_id = node_id;
256 	m->header.length = sizeof(*m);
257 }
258 
259 /* Add an active ionode. */
260 struct __attribute__ ((__packed__)) cras_add_active_node {
261 	struct cras_server_message header;
262 	enum CRAS_STREAM_DIRECTION direction;
263 	cras_node_id_t node_id;
264 };
cras_fill_add_active_node(struct cras_add_active_node * m,enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)265 static inline void cras_fill_add_active_node(
266 		struct cras_add_active_node *m,
267 		enum CRAS_STREAM_DIRECTION direction,
268 		cras_node_id_t node_id)
269 {
270 	m->header.id = CRAS_SERVER_ADD_ACTIVE_NODE;
271 	m->direction = direction;
272 	m->node_id = node_id;
273 	m->header.length = sizeof(*m);
274 }
275 
276 /* Remove an active ionode. */
277 struct __attribute__ ((__packed__)) cras_rm_active_node {
278 	struct cras_server_message header;
279 	enum CRAS_STREAM_DIRECTION direction;
280 	cras_node_id_t node_id;
281 };
cras_fill_rm_active_node(struct cras_rm_active_node * m,enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)282 static inline void cras_fill_rm_active_node(
283 		struct cras_rm_active_node *m,
284 		enum CRAS_STREAM_DIRECTION direction,
285 		cras_node_id_t node_id)
286 {
287 	m->header.id = CRAS_SERVER_RM_ACTIVE_NODE;
288 	m->direction = direction;
289 	m->node_id = node_id;
290 	m->header.length = sizeof(*m);
291 }
292 
293 /* Reload the dsp configuration. */
294 struct __attribute__ ((__packed__)) cras_reload_dsp {
295 	struct cras_server_message header;
296 };
cras_fill_reload_dsp(struct cras_reload_dsp * m)297 static inline void cras_fill_reload_dsp(
298 		struct cras_reload_dsp *m)
299 {
300 	m->header.id = CRAS_SERVER_RELOAD_DSP;
301 	m->header.length = sizeof(*m);
302 }
303 
304 /* Dump current dsp information to syslog. */
305 struct __attribute__ ((__packed__)) cras_dump_dsp_info {
306 	struct cras_server_message header;
307 };
308 
cras_fill_dump_dsp_info(struct cras_dump_dsp_info * m)309 static inline void cras_fill_dump_dsp_info(
310 		struct cras_dump_dsp_info *m)
311 {
312 	m->header.id = CRAS_SERVER_DUMP_DSP_INFO;
313 	m->header.length = sizeof(*m);
314 }
315 
316 /* Dump current audio thread information to syslog. */
317 struct __attribute__ ((__packed__)) cras_dump_audio_thread {
318 	struct cras_server_message header;
319 };
320 
cras_fill_dump_audio_thread(struct cras_dump_audio_thread * m)321 static inline void cras_fill_dump_audio_thread(
322 		struct cras_dump_audio_thread *m)
323 {
324 	m->header.id = CRAS_SERVER_DUMP_AUDIO_THREAD;
325 	m->header.length = sizeof(*m);
326 }
327 
328 /* Add a test device. */
329 struct __attribute__ ((__packed__)) cras_add_test_dev {
330 	struct cras_server_message header;
331 	enum TEST_IODEV_TYPE type;
332 };
333 
cras_fill_add_test_dev(struct cras_add_test_dev * m,enum TEST_IODEV_TYPE type)334 static inline void cras_fill_add_test_dev(struct cras_add_test_dev *m,
335 					  enum TEST_IODEV_TYPE type)
336 {
337 	m->header.id = CRAS_SERVER_ADD_TEST_DEV;
338 	m->header.length = sizeof(*m);
339 	m->type = type;
340 }
341 
342 /* Command a test device. */
343 struct __attribute__ ((__packed__)) cras_test_dev_command {
344 	struct cras_server_message header;
345 	unsigned int command;
346 	unsigned int iodev_idx;
347 	unsigned int data_len;
348 	uint8_t data[];
349 };
350 
cras_fill_test_dev_command(struct cras_test_dev_command * m,unsigned int iodev_idx,enum CRAS_TEST_IODEV_CMD command,unsigned int data_len,const uint8_t * data)351 static inline void cras_fill_test_dev_command(struct cras_test_dev_command *m,
352 					      unsigned int iodev_idx,
353 					      enum CRAS_TEST_IODEV_CMD command,
354 					      unsigned int data_len,
355 					      const uint8_t *data)
356 {
357 	m->header.id = CRAS_SERVER_TEST_DEV_COMMAND;
358 	m->header.length = sizeof(*m) + data_len;
359 	m->iodev_idx = iodev_idx;
360 	m->command = command;
361 	m->data_len = data_len;
362 	memcpy(m->data, data, data_len);
363 }
364 
cras_fill_suspend_message(struct cras_server_message * m,int is_suspend)365 static inline void cras_fill_suspend_message(struct cras_server_message *m,
366 					     int is_suspend)
367 {
368 	m->id = is_suspend ? CRAS_SERVER_SUSPEND : CRAS_SERVER_RESUME;
369 	m->length = sizeof(*m);
370 }
371 
372 /* Configures the global remix converter. */
373 struct __attribute__ ((__packed__)) cras_config_global_remix {
374 	struct cras_server_message header;
375 	unsigned int num_channels;
376 	float coefficient[];
377 };
378 
cras_fill_config_global_remix_command(struct cras_config_global_remix * m,unsigned int num_channels,float * coeff,unsigned int count)379 static inline void cras_fill_config_global_remix_command(
380 		struct cras_config_global_remix *m,
381 		unsigned int num_channels,
382 		float *coeff,
383 		unsigned int count)
384 {
385 	m->header.id = CRAS_CONFIG_GLOBAL_REMIX;
386 	m->header.length = sizeof(*m) + count * sizeof(*coeff);
387 	m->num_channels = num_channels;
388 	memcpy(m->coefficient, coeff, count * sizeof(*coeff));
389 }
390 
391 /* Get supported hotword models. */
392 struct __attribute__ ((__packed__)) cras_get_hotword_models {
393 	struct cras_server_message header;
394 	cras_node_id_t node_id;
395 };
396 
cras_fill_get_hotword_models_message(struct cras_get_hotword_models * m,cras_node_id_t node_id)397 static inline void cras_fill_get_hotword_models_message(
398 		struct cras_get_hotword_models *m,
399 		cras_node_id_t node_id)
400 {
401 	m->header.id = CRAS_SERVER_GET_HOTWORD_MODELS;
402 	m->header.length = sizeof(*m);
403 	m->node_id = node_id;
404 }
405 
406 /* Set desired hotword model. */
407 struct __attribute__ ((__packed__)) cras_set_hotword_model {
408 	struct cras_server_message header;
409 	cras_node_id_t node_id;
410 	char model_name[CRAS_HOTWORD_NAME_MAX_SIZE];
411 };
412 
cras_fill_set_hotword_model_message(struct cras_set_hotword_model * m,cras_node_id_t node_id,const char * model_name)413 static inline void cras_fill_set_hotword_model_message(
414 		struct cras_set_hotword_model *m,
415 		cras_node_id_t node_id,
416 		const char *model_name)
417 {
418 	m->header.id = CRAS_SERVER_SET_HOTWORD_MODEL;
419 	m->header.length = sizeof(*m);
420 	m->node_id = node_id;
421 	memcpy(m->model_name, model_name, CRAS_HOTWORD_NAME_MAX_SIZE);
422 }
423 
424 struct __attribute__ ((__packed__)) cras_register_notification {
425 		struct cras_server_message header;
426 		uint32_t msg_id;
427 		int do_register;
428 };
cras_fill_register_notification_message(struct cras_register_notification * m,enum CRAS_CLIENT_MESSAGE_ID msg_id,int do_register)429 static inline void cras_fill_register_notification_message(
430 		struct cras_register_notification *m,
431 		enum CRAS_CLIENT_MESSAGE_ID msg_id,
432 		int do_register)
433 {
434 	m->header.id = CRAS_SERVER_REGISTER_NOTIFICATION;
435 	m->header.length = sizeof(*m);
436 	m->msg_id = msg_id;
437 	m->do_register = do_register;
438 }
439 
440 /*
441  * Messages sent from server to client.
442  */
443 
444 /* Reply from the server indicating that the client has connected. */
445 struct __attribute__ ((__packed__)) cras_client_connected {
446 	struct cras_client_message header;
447 	uint32_t client_id;
448 };
cras_fill_client_connected(struct cras_client_connected * m,size_t client_id)449 static inline void cras_fill_client_connected(
450 		struct cras_client_connected *m,
451 		size_t client_id)
452 {
453 	m->client_id = client_id;
454 	m->header.id = CRAS_CLIENT_CONNECTED;
455 	m->header.length = sizeof(struct cras_client_connected);
456 }
457 
458 /*
459  * Reply from server that a stream has been successfully added.
460  * Two file descriptors are added, input shm followed by out shm.
461  */
462 struct __attribute__ ((__packed__)) cras_client_stream_connected {
463 	struct cras_client_message header;
464 	int32_t err;
465 	cras_stream_id_t stream_id;
466 	struct cras_audio_format_packed format;
467 	uint32_t shm_max_size;
468 };
cras_fill_client_stream_connected(struct cras_client_stream_connected * m,int err,cras_stream_id_t stream_id,struct cras_audio_format * format,size_t shm_max_size)469 static inline void cras_fill_client_stream_connected(
470 		struct cras_client_stream_connected *m,
471 		int err,
472 		cras_stream_id_t stream_id,
473 		struct cras_audio_format *format,
474 		size_t shm_max_size)
475 {
476 	m->err = err;
477 	m->stream_id = stream_id;
478 	pack_cras_audio_format(&m->format, format);
479 	m->shm_max_size = shm_max_size;
480 	m->header.id = CRAS_CLIENT_STREAM_CONNECTED;
481 	m->header.length = sizeof(struct cras_client_stream_connected);
482 }
483 
484 /* Sent from server to client when audio debug information is requested. */
485 struct cras_client_audio_debug_info_ready {
486 	struct cras_client_message header;
487 };
cras_fill_client_audio_debug_info_ready(struct cras_client_audio_debug_info_ready * m)488 static inline void cras_fill_client_audio_debug_info_ready(
489 		struct cras_client_audio_debug_info_ready *m)
490 {
491 	m->header.id = CRAS_CLIENT_AUDIO_DEBUG_INFO_READY;
492 	m->header.length = sizeof(*m);
493 }
494 
495 /* Sent from server to client when hotword models info is ready. */
496 struct cras_client_get_hotword_models_ready {
497 	struct cras_client_message header;
498 	int32_t hotword_models_size;
499 	uint8_t hotword_models[0];
500 };
cras_fill_client_get_hotword_models_ready(struct cras_client_get_hotword_models_ready * m,const char * hotword_models,size_t hotword_models_size)501 static inline void cras_fill_client_get_hotword_models_ready(
502 		struct cras_client_get_hotword_models_ready *m,
503 		const char *hotword_models,
504 		size_t hotword_models_size)
505 {
506 	m->header.id = CRAS_CLIENT_GET_HOTWORD_MODELS_READY;
507 	m->header.length = sizeof(*m) + hotword_models_size;
508 	m->hotword_models_size = hotword_models_size;
509 	memcpy(m->hotword_models, hotword_models, hotword_models_size);
510 }
511 
512 /* System status messages sent from server to client when state changes. */
513 struct __attribute__ ((__packed__)) cras_client_volume_changed {
514 	struct cras_client_message header;
515 	int32_t volume;
516 };
cras_fill_client_output_volume_changed(struct cras_client_volume_changed * m,int32_t volume)517 static inline void cras_fill_client_output_volume_changed(
518 		struct cras_client_volume_changed *m, int32_t volume)
519 {
520 	m->header.id = CRAS_CLIENT_OUTPUT_VOLUME_CHANGED;
521 	m->header.length = sizeof(*m);
522 	m->volume = volume;
523 }
cras_fill_client_capture_gain_changed(struct cras_client_volume_changed * m,int32_t gain)524 static inline void cras_fill_client_capture_gain_changed(
525 		struct cras_client_volume_changed *m, int32_t gain)
526 {
527 	m->header.id = CRAS_CLIENT_CAPTURE_GAIN_CHANGED;
528 	m->header.length = sizeof(*m);
529 	m->volume = gain;
530 }
531 
532 struct __attribute__ ((__packed__)) cras_client_mute_changed {
533 	struct cras_client_message header;
534 	int32_t muted;
535 	int32_t user_muted;
536 	int32_t mute_locked;
537 };
cras_fill_client_output_mute_changed(struct cras_client_mute_changed * m,int32_t muted,int32_t user_muted,int32_t mute_locked)538 static inline void cras_fill_client_output_mute_changed(
539 		struct cras_client_mute_changed *m, int32_t muted,
540 		int32_t user_muted, int32_t mute_locked)
541 {
542 	m->header.id = CRAS_CLIENT_OUTPUT_MUTE_CHANGED;
543 	m->header.length = sizeof(*m);
544 	m->muted = muted;
545 	m->user_muted = user_muted;
546 	m->mute_locked = mute_locked;
547 }
cras_fill_client_capture_mute_changed(struct cras_client_mute_changed * m,int32_t muted,int32_t mute_locked)548 static inline void cras_fill_client_capture_mute_changed(
549 		struct cras_client_mute_changed *m, int32_t muted,
550 		int32_t mute_locked)
551 {
552 	m->header.id = CRAS_CLIENT_CAPTURE_MUTE_CHANGED;
553 	m->header.length = sizeof(*m);
554 	m->muted = muted;
555 	m->user_muted = 0;
556 	m->mute_locked = mute_locked;
557 }
558 
559 struct __attribute__ ((__packed__)) cras_client_nodes_changed {
560 	struct cras_client_message header;
561 };
cras_fill_client_nodes_changed(struct cras_client_nodes_changed * m)562 static inline void cras_fill_client_nodes_changed(
563 		struct cras_client_nodes_changed *m)
564 {
565 	m->header.id = CRAS_CLIENT_NODES_CHANGED;
566 	m->header.length = sizeof(*m);
567 }
568 
569 struct __attribute__ ((__packed__)) cras_client_active_node_changed {
570 	struct cras_client_message header;
571 	uint32_t direction;
572 	cras_node_id_t node_id;
573 };
cras_fill_client_active_node_changed(struct cras_client_active_node_changed * m,enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)574 static inline void cras_fill_client_active_node_changed (
575 		struct cras_client_active_node_changed *m,
576 		enum CRAS_STREAM_DIRECTION direction,
577 		cras_node_id_t node_id)
578 {
579 	m->header.id = CRAS_CLIENT_ACTIVE_NODE_CHANGED;
580 	m->header.length = sizeof(*m);
581 	m->direction = direction;
582 	m->node_id = node_id;
583 };
584 
585 struct __attribute__ ((__packed__)) cras_client_node_value_changed {
586 	struct cras_client_message header;
587 	cras_node_id_t node_id;
588 	int32_t value;
589 };
cras_fill_client_output_node_volume_changed(struct cras_client_node_value_changed * m,cras_node_id_t node_id,int32_t volume)590 static inline void cras_fill_client_output_node_volume_changed (
591 		struct cras_client_node_value_changed *m,
592 		cras_node_id_t node_id,
593 		int32_t volume)
594 {
595 	m->header.id = CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED;
596 	m->header.length = sizeof(*m);
597 	m->node_id = node_id;
598 	m->value = volume;
599 };
cras_fill_client_node_left_right_swapped_changed(struct cras_client_node_value_changed * m,cras_node_id_t node_id,int swapped)600 static inline void cras_fill_client_node_left_right_swapped_changed (
601 		struct cras_client_node_value_changed *m,
602 		cras_node_id_t node_id,
603 		int swapped)
604 {
605 	m->header.id = CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED;
606 	m->header.length = sizeof(*m);
607 	m->node_id = node_id;
608 	m->value = swapped;
609 };
cras_fill_client_input_node_gain_changed(struct cras_client_node_value_changed * m,cras_node_id_t node_id,int32_t gain)610 static inline void cras_fill_client_input_node_gain_changed (
611 		struct cras_client_node_value_changed *m,
612 		cras_node_id_t node_id,
613 		int32_t gain)
614 {
615 	m->header.id = CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED;
616 	m->header.length = sizeof(*m);
617 	m->node_id = node_id;
618 	m->value = gain;
619 };
620 
621 struct __attribute__ ((__packed__)) cras_client_num_active_streams_changed {
622 	struct cras_client_message header;
623 	uint32_t direction;
624 	uint32_t num_active_streams;
625 };
cras_fill_client_num_active_streams_changed(struct cras_client_num_active_streams_changed * m,enum CRAS_STREAM_DIRECTION direction,uint32_t num_active_streams)626 static inline void cras_fill_client_num_active_streams_changed (
627 		struct cras_client_num_active_streams_changed *m,
628 		enum CRAS_STREAM_DIRECTION direction,
629 		uint32_t num_active_streams)
630 {
631 	m->header.id = CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED;
632 	m->header.length = sizeof(*m);
633 	m->direction = direction;
634 	m->num_active_streams = num_active_streams;
635 };
636 
637 /*
638  * Messages specific to passing audio between client and server
639  */
640 enum CRAS_AUDIO_MESSAGE_ID {
641 	AUDIO_MESSAGE_REQUEST_DATA,
642 	AUDIO_MESSAGE_DATA_READY,
643 	NUM_AUDIO_MESSAGES
644 };
645 
646 struct __attribute__ ((__packed__)) audio_message {
647 	enum CRAS_AUDIO_MESSAGE_ID id;
648 	int32_t error;
649 	uint32_t frames; /* number of samples per channel */
650 };
651 
652 #endif /* CRAS_MESSAGES_H_ */
653