/*
 * Copyright (c) 2018 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Public API header file for Audio Codec
 *
 * This file contains the Audio Codec APIs
 */

#ifndef ZEPHYR_INCLUDE_AUDIO_CODEC_H_
#define ZEPHYR_INCLUDE_AUDIO_CODEC_H_

#include <drivers/i2s.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * PCM audio sample rates
 */
typedef enum {
	AUDIO_PCM_RATE_8K	= 8000,
	AUDIO_PCM_RATE_16K	= 16000,
	AUDIO_PCM_RATE_24K	= 24000,
	AUDIO_PCM_RATE_32K	= 32000,
	AUDIO_PCM_RATE_44P1K	= 44100,
	AUDIO_PCM_RATE_48K	= 48000,
	AUDIO_PCM_RATE_96K	= 96000,
	AUDIO_PCM_RATE_192K	= 192000,
} audio_pcm_rate_t;

/**
 * PCM audio sample bit widths
 */
typedef enum {
	AUDIO_PCM_WIDTH_16_BITS	= 16,
	AUDIO_PCM_WIDTH_20_BITS	= 20,
	AUDIO_PCM_WIDTH_24_BITS	= 24,
	AUDIO_PCM_WIDTH_32_BITS	= 32,
} audio_pcm_width_t;

/**
 * Digital Audio Interface (DAI) type
 */
typedef enum {
	AUDIO_DAI_TYPE_I2S,	/* I2S Interface */
	AUDIO_DAI_TYPE_INVALID,	/* Other interfaces can be added here */
} audio_dai_type_t;

/**
 * Codec properties that can be set by audio_codec_set_property()
 */
typedef enum {
	AUDIO_PROPERTY_OUTPUT_VOLUME,
	AUDIO_PROPERTY_OUTPUT_MUTE,
} audio_property_t;

/**
 * Audio channel identifiers to use in audio_codec_set_property()
 */
typedef enum {
	AUDIO_CHANNEL_FRONT_LEFT,
	AUDIO_CHANNEL_FRONT_RIGHT,
	AUDIO_CHANNEL_LFE,
	AUDIO_CHANNEL_FRONT_CENTER,
	AUDIO_CHANNEL_REAR_LEFT,
	AUDIO_CHANNEL_REAR_RIGHT,
	AUDIO_CHANNEL_REAR_CENTER,
	AUDIO_CHANNEL_SIDE_LEFT,
	AUDIO_CHANNEL_SIDE_RIGHT,
	AUDIO_CHANNEL_ALL,
} audio_channel_t;

/**
 * Digital Audio Interface Configuration
 * Configuration is dependent on DAI type
 */
typedef union {
	struct i2s_config i2s;	/* I2S configuration */
				/* Other DAI types go here */
} audio_dai_cfg_t;

/**
 * Codec configuration parameters
 */
struct audio_codec_cfg {
	u32_t			mclk_freq;	/* MCLK input frequency in Hz */
	audio_dai_type_t	dai_type;	/* Digital interface type */
	audio_dai_cfg_t		dai_cfg;	/* DAI configuration info */
};

/**
 * Codec property values
 */
typedef union {
	int 	vol;	/* Volume level in 0.5dB resolution */
	bool 	mute;	/* mute if true, unmute if false */
} audio_property_value_t;

/**
 * @cond INTERNAL_HIDDEN
 *
 * For internal use only, skip these in public documentation.
 */
struct audio_codec_api {
	int (*configure)(struct device *dev, struct audio_codec_cfg *cfg);
	void (*start_output)(struct device *dev);
	void (*stop_output)(struct device *dev);
	int (*set_property)(struct device *dev, audio_property_t property,
			audio_channel_t channel, audio_property_value_t val);
	int (*apply_properties)(struct device *dev);
};
/**
 * @endcond
 */

/**
 * @brief Configure the audio codec
 *
 * Configure the audio codec device according to the configuration
 * parameters provided as input
 *
 * @param dev Pointer to the device structure for codec driver instance.
 * @param cfg Pointer to the structure containing the codec configuration.
 *
 * @return 0 on success, negative error code on failure
 */
static inline int audio_codec_configure(struct device *dev,
		struct audio_codec_cfg *cfg)
{
	const struct audio_codec_api *api = dev->driver_api;

	return api->configure(dev, cfg);
}

/**
 * @brief Set codec to start output audio playback
 *
 * Setup the audio codec device to start the audio playback
 *
 * @param dev Pointer to the device structure for codec driver instance.
 *
 * @return none
 */
static inline void audio_codec_start_output(struct device *dev)
{
	const struct audio_codec_api *api = dev->driver_api;

	api->start_output(dev);
}

/**
 * @brief Set codec to stop output audio playback
 *
 * Setup the audio codec device to stop the audio playback
 *
 * @param dev Pointer to the device structure for codec driver instance.
 *
 * @return none
 */
static inline void audio_codec_stop_output(struct device *dev)
{
	const struct audio_codec_api *api = dev->driver_api;

	api->stop_output(dev);
}

/**
 * @brief Set a codec property defined by audio_property_t
 *
 * Set a property such as volume level, clock configuration etc.
 *
 * @param dev Pointer to the device structure for codec driver instance.
 * @param property The codec property to set
 * @param channel The audio channel for which the property has to be set
 * @param val pointer to a property value of type audio_codec_property_value_t
 *
 * @return 0 on success, negative error code on failure
 */
static inline int audio_codec_set_property(struct device *dev, audio_property_t property,
		audio_channel_t channel, audio_property_value_t val)
{
	const struct audio_codec_api *api = dev->driver_api;

	return api->set_property(dev, property, channel, val);
}

/**
 * @brief Atomically apply any cached properties
 *
 * Following one or more invocations of audio_codec_set_property, that may have
 * been cached by the driver, audio_codec_apply_properties can be invoked to
 * apply all the properties as atomic as possible
 *
 * @param dev Pointer to the device structure for codec driver instance.
 *
 * @return 0 on success, negative error code on failure
 */
static inline int audio_codec_apply_properties(struct device *dev)
{
	const struct audio_codec_api *api = dev->driver_api;

	return api->apply_properties(dev);
}

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_AUDIO_CODEC_H_ */
