diff --git a/include/audio/codec.h b/include/audio/codec.h new file mode 100644 index 00000000000..3935ecbbe94 --- /dev/null +++ b/include/audio/codec.h @@ -0,0 +1,215 @@ +/* + * 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 __AUDIO_CODEC_H__ +#define __AUDIO_CODEC_H__ + +#include + +#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 /* __AUDIO_CODEC_H__ */