/* 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.
 */

#ifndef CRAS_DSP_INI_H_
#define CRAS_DSP_INI_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "iniparser.h"

#include "array.h"
#include "cras_expr.h"

enum port_direction {
	PORT_INPUT,
	PORT_OUTPUT,
};

enum port_type {
	PORT_CONTROL,
	PORT_AUDIO,
};

#define INVALID_FLOW_ID -1

struct port {
	enum port_direction direction;
	enum port_type type;

	/* This is only used if there is a flow connects to this port,
	   -1 otherwise (i.e. the port has a constant input/output) */
	int flow_id;

	/* This is only used if type is PORT_CONTROL */
	float init_value;
};

DECLARE_ARRAY_TYPE(struct port, port_array)

struct plugin {
	const char *title;
	const char *library;  /* file name like "plugin.so" */
	const char *label;    /* label like "Eq" */
	const char *purpose;  /* like "playback" or "capture" */
	struct cras_expr_expression *disable_expr;  /* the disable expression of
					     this plugin */
	port_array ports;
};

struct flow {
	enum port_type type;  /* the type of the ports this flow connects to */
	const char *name;
	struct plugin *from;
	struct plugin *to;
	int from_port;
	int to_port;
};

DECLARE_ARRAY_TYPE(struct plugin, plugin_array)
DECLARE_ARRAY_TYPE(struct flow, flow_array)

struct ini {
	dictionary *dict;
	plugin_array plugins;
	flow_array flows;
};

/* Reads the ini file into the ini structure */
struct ini *cras_dsp_ini_create(const char *ini_filename);
/* Frees the dsp structure. */
void cras_dsp_ini_free(struct ini *ini);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* CRAS_DSP_INI_H_ */