1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file include/pcm_rate.h 3d5ac70f0Sopenharmony_ci * \brief External Rate-Converter-Plugin SDK 4d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de> 5d5ac70f0Sopenharmony_ci * \date 2006 6d5ac70f0Sopenharmony_ci * 7d5ac70f0Sopenharmony_ci * External Rate-Converter-Plugin SDK 8d5ac70f0Sopenharmony_ci */ 9d5ac70f0Sopenharmony_ci 10d5ac70f0Sopenharmony_ci/* 11d5ac70f0Sopenharmony_ci * ALSA external PCM rate-converter plugin SDK (draft version) 12d5ac70f0Sopenharmony_ci * 13d5ac70f0Sopenharmony_ci * Copyright (c) 2006 Takashi Iwai <tiwai@suse.de> 14d5ac70f0Sopenharmony_ci * 15d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 16d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 17d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 18d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 19d5ac70f0Sopenharmony_ci * 20d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 21d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 22d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 24d5ac70f0Sopenharmony_ci * 25d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 26d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 27d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 28d5ac70f0Sopenharmony_ci * 29d5ac70f0Sopenharmony_ci */ 30d5ac70f0Sopenharmony_ci 31d5ac70f0Sopenharmony_ci#ifndef __ALSA_PCM_RATE_H 32d5ac70f0Sopenharmony_ci#define __ALSA_PCM_RATE_H 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci#ifdef __cplusplus 35d5ac70f0Sopenharmony_ciextern "C" { 36d5ac70f0Sopenharmony_ci#endif 37d5ac70f0Sopenharmony_ci 38d5ac70f0Sopenharmony_ci/** 39d5ac70f0Sopenharmony_ci * Protocol version 40d5ac70f0Sopenharmony_ci */ 41d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_VERSION 0x010003 42d5ac70f0Sopenharmony_ci 43d5ac70f0Sopenharmony_ci/** hw_params information for a single side */ 44d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_side_info { 45d5ac70f0Sopenharmony_ci snd_pcm_format_t format; 46d5ac70f0Sopenharmony_ci unsigned int rate; 47d5ac70f0Sopenharmony_ci snd_pcm_uframes_t buffer_size; 48d5ac70f0Sopenharmony_ci snd_pcm_uframes_t period_size; 49d5ac70f0Sopenharmony_ci} snd_pcm_rate_side_info_t; 50d5ac70f0Sopenharmony_ci 51d5ac70f0Sopenharmony_ci/** hw_params information */ 52d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_info { 53d5ac70f0Sopenharmony_ci struct snd_pcm_rate_side_info in; 54d5ac70f0Sopenharmony_ci struct snd_pcm_rate_side_info out; 55d5ac70f0Sopenharmony_ci unsigned int channels; 56d5ac70f0Sopenharmony_ci} snd_pcm_rate_info_t; 57d5ac70f0Sopenharmony_ci 58d5ac70f0Sopenharmony_cienum { 59d5ac70f0Sopenharmony_ci SND_PCM_RATE_FLAG_INTERLEAVED = (1U << 0), /** only interleaved format */ 60d5ac70f0Sopenharmony_ci SND_PCM_RATE_FLAG_SYNC_FORMATS = (1U << 1), /** both input and output formats have to be identical */ 61d5ac70f0Sopenharmony_ci}; 62d5ac70f0Sopenharmony_ci 63d5ac70f0Sopenharmony_ci/** Callback table of rate-converter */ 64d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_ops { 65d5ac70f0Sopenharmony_ci /** 66d5ac70f0Sopenharmony_ci * close the converter; optional 67d5ac70f0Sopenharmony_ci */ 68d5ac70f0Sopenharmony_ci void (*close)(void *obj); 69d5ac70f0Sopenharmony_ci /** 70d5ac70f0Sopenharmony_ci * initialize the converter, called at hw_params 71d5ac70f0Sopenharmony_ci */ 72d5ac70f0Sopenharmony_ci int (*init)(void *obj, snd_pcm_rate_info_t *info); 73d5ac70f0Sopenharmony_ci /** 74d5ac70f0Sopenharmony_ci * free the converter; optional 75d5ac70f0Sopenharmony_ci */ 76d5ac70f0Sopenharmony_ci void (*free)(void *obj); 77d5ac70f0Sopenharmony_ci /** 78d5ac70f0Sopenharmony_ci * reset the converter, called at prepare; optional 79d5ac70f0Sopenharmony_ci */ 80d5ac70f0Sopenharmony_ci void (*reset)(void *obj); 81d5ac70f0Sopenharmony_ci /** 82d5ac70f0Sopenharmony_ci * adjust the pitch, called at sw_params; optional 83d5ac70f0Sopenharmony_ci */ 84d5ac70f0Sopenharmony_ci int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info); 85d5ac70f0Sopenharmony_ci /** 86d5ac70f0Sopenharmony_ci * convert the data 87d5ac70f0Sopenharmony_ci */ 88d5ac70f0Sopenharmony_ci void (*convert)(void *obj, 89d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *dst_areas, 90d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, unsigned int dst_frames, 91d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 92d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, unsigned int src_frames); 93d5ac70f0Sopenharmony_ci /** 94d5ac70f0Sopenharmony_ci * convert an s16 interleaved-data array; exclusive with convert 95d5ac70f0Sopenharmony_ci */ 96d5ac70f0Sopenharmony_ci void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames, 97d5ac70f0Sopenharmony_ci const int16_t *src, unsigned int src_frames); 98d5ac70f0Sopenharmony_ci /** 99d5ac70f0Sopenharmony_ci * compute the frame size for input 100d5ac70f0Sopenharmony_ci */ 101d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames); 102d5ac70f0Sopenharmony_ci /** 103d5ac70f0Sopenharmony_ci * compute the frame size for output 104d5ac70f0Sopenharmony_ci */ 105d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames); 106d5ac70f0Sopenharmony_ci /** 107d5ac70f0Sopenharmony_ci * the protocol version the plugin supports; 108d5ac70f0Sopenharmony_ci * new field since version 0x010002 109d5ac70f0Sopenharmony_ci */ 110d5ac70f0Sopenharmony_ci unsigned int version; 111d5ac70f0Sopenharmony_ci /** 112d5ac70f0Sopenharmony_ci * return the supported min / max sample rates; 113d5ac70f0Sopenharmony_ci * new ops since version 0x010002 114d5ac70f0Sopenharmony_ci */ 115d5ac70f0Sopenharmony_ci int (*get_supported_rates)(void *obj, unsigned int *rate_min, 116d5ac70f0Sopenharmony_ci unsigned int *rate_max); 117d5ac70f0Sopenharmony_ci /** 118d5ac70f0Sopenharmony_ci * show some status messages for verbose mode; 119d5ac70f0Sopenharmony_ci * new ops since version 0x010002 120d5ac70f0Sopenharmony_ci */ 121d5ac70f0Sopenharmony_ci void (*dump)(void *obj, snd_output_t *out); 122d5ac70f0Sopenharmony_ci /** 123d5ac70f0Sopenharmony_ci * get the supported input and output formats (optional); 124d5ac70f0Sopenharmony_ci * new ops since version 0x010003 125d5ac70f0Sopenharmony_ci */ 126d5ac70f0Sopenharmony_ci int (*get_supported_formats)(void *obj, uint64_t *in_formats, 127d5ac70f0Sopenharmony_ci uint64_t *out_formats, 128d5ac70f0Sopenharmony_ci unsigned int *flags); 129d5ac70f0Sopenharmony_ci} snd_pcm_rate_ops_t; 130d5ac70f0Sopenharmony_ci 131d5ac70f0Sopenharmony_ci/** open function type */ 132d5ac70f0Sopenharmony_citypedef int (*snd_pcm_rate_open_func_t)(unsigned int version, void **objp, 133d5ac70f0Sopenharmony_ci snd_pcm_rate_ops_t *opsp); 134d5ac70f0Sopenharmony_ci 135d5ac70f0Sopenharmony_citypedef int (*snd_pcm_rate_open_conf_func_t)(unsigned int version, void **objp, 136d5ac70f0Sopenharmony_ci snd_pcm_rate_ops_t *opsp, const snd_config_t *conf); 137d5ac70f0Sopenharmony_ci 138d5ac70f0Sopenharmony_ci/** 139d5ac70f0Sopenharmony_ci * Define the object entry for external PCM rate-converter plugins 140d5ac70f0Sopenharmony_ci */ 141d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_ENTRY(name) _snd_pcm_rate_##name##_open 142d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_CONF_ENTRY(name) _snd_pcm_rate_##name##_open_conf 143d5ac70f0Sopenharmony_ci 144d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 145d5ac70f0Sopenharmony_ci/* old rate_ops for protocol version 0x010001 */ 146d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_old_ops { 147d5ac70f0Sopenharmony_ci void (*close)(void *obj); 148d5ac70f0Sopenharmony_ci int (*init)(void *obj, snd_pcm_rate_info_t *info); 149d5ac70f0Sopenharmony_ci void (*free)(void *obj); 150d5ac70f0Sopenharmony_ci void (*reset)(void *obj); 151d5ac70f0Sopenharmony_ci int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info); 152d5ac70f0Sopenharmony_ci void (*convert)(void *obj, 153d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *dst_areas, 154d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, unsigned int dst_frames, 155d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 156d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, unsigned int src_frames); 157d5ac70f0Sopenharmony_ci void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames, 158d5ac70f0Sopenharmony_ci const int16_t *src, unsigned int src_frames); 159d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames); 160d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames); 161d5ac70f0Sopenharmony_ci} snd_pcm_rate_old_ops_t; 162d5ac70f0Sopenharmony_ci 163d5ac70f0Sopenharmony_ci/* old rate_ops for protocol version 0x010002 */ 164d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_v2_ops { 165d5ac70f0Sopenharmony_ci void (*close)(void *obj); 166d5ac70f0Sopenharmony_ci int (*init)(void *obj, snd_pcm_rate_info_t *info); 167d5ac70f0Sopenharmony_ci void (*free)(void *obj); 168d5ac70f0Sopenharmony_ci void (*reset)(void *obj); 169d5ac70f0Sopenharmony_ci int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info); 170d5ac70f0Sopenharmony_ci void (*convert)(void *obj, 171d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *dst_areas, 172d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, unsigned int dst_frames, 173d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 174d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, unsigned int src_frames); 175d5ac70f0Sopenharmony_ci void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames, 176d5ac70f0Sopenharmony_ci const int16_t *src, unsigned int src_frames); 177d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames); 178d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames); 179d5ac70f0Sopenharmony_ci unsigned int version; 180d5ac70f0Sopenharmony_ci int (*get_supported_rates)(void *obj, unsigned int *rate_min, 181d5ac70f0Sopenharmony_ci unsigned int *rate_max); 182d5ac70f0Sopenharmony_ci void (*dump)(void *obj, snd_output_t *out); 183d5ac70f0Sopenharmony_ci} snd_pcm_rate_v2_ops_t; 184d5ac70f0Sopenharmony_ci#endif 185d5ac70f0Sopenharmony_ci 186d5ac70f0Sopenharmony_ci#ifdef __cplusplus 187d5ac70f0Sopenharmony_ci} 188d5ac70f0Sopenharmony_ci#endif 189d5ac70f0Sopenharmony_ci 190d5ac70f0Sopenharmony_ci#endif /* __ALSA_PCM_RATE_H */ 191