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