154 lines
4.4 KiB
C++
154 lines
4.4 KiB
C++
/**
|
|
* \file include/pcm_rate.h
|
|
* \brief External Rate-Converter-Plugin SDK
|
|
* \author Takashi Iwai <tiwai@suse.de>
|
|
* \date 2006
|
|
*
|
|
* External Rate-Converter-Plugin SDK
|
|
*/
|
|
|
|
/*
|
|
* ALSA external PCM rate-converter plugin SDK (draft version)
|
|
*
|
|
* Copyright (c) 2006 Takashi Iwai <tiwai@suse.de>
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef __ALSA_PCM_RATE_H
|
|
#define __ALSA_PCM_RATE_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* Protocol version
|
|
*/
|
|
#define SND_PCM_RATE_PLUGIN_VERSION 0x010002
|
|
|
|
/** hw_params information for a single side */
|
|
typedef struct snd_pcm_rate_side_info {
|
|
snd_pcm_format_t format;
|
|
unsigned int rate;
|
|
snd_pcm_uframes_t buffer_size;
|
|
snd_pcm_uframes_t period_size;
|
|
} snd_pcm_rate_side_info_t;
|
|
|
|
/** hw_params information */
|
|
typedef struct snd_pcm_rate_info {
|
|
struct snd_pcm_rate_side_info in;
|
|
struct snd_pcm_rate_side_info out;
|
|
unsigned int channels;
|
|
} snd_pcm_rate_info_t;
|
|
|
|
/** Callback table of rate-converter */
|
|
typedef struct snd_pcm_rate_ops {
|
|
/**
|
|
* close the converter; optional
|
|
*/
|
|
void (*close)(void *obj);
|
|
/**
|
|
* initialize the converter, called at hw_params
|
|
*/
|
|
int (*init)(void *obj, snd_pcm_rate_info_t *info);
|
|
/**
|
|
* free the converter; optional
|
|
*/
|
|
void (*free)(void *obj);
|
|
/**
|
|
* reset the converter, called at prepare; optional
|
|
*/
|
|
void (*reset)(void *obj);
|
|
/**
|
|
* adjust the pitch, called at sw_params; optional
|
|
*/
|
|
int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info);
|
|
/**
|
|
* convert the data
|
|
*/
|
|
void (*convert)(void *obj,
|
|
const snd_pcm_channel_area_t *dst_areas,
|
|
snd_pcm_uframes_t dst_offset, unsigned int dst_frames,
|
|
const snd_pcm_channel_area_t *src_areas,
|
|
snd_pcm_uframes_t src_offset, unsigned int src_frames);
|
|
/**
|
|
* convert an s16 interleaved-data array; exclusive with convert
|
|
*/
|
|
void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames,
|
|
const int16_t *src, unsigned int src_frames);
|
|
/**
|
|
* compute the frame size for input
|
|
*/
|
|
snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames);
|
|
/**
|
|
* compute the frame size for output
|
|
*/
|
|
snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames);
|
|
/**
|
|
* the protocol version the plugin supports;
|
|
* new field since version 0x010002
|
|
*/
|
|
unsigned int version;
|
|
/**
|
|
* return the supported min / max sample rates;
|
|
* new ops since version 0x010002
|
|
*/
|
|
int (*get_supported_rates)(void *obj, unsigned int *rate_min,
|
|
unsigned int *rate_max);
|
|
/**
|
|
* show some status messages for verbose mode;
|
|
* new ops since version 0x010002
|
|
*/
|
|
void (*dump)(void *obj, snd_output_t *out);
|
|
} snd_pcm_rate_ops_t;
|
|
|
|
/** open function type */
|
|
typedef int (*snd_pcm_rate_open_func_t)(unsigned int version, void **objp,
|
|
snd_pcm_rate_ops_t *opsp);
|
|
|
|
/**
|
|
* Define the object entry for external PCM rate-converter plugins
|
|
*/
|
|
#define SND_PCM_RATE_PLUGIN_ENTRY(name) _snd_pcm_rate_##name##_open
|
|
|
|
|
|
#ifndef DOC_HIDDEN
|
|
/* old rate_ops for protocol version 0x010001 */
|
|
typedef struct snd_pcm_rate_old_ops {
|
|
void (*close)(void *obj);
|
|
int (*init)(void *obj, snd_pcm_rate_info_t *info);
|
|
void (*free)(void *obj);
|
|
void (*reset)(void *obj);
|
|
int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info);
|
|
void (*convert)(void *obj,
|
|
const snd_pcm_channel_area_t *dst_areas,
|
|
snd_pcm_uframes_t dst_offset, unsigned int dst_frames,
|
|
const snd_pcm_channel_area_t *src_areas,
|
|
snd_pcm_uframes_t src_offset, unsigned int src_frames);
|
|
void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames,
|
|
const int16_t *src, unsigned int src_frames);
|
|
snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames);
|
|
snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames);
|
|
} snd_pcm_rate_old_ops_t;
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __ALSA_PCM_RATE_H */
|