📄 pcm.h
字号:
#ifndef __SOUND_PCM_H#define __SOUND_PCM_H/* * Digital Audio (PCM) abstract layer * Copyright (c) by Jaroslav Kysela <perex@suse.cz> * Abramo Bagnara <abramo@alsa-project.org> * * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */#include <sound/asound.h>#include <sound/memalloc.h>#include <linux/poll.h>#include <linux/bitops.h>typedef sndrv_pcm_uframes_t snd_pcm_uframes_t;typedef sndrv_pcm_sframes_t snd_pcm_sframes_t;typedef enum sndrv_pcm_class snd_pcm_class_t;typedef enum sndrv_pcm_subclass snd_pcm_subclass_t;typedef enum sndrv_pcm_stream snd_pcm_stream_t;typedef enum sndrv_pcm_access snd_pcm_access_t;typedef enum sndrv_pcm_format snd_pcm_format_t;typedef enum sndrv_pcm_subformat snd_pcm_subformat_t;typedef enum sndrv_pcm_state snd_pcm_state_t;typedef union sndrv_pcm_sync_id snd_pcm_sync_id_t;typedef struct sndrv_pcm_info snd_pcm_info_t;typedef enum sndrv_pcm_hw_param snd_pcm_hw_param_t;typedef struct sndrv_pcm_hw_params snd_pcm_hw_params_t;typedef enum sndrv_pcm_start snd_pcm_start_t;typedef enum sndrv_pcm_xrun snd_pcm_xrun_t;typedef enum sndrv_pcm_tstamp snd_pcm_tstamp_t;typedef struct sndrv_pcm_sw_params snd_pcm_sw_params_t;typedef struct sndrv_pcm_channel_info snd_pcm_channel_info_t;typedef struct sndrv_pcm_status snd_pcm_status_t;typedef struct sndrv_pcm_mmap_status snd_pcm_mmap_status_t;typedef struct sndrv_pcm_mmap_control snd_pcm_mmap_control_t;typedef struct sndrv_mask snd_mask_t;typedef struct snd_sg_buf snd_pcm_sgbuf_t;#define snd_pcm_substream_chip(substream) ((substream)->private_data)#define snd_pcm_chip(pcm) ((pcm)->private_data)typedef struct _snd_pcm_file snd_pcm_file_t;typedef struct _snd_pcm_runtime snd_pcm_runtime_t;#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)#include "pcm_oss.h"#endif/* * Hardware (lowlevel) section */typedef struct _snd_pcm_hardware { unsigned int info; /* SNDRV_PCM_INFO_* */ u64 formats; /* SNDRV_PCM_FMTBIT_* */ unsigned int rates; /* SNDRV_PCM_RATE_* */ unsigned int rate_min; /* min rate */ unsigned int rate_max; /* max rate */ unsigned int channels_min; /* min channels */ unsigned int channels_max; /* max channels */ size_t buffer_bytes_max; /* max buffer size */ size_t period_bytes_min; /* min period size */ size_t period_bytes_max; /* max period size */ unsigned int periods_min; /* min # of periods */ unsigned int periods_max; /* max # of periods */ size_t fifo_size; /* fifo size in bytes */} snd_pcm_hardware_t;typedef struct _snd_pcm_ops { int (*open)(snd_pcm_substream_t *substream); int (*close)(snd_pcm_substream_t *substream); int (*ioctl)(snd_pcm_substream_t * substream, unsigned int cmd, void *arg); int (*hw_params)(snd_pcm_substream_t * substream, snd_pcm_hw_params_t * params); int (*hw_free)(snd_pcm_substream_t *substream); int (*prepare)(snd_pcm_substream_t * substream); int (*trigger)(snd_pcm_substream_t * substream, int cmd); snd_pcm_uframes_t (*pointer)(snd_pcm_substream_t * substream); int (*copy)(snd_pcm_substream_t *substream, int channel, snd_pcm_uframes_t pos, void __user *buf, snd_pcm_uframes_t count); int (*silence)(snd_pcm_substream_t *substream, int channel, snd_pcm_uframes_t pos, snd_pcm_uframes_t count); struct page *(*page)(snd_pcm_substream_t *substream, unsigned long offset); int (*mmap)(snd_pcm_substream_t *substream, struct vm_area_struct *vma); int (*ack)(snd_pcm_substream_t *substream);} snd_pcm_ops_t;/* * */#define SNDRV_PCM_DEVICES 8#define SNDRV_PCM_IOCTL1_FALSE ((void *)0)#define SNDRV_PCM_IOCTL1_TRUE ((void *)1)#define SNDRV_PCM_IOCTL1_RESET 0#define SNDRV_PCM_IOCTL1_INFO 1#define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2#define SNDRV_PCM_IOCTL1_GSTATE 3#define SNDRV_PCM_TRIGGER_STOP 0#define SNDRV_PCM_TRIGGER_START 1#define SNDRV_PCM_TRIGGER_PAUSE_PUSH 3#define SNDRV_PCM_TRIGGER_PAUSE_RELEASE 4#define SNDRV_PCM_TRIGGER_SUSPEND 5#define SNDRV_PCM_TRIGGER_RESUME 6#define SNDRV_PCM_POS_XRUN ((snd_pcm_uframes_t)-1)/* If you change this don't forget to change rates[] table in pcm_native.c */#define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */#define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */#define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */#define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */#define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */#define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */#define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */#define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */#define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */#define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */#define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */#define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */#define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */#define SNDRV_PCM_RATE_CONTINUOUS (1<<30) /* continuous range */#define SNDRV_PCM_RATE_KNOT (1<<31) /* supports more non-continuos rates */#define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\ SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\ SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)#define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)#define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\ SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)#define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\ SNDRV_PCM_RATE_192000)#define SNDRV_PCM_FMTBIT_S8 (1ULL << SNDRV_PCM_FORMAT_S8)#define SNDRV_PCM_FMTBIT_U8 (1ULL << SNDRV_PCM_FORMAT_U8)#define SNDRV_PCM_FMTBIT_S16_LE (1ULL << SNDRV_PCM_FORMAT_S16_LE)#define SNDRV_PCM_FMTBIT_S16_BE (1ULL << SNDRV_PCM_FORMAT_S16_BE)#define SNDRV_PCM_FMTBIT_U16_LE (1ULL << SNDRV_PCM_FORMAT_U16_LE)#define SNDRV_PCM_FMTBIT_U16_BE (1ULL << SNDRV_PCM_FORMAT_U16_BE)#define SNDRV_PCM_FMTBIT_S24_LE (1ULL << SNDRV_PCM_FORMAT_S24_LE)#define SNDRV_PCM_FMTBIT_S24_BE (1ULL << SNDRV_PCM_FORMAT_S24_BE)#define SNDRV_PCM_FMTBIT_U24_LE (1ULL << SNDRV_PCM_FORMAT_U24_LE)#define SNDRV_PCM_FMTBIT_U24_BE (1ULL << SNDRV_PCM_FORMAT_U24_BE)#define SNDRV_PCM_FMTBIT_S32_LE (1ULL << SNDRV_PCM_FORMAT_S32_LE)#define SNDRV_PCM_FMTBIT_S32_BE (1ULL << SNDRV_PCM_FORMAT_S32_BE)#define SNDRV_PCM_FMTBIT_U32_LE (1ULL << SNDRV_PCM_FORMAT_U32_LE)#define SNDRV_PCM_FMTBIT_U32_BE (1ULL << SNDRV_PCM_FORMAT_U32_BE)#define SNDRV_PCM_FMTBIT_FLOAT_LE (1ULL << SNDRV_PCM_FORMAT_FLOAT_LE)#define SNDRV_PCM_FMTBIT_FLOAT_BE (1ULL << SNDRV_PCM_FORMAT_FLOAT_BE)#define SNDRV_PCM_FMTBIT_FLOAT64_LE (1ULL << SNDRV_PCM_FORMAT_FLOAT64_LE)#define SNDRV_PCM_FMTBIT_FLOAT64_BE (1ULL << SNDRV_PCM_FORMAT_FLOAT64_BE)#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE)#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE)#define SNDRV_PCM_FMTBIT_MU_LAW (1ULL << SNDRV_PCM_FORMAT_MU_LAW)#define SNDRV_PCM_FMTBIT_A_LAW (1ULL << SNDRV_PCM_FORMAT_A_LAW)#define SNDRV_PCM_FMTBIT_IMA_ADPCM (1ULL << SNDRV_PCM_FORMAT_IMA_ADPCM)#define SNDRV_PCM_FMTBIT_MPEG (1ULL << SNDRV_PCM_FORMAT_MPEG)#define SNDRV_PCM_FMTBIT_GSM (1ULL << SNDRV_PCM_FORMAT_GSM)#define SNDRV_PCM_FMTBIT_SPECIAL (1ULL << SNDRV_PCM_FORMAT_SPECIAL)#define SNDRV_PCM_FMTBIT_S24_3LE (1ULL << SNDRV_PCM_FORMAT_S24_3LE)#define SNDRV_PCM_FMTBIT_U24_3LE (1ULL << SNDRV_PCM_FORMAT_U24_3LE)#define SNDRV_PCM_FMTBIT_S24_3BE (1ULL << SNDRV_PCM_FORMAT_S24_3BE)#define SNDRV_PCM_FMTBIT_U24_3BE (1ULL << SNDRV_PCM_FORMAT_U24_3BE)#define SNDRV_PCM_FMTBIT_S20_3LE (1ULL << SNDRV_PCM_FORMAT_S20_3LE)#define SNDRV_PCM_FMTBIT_U20_3LE (1ULL << SNDRV_PCM_FORMAT_U20_3LE)#define SNDRV_PCM_FMTBIT_S20_3BE (1ULL << SNDRV_PCM_FORMAT_S20_3BE)#define SNDRV_PCM_FMTBIT_U20_3BE (1ULL << SNDRV_PCM_FORMAT_U20_3BE)#define SNDRV_PCM_FMTBIT_S18_3LE (1ULL << SNDRV_PCM_FORMAT_S18_3LE)#define SNDRV_PCM_FMTBIT_U18_3LE (1ULL << SNDRV_PCM_FORMAT_U18_3LE)#define SNDRV_PCM_FMTBIT_S18_3BE (1ULL << SNDRV_PCM_FORMAT_S18_3BE)#define SNDRV_PCM_FMTBIT_U18_3BE (1ULL << SNDRV_PCM_FORMAT_U18_3BE)#ifdef SNDRV_LITTLE_ENDIAN#define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE#define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_LE#define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_LE#define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_LE#define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_LE#define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_LE#define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE#define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE#endif#ifdef SNDRV_BIG_ENDIAN#define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE#define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_BE#define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_BE#define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_BE#define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_BE#define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_BE#define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE#define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE#define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE#endifstruct _snd_pcm_file { snd_pcm_substream_t * substream; struct _snd_pcm_file * next;};typedef struct _snd_pcm_hw_rule snd_pcm_hw_rule_t;typedef int (*snd_pcm_hw_rule_func_t)(snd_pcm_hw_params_t *params, snd_pcm_hw_rule_t *rule);struct _snd_pcm_hw_rule { unsigned int cond; snd_pcm_hw_rule_func_t func; int var; int deps[4]; void *private;};typedef struct _snd_pcm_hw_constraints { snd_mask_t masks[SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1]; snd_interval_t intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1]; unsigned int rules_num; unsigned int rules_all; snd_pcm_hw_rule_t *rules;} snd_pcm_hw_constraints_t;static inline snd_mask_t *constrs_mask(snd_pcm_hw_constraints_t *constrs, snd_pcm_hw_param_t var){ return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];}static inline snd_interval_t *constrs_interval(snd_pcm_hw_constraints_t *constrs, snd_pcm_hw_param_t var){ return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];}typedef struct { unsigned int num; unsigned int den_min, den_max, den_step;} ratnum_t;typedef struct { unsigned int num_min, num_max, num_step; unsigned int den;} ratden_t;typedef struct { int nrats; ratnum_t *rats;} snd_pcm_hw_constraint_ratnums_t;typedef struct { int nrats; ratden_t *rats;} snd_pcm_hw_constraint_ratdens_t;typedef struct { unsigned int count; unsigned int *list; unsigned int mask;} snd_pcm_hw_constraint_list_t;struct _snd_pcm_runtime { /* -- Status -- */ snd_pcm_substream_t *trigger_master; snd_timestamp_t trigger_tstamp; /* trigger timestamp */ int overrange; snd_pcm_uframes_t avail_max; snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */ snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time*/ /* -- HW params -- */ snd_pcm_access_t access; /* access mode */ snd_pcm_format_t format; /* SNDRV_PCM_FORMAT_* */ snd_pcm_subformat_t subformat; /* subformat */ unsigned int rate; /* rate in Hz */ unsigned int channels; /* channels */ snd_pcm_uframes_t period_size; /* period size */ unsigned int periods; /* periods */ snd_pcm_uframes_t buffer_size; /* buffer size */ unsigned int tick_time; /* tick time */ snd_pcm_uframes_t min_align; /* Min alignment for the format */ size_t byte_align; unsigned int frame_bits; unsigned int sample_bits; unsigned int info; unsigned int rate_num; unsigned int rate_den; /* -- SW params -- */ int tstamp_timespec; /* use timeval (0) or timespec (1) */ snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */ unsigned int period_step; unsigned int sleep_min; /* min ticks to sleep */ snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */ snd_pcm_uframes_t start_threshold; snd_pcm_uframes_t stop_threshold; snd_pcm_uframes_t silence_threshold; /* Silence filling happens when noise is nearest than this */ snd_pcm_uframes_t silence_size; /* Silence filling size */ snd_pcm_uframes_t boundary; /* pointers wrap point */ snd_pcm_uframes_t silence_start; /* starting pointer to silence area */ snd_pcm_uframes_t silence_filled; /* size filled with silence */ snd_pcm_sync_id_t sync; /* hardware synchronization ID */ /* -- mmap -- */ volatile snd_pcm_mmap_status_t *status;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -