/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/*
 * Messages sent between the server and clients.
 */
#ifndef CRAS_MESSAGES_H_
#define CRAS_MESSAGES_H_

#include <stdint.h>

#include "cras_iodev_info.h"
#include "cras_types.h"

/* Rev when message format changes. If new messages are added, or message ID
 * values change. */
#define CRAS_PROTO_VER 7
#define CRAS_SERV_MAX_MSG_SIZE 256
#define CRAS_CLIENT_MAX_MSG_SIZE 256
#define CRAS_MAX_HOTWORD_MODELS 243
#define CRAS_MAX_REMIX_CHANNELS 8
#define CRAS_MAX_TEST_DATA_LEN 224
#define CRAS_AEC_DUMP_FILE_NAME_LEN 128

/* Message IDs. */
enum CRAS_SERVER_MESSAGE_ID {
	/* Client -> Server*/
	CRAS_SERVER_CONNECT_STREAM,
	CRAS_SERVER_DISCONNECT_STREAM,
	CRAS_SERVER_SWITCH_STREAM_TYPE_IODEV, /* Unused */
	CRAS_SERVER_SET_SYSTEM_VOLUME,
	CRAS_SERVER_SET_SYSTEM_MUTE,
	CRAS_SERVER_SET_USER_MUTE,
	CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED,
	CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN, /* Deprecated */
	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE,
	CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED,
	CRAS_SERVER_SET_NODE_ATTR,
	CRAS_SERVER_SELECT_NODE,
	CRAS_SERVER_RELOAD_DSP,
	CRAS_SERVER_DUMP_DSP_INFO,
	CRAS_SERVER_DUMP_AUDIO_THREAD,
	CRAS_SERVER_DUMP_SNAPSHOTS,
	CRAS_SERVER_ADD_ACTIVE_NODE,
	CRAS_SERVER_RM_ACTIVE_NODE,
	CRAS_SERVER_ADD_TEST_DEV,
	CRAS_SERVER_TEST_DEV_COMMAND,
	CRAS_SERVER_SUSPEND,
	CRAS_SERVER_RESUME,
	CRAS_CONFIG_GLOBAL_REMIX,
	CRAS_SERVER_GET_HOTWORD_MODELS,
	CRAS_SERVER_SET_HOTWORD_MODEL,
	CRAS_SERVER_REGISTER_NOTIFICATION,
	CRAS_SERVER_SET_AEC_DUMP,
	CRAS_SERVER_RELOAD_AEC_CONFIG,
	CRAS_SERVER_DUMP_BT,
	CRAS_SERVER_SET_BT_WBS_ENABLED,
	CRAS_SERVER_GET_ATLOG_FD,
	CRAS_SERVER_DUMP_MAIN,
};

enum CRAS_CLIENT_MESSAGE_ID {
	/* Server -> Client */
	CRAS_CLIENT_CONNECTED,
	CRAS_CLIENT_STREAM_CONNECTED,
	CRAS_CLIENT_AUDIO_DEBUG_INFO_READY,
	CRAS_CLIENT_GET_HOTWORD_MODELS_READY,
	/* System status messages */
	CRAS_CLIENT_OUTPUT_VOLUME_CHANGED,
	CRAS_CLIENT_OUTPUT_MUTE_CHANGED,
	CRAS_CLIENT_CAPTURE_GAIN_CHANGED,
	CRAS_CLIENT_CAPTURE_MUTE_CHANGED,
	CRAS_CLIENT_NODES_CHANGED,
	CRAS_CLIENT_ACTIVE_NODE_CHANGED,
	CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED,
	CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
	CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED,
	CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED,
	/* Server -> Client */
	CRAS_CLIENT_ATLOG_FD_READY,
};

/* Messages that control the server. These are sent from the client to affect
 * and action on the server. */
struct __attribute__((__packed__)) cras_server_message {
	uint32_t length;
	enum CRAS_SERVER_MESSAGE_ID id;
};

/* Messages that control the client. These are sent from the server to affect
 * and action on the client. */
struct __attribute__((__packed__)) cras_client_message {
	uint32_t length;
	enum CRAS_CLIENT_MESSAGE_ID id;
};

/*
 * Messages from client to server.
 */

/* Sent by a client to connect a stream to the server. */
struct __attribute__((__packed__)) cras_connect_message {
	struct cras_server_message header;
	uint32_t proto_version;
	enum CRAS_STREAM_DIRECTION direction; /* input/output/loopback */
	cras_stream_id_t stream_id; /* unique id for this stream */
	enum CRAS_STREAM_TYPE stream_type; /* media, or call, etc. */
	uint32_t buffer_frames; /* Buffer size in frames. */
	uint32_t cb_threshold; /* callback client when this much is left */
	uint32_t flags;
	struct cras_audio_format_packed format; /* rate, channel, sample size */
	uint32_t dev_idx; /* device to attach stream, 0 if none */
	uint64_t effects; /* Bit map of requested effects. */
	enum CRAS_CLIENT_TYPE client_type; /* chrome, or arc, etc. */
	uint64_t client_shm_size; /* Size of client-provided samples shm, if any */
	/* Initial values for shm samples buffer offsets. These will be 0 for
	 * streams that do not use client-provided shm */
	uint64_t buffer_offsets[2];
};

static inline void 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,
	enum CRAS_CLIENT_TYPE client_type, size_t buffer_frames,
	size_t cb_threshold, uint32_t flags, uint64_t effects,
	struct cras_audio_format format, uint32_t dev_idx)
{
	m->proto_version = CRAS_PROTO_VER;
	m->direction = direction;
	m->stream_id = stream_id;
	m->stream_type = stream_type;
	m->buffer_frames = buffer_frames;
	m->cb_threshold = cb_threshold;
	m->flags = flags;
	m->effects = effects;
	pack_cras_audio_format(&m->format, &format);
	m->dev_idx = dev_idx;
	m->client_type = client_type;
	m->client_shm_size = 0;
	m->buffer_offsets[0] = 0;
	m->buffer_offsets[1] = 0;
	m->header.id = CRAS_SERVER_CONNECT_STREAM;
	m->header.length = sizeof(struct cras_connect_message);
}

/* Sent by a client to remove a stream from the server. */
struct __attribute__((__packed__)) cras_disconnect_stream_message {
	struct cras_server_message header;
	cras_stream_id_t stream_id;
};
static inline void
cras_fill_disconnect_stream_message(struct cras_disconnect_stream_message *m,
				    cras_stream_id_t stream_id)
{
	m->stream_id = stream_id;
	m->header.id = CRAS_SERVER_DISCONNECT_STREAM;
	m->header.length = sizeof(struct cras_disconnect_stream_message);
}

/* Move streams of "type" to the iodev at "iodev_idx". */
struct __attribute__((__packed__)) cras_switch_stream_type_iodev {
	struct cras_server_message header;
	enum CRAS_STREAM_TYPE stream_type;
	uint32_t iodev_idx;
};

/* Set the system volume. */
struct __attribute__((__packed__)) cras_set_system_volume {
	struct cras_server_message header;
	uint32_t volume;
};
static inline void cras_fill_set_system_volume(struct cras_set_system_volume *m,
					       size_t volume)
{
	m->volume = volume;
	m->header.id = CRAS_SERVER_SET_SYSTEM_VOLUME;
	m->header.length = sizeof(*m);
}

/* Set the system mute state. */
struct __attribute__((__packed__)) cras_set_system_mute {
	struct cras_server_message header;
	int32_t mute; /* 0 = un-mute, 1 = mute. */
};
static inline void cras_fill_set_system_mute(struct cras_set_system_mute *m,
					     int mute)
{
	m->mute = mute;
	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE;
	m->header.length = sizeof(*m);
}
static inline void cras_fill_set_user_mute(struct cras_set_system_mute *m,
					   int mute)
{
	m->mute = mute;
	m->header.id = CRAS_SERVER_SET_USER_MUTE;
	m->header.length = sizeof(*m);
}
static inline void
cras_fill_set_system_mute_locked(struct cras_set_system_mute *m, int locked)
{
	m->mute = locked;
	m->header.id = CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED;
	m->header.length = sizeof(*m);
}
static inline void
cras_fill_set_system_capture_mute(struct cras_set_system_mute *m, int mute)
{
	m->mute = mute;
	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE;
	m->header.length = sizeof(*m);
}
static inline void
cras_fill_set_system_capture_mute_locked(struct cras_set_system_mute *m,
					 int locked)
{
	m->mute = locked;
	m->header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED;
	m->header.length = sizeof(*m);
}

/* Set an attribute of an ionode. */
struct __attribute__((__packed__)) cras_set_node_attr {
	struct cras_server_message header;
	cras_node_id_t node_id;
	enum ionode_attr attr;
	int32_t value;
};
static inline void cras_fill_set_node_attr(struct cras_set_node_attr *m,
					   cras_node_id_t node_id,
					   enum ionode_attr attr, int value)
{
	m->header.id = CRAS_SERVER_SET_NODE_ATTR;
	m->node_id = node_id;
	m->attr = attr;
	m->value = value;
	m->header.length = sizeof(*m);
}

/* Set an attribute of an ionode. */
struct __attribute__((__packed__)) cras_select_node {
	struct cras_server_message header;
	enum CRAS_STREAM_DIRECTION direction;
	cras_node_id_t node_id;
};
static inline void cras_fill_select_node(struct cras_select_node *m,
					 enum CRAS_STREAM_DIRECTION direction,
					 cras_node_id_t node_id)
{
	m->header.id = CRAS_SERVER_SELECT_NODE;
	m->direction = direction;
	m->node_id = node_id;
	m->header.length = sizeof(*m);
}

/* Add an active ionode. */
struct __attribute__((__packed__)) cras_add_active_node {
	struct cras_server_message header;
	enum CRAS_STREAM_DIRECTION direction;
	cras_node_id_t node_id;
};
static inline void
cras_fill_add_active_node(struct cras_add_active_node *m,
			  enum CRAS_STREAM_DIRECTION direction,
			  cras_node_id_t node_id)
{
	m->header.id = CRAS_SERVER_ADD_ACTIVE_NODE;
	m->direction = direction;
	m->node_id = node_id;
	m->header.length = sizeof(*m);
}

/* Remove an active ionode. */
struct __attribute__((__packed__)) cras_rm_active_node {
	struct cras_server_message header;
	enum CRAS_STREAM_DIRECTION direction;
	cras_node_id_t node_id;
};
static inline void
cras_fill_rm_active_node(struct cras_rm_active_node *m,
			 enum CRAS_STREAM_DIRECTION direction,
			 cras_node_id_t node_id)
{
	m->header.id = CRAS_SERVER_RM_ACTIVE_NODE;
	m->direction = direction;
	m->node_id = node_id;
	m->header.length = sizeof(*m);
}

/* Reload the dsp configuration. */
struct __attribute__((__packed__)) cras_reload_dsp {
	struct cras_server_message header;
};
static inline void cras_fill_reload_dsp(struct cras_reload_dsp *m)
{
	m->header.id = CRAS_SERVER_RELOAD_DSP;
	m->header.length = sizeof(*m);
}

/* Dump current dsp information to syslog. */
struct __attribute__((__packed__)) cras_dump_dsp_info {
	struct cras_server_message header;
};

static inline void cras_fill_dump_dsp_info(struct cras_dump_dsp_info *m)
{
	m->header.id = CRAS_SERVER_DUMP_DSP_INFO;
	m->header.length = sizeof(*m);
}

/* Dump current audio thread information to syslog. */
struct __attribute__((__packed__)) cras_dump_audio_thread {
	struct cras_server_message header;
};

static inline void cras_fill_dump_audio_thread(struct cras_dump_audio_thread *m)
{
	m->header.id = CRAS_SERVER_DUMP_AUDIO_THREAD;
	m->header.length = sizeof(*m);
}

struct __attribute__((__packed__)) cras_get_atlog_fd {
	struct cras_server_message header;
};

static inline void cras_fill_get_atlog_fd(struct cras_get_atlog_fd *m)
{
	m->header.id = CRAS_SERVER_GET_ATLOG_FD;
	m->header.length = sizeof(*m);
}

/* Dump events in CRAS main thread. */
struct __attribute__((__packed__)) cras_dump_main {
	struct cras_server_message header;
};

static inline void cras_fill_dump_main(struct cras_dump_main *m)
{
	m->header.id = CRAS_SERVER_DUMP_MAIN;
	m->header.length = sizeof(*m);
}

/* Dump bluetooth events and state changes. */
struct __attribute__((__packed__)) cras_dump_bt {
	struct cras_server_message header;
};

static inline void cras_fill_dump_bt(struct cras_dump_bt *m)
{
	m->header.id = CRAS_SERVER_DUMP_BT;
	m->header.length = sizeof(*m);
}

/* Dump current audio thread snapshots to shard memory with the client. */
struct __attribute__((__packed__)) cras_dump_snapshots {
	struct cras_server_message header;
};

static inline void cras_fill_dump_snapshots(struct cras_dump_snapshots *m)
{
	m->header.id = CRAS_SERVER_DUMP_SNAPSHOTS;
	m->header.length = sizeof(*m);
}

/* Add a test device. */
struct __attribute__((__packed__)) cras_add_test_dev {
	struct cras_server_message header;
	enum TEST_IODEV_TYPE type;
};

static inline void cras_fill_add_test_dev(struct cras_add_test_dev *m,
					  enum TEST_IODEV_TYPE type)
{
	m->header.id = CRAS_SERVER_ADD_TEST_DEV;
	m->header.length = sizeof(*m);
	m->type = type;
}

/* Command a test device. */
struct __attribute__((__packed__)) cras_test_dev_command {
	struct cras_server_message header;
	unsigned int command;
	unsigned int iodev_idx;
	unsigned int data_len;
	uint8_t data[CRAS_MAX_TEST_DATA_LEN];
};

static inline void 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)
{
	m->header.id = CRAS_SERVER_TEST_DEV_COMMAND;
	m->header.length = sizeof(*m) + data_len;
	m->iodev_idx = iodev_idx;
	m->command = command;
	m->data_len = data_len;
	memcpy(m->data, data, data_len);
}

static inline void cras_fill_suspend_message(struct cras_server_message *m,
					     int is_suspend)
{
	m->id = is_suspend ? CRAS_SERVER_SUSPEND : CRAS_SERVER_RESUME;
	m->length = sizeof(*m);
}

/*
 * Configures the global remix converter.
 * `num_channels` must be less than `CRAS_MAX_REMIX_CHANNELS`.
 */
struct __attribute__((__packed__)) cras_config_global_remix {
	struct cras_server_message header;
	unsigned int num_channels;
	float coefficient[CRAS_MAX_REMIX_CHANNELS * CRAS_MAX_REMIX_CHANNELS];
};

static inline void
cras_fill_config_global_remix_command(struct cras_config_global_remix *m,
				      unsigned int num_channels, float *coeff,
				      unsigned int count)
{
	m->header.id = CRAS_CONFIG_GLOBAL_REMIX;
	m->header.length = sizeof(*m) + count * sizeof(*coeff);
	m->num_channels = num_channels;
	memcpy(m->coefficient, coeff, count * sizeof(*coeff));
}

/* Get supported hotword models. */
struct __attribute__((__packed__)) cras_get_hotword_models {
	struct cras_server_message header;
	cras_node_id_t node_id;
};

static inline void
cras_fill_get_hotword_models_message(struct cras_get_hotword_models *m,
				     cras_node_id_t node_id)
{
	m->header.id = CRAS_SERVER_GET_HOTWORD_MODELS;
	m->header.length = sizeof(*m);
	m->node_id = node_id;
}

/* Set desired hotword model. */
struct __attribute__((__packed__)) cras_set_hotword_model {
	struct cras_server_message header;
	cras_node_id_t node_id;
	char model_name[CRAS_MAX_HOTWORD_MODEL_NAME_SIZE];
};

static inline void
cras_fill_set_hotword_model_message(struct cras_set_hotword_model *m,
				    cras_node_id_t node_id,
				    const char *model_name)
{
	m->header.id = CRAS_SERVER_SET_HOTWORD_MODEL;
	m->header.length = sizeof(*m);
	m->node_id = node_id;
	memcpy(m->model_name, model_name, CRAS_MAX_HOTWORD_MODEL_NAME_SIZE);
}

/* Set aec dump to start or stop. */
struct __attribute__((__packed__)) cras_set_aec_dump {
	struct cras_server_message header;
	cras_stream_id_t stream_id;
	unsigned int start;
};

static inline void cras_fill_set_aec_dump_message(struct cras_set_aec_dump *m,
						  cras_stream_id_t stream_id,
						  unsigned int start)
{
	m->header.id = CRAS_SERVER_SET_AEC_DUMP;
	m->header.length = sizeof(*m);
	m->stream_id = stream_id;
	m->start = start;
}

/* Reload the aec configuration. */
struct __attribute__((__packed__)) cras_reload_aec_config {
	struct cras_server_message header;
};
static inline void cras_fill_reload_aec_config(struct cras_reload_aec_config *m)
{
	m->header.id = CRAS_SERVER_RELOAD_AEC_CONFIG;
	m->header.length = sizeof(*m);
}

/* Sets the flag to enable or disable bluetooth wideband speech feature. */
struct __attribute__((__packed__)) cras_set_bt_wbs_enabled {
	struct cras_server_message header;
	unsigned int enabled;
};
static inline void
cras_fill_set_bt_wbs_enabled(struct cras_set_bt_wbs_enabled *m,
			     unsigned int enabled)
{
	m->header.id = CRAS_SERVER_SET_BT_WBS_ENABLED;
	m->header.length = sizeof(*m);
	m->enabled = enabled;
}

struct __attribute__((__packed__)) cras_register_notification {
	struct cras_server_message header;
	uint32_t msg_id;
	int do_register;
};
static inline void
cras_fill_register_notification_message(struct cras_register_notification *m,
					enum CRAS_CLIENT_MESSAGE_ID msg_id,
					int do_register)
{
	m->header.id = CRAS_SERVER_REGISTER_NOTIFICATION;
	m->header.length = sizeof(*m);
	m->msg_id = msg_id;
	m->do_register = do_register;
}

/*
 * Messages sent from server to client.
 */

/* Reply from the server indicating that the client has connected. */
struct __attribute__((__packed__)) cras_client_connected {
	struct cras_client_message header;
	uint32_t client_id;
};
static inline void cras_fill_client_connected(struct cras_client_connected *m,
					      size_t client_id)
{
	m->client_id = client_id;
	m->header.id = CRAS_CLIENT_CONNECTED;
	m->header.length = sizeof(struct cras_client_connected);
}

/*
 * Reply from server that a stream has been successfully added.
 * Two file descriptors are added, input shm followed by out shm.
 *
 * |samples_shm_size| is valid for normal streams, not client-provided
 * shm streams.
 */
struct __attribute__((__packed__)) cras_client_stream_connected {
	struct cras_client_message header;
	int32_t err;
	cras_stream_id_t stream_id;
	struct cras_audio_format_packed format;
	uint32_t samples_shm_size;
	uint64_t effects;
};

static inline void
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 samples_shm_size, uint64_t effects)
{
	m->err = err;
	m->stream_id = stream_id;
	pack_cras_audio_format(&m->format, format);
	if (samples_shm_size > UINT32_MAX) {
		samples_shm_size = UINT32_MAX;
	}
	m->samples_shm_size = samples_shm_size;
	m->effects = effects;
	m->header.id = CRAS_CLIENT_STREAM_CONNECTED;
	m->header.length = sizeof(struct cras_client_stream_connected);
}

/* Sent from server to client when audio debug information is requested. */
struct __attribute__((__packed__)) cras_client_audio_debug_info_ready {
	struct cras_client_message header;
};
static inline void cras_fill_client_audio_debug_info_ready(
	struct cras_client_audio_debug_info_ready *m)
{
	m->header.id = CRAS_CLIENT_AUDIO_DEBUG_INFO_READY;
	m->header.length = sizeof(*m);
}

struct __attribute__((__packed__)) cras_client_atlog_fd_ready {
	struct cras_client_message header;
};

static inline void
cras_fill_client_atlog_fd_ready(struct cras_client_atlog_fd_ready *m)
{
	m->header.id = CRAS_CLIENT_ATLOG_FD_READY;
	m->header.length = sizeof(*m);
}

/* Sent from server to client when hotword models info is ready. */
struct __attribute__((__packed__)) cras_client_get_hotword_models_ready {
	struct cras_client_message header;
	int32_t hotword_models_size;
	uint8_t hotword_models[CRAS_MAX_HOTWORD_MODELS + 1];
};
static inline void cras_fill_client_get_hotword_models_ready(
	struct cras_client_get_hotword_models_ready *m,
	const char *hotword_models, size_t hotword_models_size)
{
	m->header.id = CRAS_CLIENT_GET_HOTWORD_MODELS_READY;
	m->header.length = sizeof(*m);
	m->hotword_models_size = hotword_models_size;
	/* Copy string data with terminator. */
	if (hotword_models) {
		strncpy((char *)m->hotword_models, hotword_models,
			CRAS_MAX_HOTWORD_MODELS);
		m->hotword_models[CRAS_MAX_HOTWORD_MODELS] = '\0';
	}
}

/* System status messages sent from server to client when state changes. */
struct __attribute__((__packed__)) cras_client_volume_changed {
	struct cras_client_message header;
	int32_t volume;
};
static inline void
cras_fill_client_output_volume_changed(struct cras_client_volume_changed *m,
				       int32_t volume)
{
	m->header.id = CRAS_CLIENT_OUTPUT_VOLUME_CHANGED;
	m->header.length = sizeof(*m);
	m->volume = volume;
}
static inline void
cras_fill_client_capture_gain_changed(struct cras_client_volume_changed *m,
				      int32_t gain)
{
	m->header.id = CRAS_CLIENT_CAPTURE_GAIN_CHANGED;
	m->header.length = sizeof(*m);
	m->volume = gain;
}

struct __attribute__((__packed__)) cras_client_mute_changed {
	struct cras_client_message header;
	int32_t muted;
	int32_t user_muted;
	int32_t mute_locked;
};
static inline void
cras_fill_client_output_mute_changed(struct cras_client_mute_changed *m,
				     int32_t muted, int32_t user_muted,
				     int32_t mute_locked)
{
	m->header.id = CRAS_CLIENT_OUTPUT_MUTE_CHANGED;
	m->header.length = sizeof(*m);
	m->muted = muted;
	m->user_muted = user_muted;
	m->mute_locked = mute_locked;
}
static inline void
cras_fill_client_capture_mute_changed(struct cras_client_mute_changed *m,
				      int32_t muted, int32_t mute_locked)
{
	m->header.id = CRAS_CLIENT_CAPTURE_MUTE_CHANGED;
	m->header.length = sizeof(*m);
	m->muted = muted;
	m->user_muted = 0;
	m->mute_locked = mute_locked;
}

struct __attribute__((__packed__)) cras_client_nodes_changed {
	struct cras_client_message header;
};
static inline void
cras_fill_client_nodes_changed(struct cras_client_nodes_changed *m)
{
	m->header.id = CRAS_CLIENT_NODES_CHANGED;
	m->header.length = sizeof(*m);
}

struct __attribute__((__packed__)) cras_client_active_node_changed {
	struct cras_client_message header;
	uint32_t direction;
	cras_node_id_t node_id;
};
static inline void
cras_fill_client_active_node_changed(struct cras_client_active_node_changed *m,
				     enum CRAS_STREAM_DIRECTION direction,
				     cras_node_id_t node_id)
{
	m->header.id = CRAS_CLIENT_ACTIVE_NODE_CHANGED;
	m->header.length = sizeof(*m);
	m->direction = direction;
	m->node_id = node_id;
};

struct __attribute__((__packed__)) cras_client_node_value_changed {
	struct cras_client_message header;
	cras_node_id_t node_id;
	int32_t value;
};
static inline void cras_fill_client_output_node_volume_changed(
	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
	int32_t volume)
{
	m->header.id = CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED;
	m->header.length = sizeof(*m);
	m->node_id = node_id;
	m->value = volume;
};
static inline void cras_fill_client_node_left_right_swapped_changed(
	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
	int swapped)
{
	m->header.id = CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED;
	m->header.length = sizeof(*m);
	m->node_id = node_id;
	m->value = swapped;
};
static inline void cras_fill_client_input_node_gain_changed(
	struct cras_client_node_value_changed *m, cras_node_id_t node_id,
	int32_t gain)
{
	m->header.id = CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED;
	m->header.length = sizeof(*m);
	m->node_id = node_id;
	m->value = gain;
};

struct __attribute__((__packed__)) cras_client_num_active_streams_changed {
	struct cras_client_message header;
	uint32_t direction;
	uint32_t num_active_streams;
};
static inline void 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)
{
	m->header.id = CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED;
	m->header.length = sizeof(*m);
	m->direction = direction;
	m->num_active_streams = num_active_streams;
};

/*
 * Messages specific to passing audio between client and server
 */
enum CRAS_AUDIO_MESSAGE_ID {
	AUDIO_MESSAGE_REQUEST_DATA,
	AUDIO_MESSAGE_DATA_READY,
	AUDIO_MESSAGE_DATA_CAPTURED,
	NUM_AUDIO_MESSAGES
};

struct __attribute__((__packed__)) audio_message {
	enum CRAS_AUDIO_MESSAGE_ID id;
	int32_t error;
	uint32_t frames; /* number of samples per channel */
};

#endif /* CRAS_MESSAGES_H_ */
