Merge pull request #803 from yygg/master
[DeviceDrivers] use data queue in audio device driver and clean up the code.
This commit is contained in:
commit
d6fa9f912d
File diff suppressed because it is too large
Load Diff
|
@ -1,98 +1,123 @@
|
||||||
|
/*
|
||||||
|
* File : audio.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2017-05-09 Urey first version
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef __AUDIO_H__
|
#ifndef __AUDIO_H__
|
||||||
#define __AUDIO_H__
|
#define __AUDIO_H__
|
||||||
|
|
||||||
//#define AUDIO_DEVICE_USE_PRIVATE_BUFFER
|
|
||||||
|
|
||||||
|
|
||||||
/* AUDIO command */
|
/* AUDIO command */
|
||||||
#define _AUDIO_CTL(a) (0x10 + a)
|
#define _AUDIO_CTL(a) (0x10 + a)
|
||||||
|
|
||||||
#define AUDIO_CTL_GETCAPS _AUDIO_CTL(1)
|
#define AUDIO_CTL_GETCAPS _AUDIO_CTL(1)
|
||||||
#define AUDIO_CTL_CONFIGURE _AUDIO_CTL(2)
|
#define AUDIO_CTL_CONFIGURE _AUDIO_CTL(2)
|
||||||
#define AUDIO_CTL_SHUTDOWN _AUDIO_CTL(3)
|
#define AUDIO_CTL_SHUTDOWN _AUDIO_CTL(3)
|
||||||
#define AUDIO_CTL_START _AUDIO_CTL(4)
|
#define AUDIO_CTL_START _AUDIO_CTL(4)
|
||||||
#define AUDIO_CTL_STOP _AUDIO_CTL(5)
|
#define AUDIO_CTL_STOP _AUDIO_CTL(5)
|
||||||
#define AUDIO_CTL_PAUSE _AUDIO_CTL(6)
|
#define AUDIO_CTL_PAUSE _AUDIO_CTL(6)
|
||||||
#define AUDIO_CTL_RESUME _AUDIO_CTL(7)
|
#define AUDIO_CTL_RESUME _AUDIO_CTL(7)
|
||||||
#define AUDIO_CTL_GETBUFFERINFO _AUDIO_CTL(8)
|
#define AUDIO_CTL_GETBUFFERINFO _AUDIO_CTL(8)
|
||||||
#define AUDIO_CTL_ALLOCBUFFER _AUDIO_CTL(9)
|
#define AUDIO_CTL_ALLOCBUFFER _AUDIO_CTL(9)
|
||||||
#define AUDIO_CTL_FREEBUFFER _AUDIO_CTL(10)
|
#define AUDIO_CTL_FREEBUFFER _AUDIO_CTL(10)
|
||||||
#define AUDIO_CTL_HWRESET _AUDIO_CTL(11)
|
#define AUDIO_CTL_HWRESET _AUDIO_CTL(11)
|
||||||
|
|
||||||
|
|
||||||
/* Audio Device Types */
|
/* Audio Device Types */
|
||||||
#define AUDIO_TYPE_QUERY 0x00
|
#define AUDIO_TYPE_QUERY 0x00
|
||||||
#define AUDIO_TYPE_INPUT 0x01
|
#define AUDIO_TYPE_INPUT 0x01
|
||||||
#define AUDIO_TYPE_OUTPUT 0x02
|
#define AUDIO_TYPE_OUTPUT 0x02
|
||||||
#define AUDIO_TYPE_MIXER 0x04
|
#define AUDIO_TYPE_MIXER 0x04
|
||||||
#define AUDIO_TYPE_SELECTOR 0x08
|
#define AUDIO_TYPE_SELECTOR 0x08
|
||||||
#define AUDIO_TYPE_EFFECT 0x10
|
#define AUDIO_TYPE_EFFECT 0x10
|
||||||
|
|
||||||
/* Audio Format Types */
|
/* Audio Format Types */
|
||||||
#define AUDIO_FMT_PCM_U8 0x0001
|
#define AUDIO_FMT_PCM_U8 0x0001
|
||||||
#define AUDIO_FMT_PCM_S8 0x0002
|
#define AUDIO_FMT_PCM_S8 0x0002
|
||||||
|
|
||||||
#define AUDIO_FMT_PCM_U16_LE 0x0010
|
#define AUDIO_FMT_PCM_U16_LE 0x0010
|
||||||
#define AUDIO_FMT_PCM_S16_BE 0x0020
|
#define AUDIO_FMT_PCM_S16_BE 0x0020
|
||||||
#define AUDIO_FMT_PCM_S16_LE 0x0040
|
#define AUDIO_FMT_PCM_S16_LE 0x0040
|
||||||
#define AUDIO_FMT_PCM_U16_BE 0x0080
|
#define AUDIO_FMT_PCM_U16_BE 0x0080
|
||||||
#define AUDIO_FMT_PCM_U24_LE 0x0100
|
#define AUDIO_FMT_PCM_U24_LE 0x0100
|
||||||
#define AUDIO_FMT_PCM_S24_BE 0x0200
|
#define AUDIO_FMT_PCM_S24_BE 0x0200
|
||||||
#define AUDIO_FMT_PCM_S24_LE 0x0400
|
#define AUDIO_FMT_PCM_S24_LE 0x0400
|
||||||
#define AUDIO_FMT_PCM_U24_BE 0x0800
|
#define AUDIO_FMT_PCM_U24_BE 0x0800
|
||||||
#define AUDIO_FMT_PCM_U32_LE 0x1000
|
#define AUDIO_FMT_PCM_U32_LE 0x1000
|
||||||
#define AUDIO_FMT_PCM_S32_BE 0x2000
|
#define AUDIO_FMT_PCM_S32_BE 0x2000
|
||||||
#define AUDIO_FMT_PCM_S32_LE 0x4000
|
#define AUDIO_FMT_PCM_S32_LE 0x4000
|
||||||
#define AUDIO_FMT_PCM_U32_BE 0x8000
|
#define AUDIO_FMT_PCM_U32_BE 0x8000
|
||||||
|
|
||||||
/* Supported Sampling Rates */
|
/* Supported Sampling Rates */
|
||||||
#define AUDIO_SAMP_RATE_8K 0x0001
|
#define AUDIO_SAMP_RATE_8K 0x0001
|
||||||
#define AUDIO_SAMP_RATE_11K 0x0002
|
#define AUDIO_SAMP_RATE_11K 0x0002
|
||||||
#define AUDIO_SAMP_RATE_16K 0x0004
|
#define AUDIO_SAMP_RATE_16K 0x0004
|
||||||
#define AUDIO_SAMP_RATE_22K 0x0008
|
#define AUDIO_SAMP_RATE_22K 0x0008
|
||||||
#define AUDIO_SAMP_RATE_32K 0x0010
|
#define AUDIO_SAMP_RATE_32K 0x0010
|
||||||
#define AUDIO_SAMP_RATE_44K 0x0020
|
#define AUDIO_SAMP_RATE_44K 0x0020
|
||||||
#define AUDIO_SAMP_RATE_48K 0x0040
|
#define AUDIO_SAMP_RATE_48K 0x0040
|
||||||
#define AUDIO_SAMP_RATE_96K 0x0080
|
#define AUDIO_SAMP_RATE_96K 0x0080
|
||||||
#define AUDIO_SAMP_RATE_128K 0x0100
|
#define AUDIO_SAMP_RATE_128K 0x0100
|
||||||
#define AUDIO_SAMP_RATE_160K 0x0200
|
#define AUDIO_SAMP_RATE_160K 0x0200
|
||||||
#define AUDIO_SAMP_RATE_172K 0x0400
|
#define AUDIO_SAMP_RATE_172K 0x0400
|
||||||
#define AUDIO_SAMP_RATE_192K 0x0800
|
#define AUDIO_SAMP_RATE_192K 0x0800
|
||||||
|
|
||||||
/* Supported Bit Rates */
|
/* Supported Bit Rates */
|
||||||
#define AUDIO_BIT_RATE_22K 0x01
|
#define AUDIO_BIT_RATE_22K 0x01
|
||||||
#define AUDIO_BIT_RATE_44K 0x02
|
#define AUDIO_BIT_RATE_44K 0x02
|
||||||
#define AUDIO_BIT_RATE_48K 0x04
|
#define AUDIO_BIT_RATE_48K 0x04
|
||||||
#define AUDIO_BIT_RATE_96K 0x08
|
#define AUDIO_BIT_RATE_96K 0x08
|
||||||
#define AUDIO_BIT_RATE_128K 0x10
|
#define AUDIO_BIT_RATE_128K 0x10
|
||||||
#define AUDIO_BIT_RATE_160K 0x20
|
#define AUDIO_BIT_RATE_160K 0x20
|
||||||
#define AUDIO_BIT_RATE_172K 0x40
|
#define AUDIO_BIT_RATE_172K 0x40
|
||||||
#define AUDIO_BIT_RATE_192K 0x80
|
#define AUDIO_BIT_RATE_192K 0x80
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Support Dsp(input/output) Units controls */
|
/* Support Dsp(input/output) Units controls */
|
||||||
#define AUDIO_DSP_PARAM 0 /* get/set all params */
|
#define AUDIO_DSP_PARAM 0 /* get/set all params */
|
||||||
#define AUDIO_DSP_SAMPLERATE 1 /* ²ÉÑùƵÂÊ */
|
#define AUDIO_DSP_SAMPLERATE 1 /* ²ÉÑùƵÂÊ */
|
||||||
#define AUDIO_DSP_FMT 2
|
#define AUDIO_DSP_FMT 2
|
||||||
#define AUDIO_DSP_CHANNELS 3
|
#define AUDIO_DSP_CHANNELS 3
|
||||||
|
|
||||||
/* Supported Mixer Units controls */
|
/* Supported Mixer Units controls */
|
||||||
#define AUDIO_MIXER_QUERY 0x0000
|
#define AUDIO_MIXER_QUERY 0x0000
|
||||||
#define AUDIO_MIXER_MUTE 0x0001
|
#define AUDIO_MIXER_MUTE 0x0001
|
||||||
#define AUDIO_MIXER_VOLUME 0x0002
|
#define AUDIO_MIXER_VOLUME 0x0002
|
||||||
#define AUDIO_MIXER_BASS 0x0004
|
#define AUDIO_MIXER_BASS 0x0004
|
||||||
#define AUDIO_MIXER_MID 0x0008
|
#define AUDIO_MIXER_MID 0x0008
|
||||||
#define AUDIO_MIXER_TREBLE 0x0010
|
#define AUDIO_MIXER_TREBLE 0x0010
|
||||||
#define AUDIO_MIXER_EQUALIZER 0x0020
|
#define AUDIO_MIXER_EQUALIZER 0x0020
|
||||||
#define AUDIO_MIXER_LINE 0x0040
|
#define AUDIO_MIXER_LINE 0x0040
|
||||||
#define AUDIO_MIXER_DIGITAL 0x0080
|
#define AUDIO_MIXER_DIGITAL 0x0080
|
||||||
#define AUDIO_MIXER_MIC 0x0100
|
#define AUDIO_MIXER_MIC 0x0100
|
||||||
|
|
||||||
#define AUDIO_MIXER_EXTEND 0x8000 //extend mixer command
|
#define AUDIO_MIXER_EXTEND 0x8000 //extend mixer command
|
||||||
|
|
||||||
|
#define CFG_AUDIO_REPLAY_QUEUE_COUNT 4
|
||||||
|
#define CFG_AUDIO_RECORD_PIPE_SIZE (8 * 1024)
|
||||||
|
#define AUDIO_DEVICE_MP_CNT (4)
|
||||||
|
#define AUDIO_DEVICE_DECODE_MP_BLOCK_SZ (4352 * 4)
|
||||||
|
#define AUDIO_DEVICE_DECODE_MP_SZ ((AUDIO_DEVICE_DECODE_MP_BLOCK_SZ*2 + 4)*AUDIO_DEVICE_MP_CNT)
|
||||||
|
|
||||||
#define CFG_AUDIO_REPLAY_QUEUE_COUNT 4
|
|
||||||
#define CFG_AUDIO_RECORD_PIPE_SIZE (8 * 1024)
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -104,36 +129,19 @@ enum
|
||||||
/* the preferred number and size of audio pipeline buffer for the audio device */
|
/* the preferred number and size of audio pipeline buffer for the audio device */
|
||||||
struct rt_audio_buf_info
|
struct rt_audio_buf_info
|
||||||
{
|
{
|
||||||
rt_uint32_t buffer_size; /* Preferred qty of buffers */
|
rt_uint32_t buffer_size; /* Preferred qty of buffers */
|
||||||
rt_uint32_t buffer_count; /* Preferred size of the buffers */
|
rt_uint32_t buffer_count; /* Preferred size of the buffers */
|
||||||
};
|
};
|
||||||
struct rt_audio_buf_desc
|
struct rt_audio_buf_desc
|
||||||
{
|
{
|
||||||
rt_uint8_t *data_ptr;
|
rt_uint8_t *data_ptr;
|
||||||
rt_size_t data_size;
|
rt_size_t data_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt_audio_frame
|
struct rt_audio_frame
|
||||||
{
|
{
|
||||||
const void *data_ptr;
|
const void *data_ptr;
|
||||||
rt_size_t data_size;
|
rt_size_t data_size;
|
||||||
rt_size_t data_ofs;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rt_audio_queue
|
|
||||||
{
|
|
||||||
rt_uint16_t count;
|
|
||||||
rt_uint16_t size;
|
|
||||||
rt_uint16_t lwm;
|
|
||||||
rt_bool_t waiting_lwm;
|
|
||||||
|
|
||||||
rt_uint16_t get_index;
|
|
||||||
rt_uint16_t put_index;
|
|
||||||
|
|
||||||
struct rt_audio_frame *queue;
|
|
||||||
|
|
||||||
rt_list_t suspended_push_list;
|
|
||||||
rt_list_t suspended_pop_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt_audio_device;
|
struct rt_audio_device;
|
||||||
|
@ -141,25 +149,21 @@ struct rt_audio_caps;
|
||||||
struct rt_audio_configure;
|
struct rt_audio_configure;
|
||||||
struct rt_audio_ops
|
struct rt_audio_ops
|
||||||
{
|
{
|
||||||
rt_err_t (*getcaps) (struct rt_audio_device *audio,struct rt_audio_caps *caps);
|
rt_err_t (*getcaps) (struct rt_audio_device *audio,struct rt_audio_caps *caps);
|
||||||
rt_err_t (*configure) (struct rt_audio_device *audio,struct rt_audio_caps *caps);
|
rt_err_t (*configure) (struct rt_audio_device *audio,struct rt_audio_caps *caps);
|
||||||
|
|
||||||
rt_err_t (*init) (struct rt_audio_device *audio);
|
rt_err_t (*init) (struct rt_audio_device *audio);
|
||||||
rt_err_t (*shutdown) (struct rt_audio_device *audio);
|
rt_err_t (*shutdown) (struct rt_audio_device *audio);
|
||||||
rt_err_t (*start) (struct rt_audio_device *audio,int stream);
|
rt_err_t (*start) (struct rt_audio_device *audio,int stream);
|
||||||
rt_err_t (*stop) (struct rt_audio_device *audio,int stream);
|
rt_err_t (*stop) (struct rt_audio_device *audio,int stream);
|
||||||
rt_err_t (*suspend) (struct rt_audio_device *audio,int stream);
|
rt_err_t (*suspend) (struct rt_audio_device *audio,int stream);
|
||||||
rt_err_t (*resume) (struct rt_audio_device *audio,int stream);
|
rt_err_t (*resume) (struct rt_audio_device *audio,int stream);
|
||||||
|
|
||||||
rt_err_t (*control) (struct rt_audio_device *audio, rt_uint8_t cmd, void *arg);
|
rt_err_t (*control) (struct rt_audio_device *audio, rt_uint8_t cmd, void *arg);
|
||||||
rt_size_t (*transmit) (struct rt_audio_device *audio, const void *writeBuf,void *readBuf, rt_size_t size);
|
rt_size_t (*transmit) (struct rt_audio_device *audio, const void *writeBuf,void *readBuf, rt_size_t size);
|
||||||
|
|
||||||
//get page size of codec or private buffer's info
|
//get page size of codec or private buffer's info
|
||||||
void (*buffer_info) (struct rt_audio_device *audio,struct rt_audio_buf_info *info );
|
void (*buffer_info) (struct rt_audio_device *audio,struct rt_audio_buf_info *info );
|
||||||
#ifdef AUDIO_DEVICE_USE_PRIVATE_BUFFER
|
|
||||||
rt_err_t (*buffer_alloc) (struct rt_audio_device *audio,rt_uint8_t **data_ptr,rt_size_t *size);
|
|
||||||
void (*buffer_free) (struct rt_audio_device *audio,rt_uint8_t *data_ptr);
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,42 +178,44 @@ struct rt_audio_configure
|
||||||
|
|
||||||
struct rt_audio_caps
|
struct rt_audio_caps
|
||||||
{
|
{
|
||||||
int main_type;
|
int main_type;
|
||||||
int sub_type;
|
int sub_type;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
rt_uint32_t mask;
|
rt_uint32_t mask;
|
||||||
int value;
|
int value;
|
||||||
struct rt_audio_configure config;
|
struct rt_audio_configure config;
|
||||||
}udata;
|
}udata;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt_audio_replay
|
struct rt_audio_replay
|
||||||
{
|
{
|
||||||
rt_bool_t activated;
|
rt_bool_t activated;
|
||||||
struct rt_audio_queue queue;
|
struct rt_data_queue queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt_audio_record
|
struct rt_audio_record
|
||||||
{
|
{
|
||||||
rt_bool_t activated;
|
rt_bool_t activated;
|
||||||
struct rt_pipe_device pipe;
|
struct rt_pipe_device pipe;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt_audio_device
|
struct rt_audio_device
|
||||||
{
|
{
|
||||||
struct rt_device parent;
|
struct rt_device parent;
|
||||||
struct rt_audio_ops *ops;
|
struct rt_audio_ops *ops;
|
||||||
|
|
||||||
struct rt_audio_replay *replay;
|
struct rt_mempool mp;
|
||||||
struct rt_audio_record *record;
|
|
||||||
|
struct rt_audio_replay *replay;
|
||||||
|
struct rt_audio_record *record;
|
||||||
};
|
};
|
||||||
|
|
||||||
rt_err_t rt_audio_register(struct rt_audio_device *audio, const char *name, rt_uint32_t flag, void *data);
|
rt_err_t rt_audio_register (struct rt_audio_device *audio, const char *name, rt_uint32_t flag, void *data);
|
||||||
void rt_audio_tx_complete(struct rt_audio_device *audio,rt_uint8_t *pbuf);
|
void rt_audio_tx_complete (struct rt_audio_device *audio,rt_uint8_t *pbuf);
|
||||||
void rt_audio_rx_done(struct rt_audio_device *audio,rt_uint8_t *pbuf,rt_size_t len);
|
void rt_audio_rx_done (struct rt_audio_device *audio,rt_uint8_t *pbuf,rt_size_t len);
|
||||||
rt_uint32_t rt_audio_format_to_bits(rt_uint32_t format);
|
rt_uint32_t rt_audio_format_to_bits (rt_uint32_t format);
|
||||||
|
|
||||||
|
|
||||||
/* Device Control Commands */
|
/* Device Control Commands */
|
||||||
|
@ -219,7 +225,6 @@ rt_uint32_t rt_audio_format_to_bits(rt_uint32_t format);
|
||||||
#define CODEC_CMD_SAMPLERATE 3
|
#define CODEC_CMD_SAMPLERATE 3
|
||||||
#define CODEC_CMD_EQ 4
|
#define CODEC_CMD_EQ 4
|
||||||
#define CODEC_CMD_3D 5
|
#define CODEC_CMD_3D 5
|
||||||
#define CODEC_CMD_SWITCH 6
|
|
||||||
|
|
||||||
#define CODEC_VOLUME_MAX (63)
|
#define CODEC_VOLUME_MAX (63)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue