2018-05-15 11:52:27 +08:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
2018-09-15 01:43:44 +08:00
|
|
|
#ifndef ZEPHYR_INCLUDE_AUDIO_CODEC_H_
|
|
|
|
#define ZEPHYR_INCLUDE_AUDIO_CODEC_H_
|
2018-05-15 11:52:27 +08:00
|
|
|
|
|
|
|
#include <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
|
|
|
|
|
2018-09-15 01:43:44 +08:00
|
|
|
#endif /* ZEPHYR_INCLUDE_AUDIO_CODEC_H_ */
|