/* * PCM - Common plugin code * Copyright (c) 2000 by Abramo Bagnara * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library 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 Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ typedef struct { snd_pcm_t *slave; int close_slave; snd_pcm_xfer_areas_func_t read; snd_pcm_xfer_areas_func_t write; snd_pcm_sframes_t (*client_frames)(snd_pcm_t *pcm, snd_pcm_sframes_t frames); snd_pcm_sframes_t (*slave_frames)(snd_pcm_t *pcm, snd_pcm_sframes_t frames); int (*init)(snd_pcm_t *pcm); int shmid; snd_pcm_uframes_t appl_ptr, hw_ptr; } snd_pcm_plugin_t; int snd_pcm_plugin_close(snd_pcm_t *pcm); int snd_pcm_plugin_card(snd_pcm_t *pcm); int snd_pcm_plugin_nonblock(snd_pcm_t *pcm, int nonblock); int snd_pcm_plugin_async(snd_pcm_t *pcm, int sig, pid_t pid); int snd_pcm_plugin_info(snd_pcm_t *pcm, snd_pcm_info_t * info); int snd_pcm_plugin_hw_free(snd_pcm_t *pcm); int snd_pcm_plugin_sw_refine(snd_pcm_t *pcm, snd_pcm_sw_params_t *params); int snd_pcm_plugin_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params); int snd_pcm_plugin_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t * info); int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status); snd_pcm_state_t snd_pcm_plugin_state(snd_pcm_t *pcm); int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp); int snd_pcm_plugin_prepare(snd_pcm_t *pcm); int snd_pcm_plugin_start(snd_pcm_t *pcm); int snd_pcm_plugin_drop(snd_pcm_t *pcm); int snd_pcm_plugin_drain(snd_pcm_t *pcm); int snd_pcm_plugin_pause(snd_pcm_t *pcm, int enable); snd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames); snd_pcm_sframes_t snd_pcm_plugin_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size); snd_pcm_sframes_t snd_pcm_plugin_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); snd_pcm_sframes_t snd_pcm_plugin_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size); snd_pcm_sframes_t snd_pcm_plugin_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); snd_pcm_sframes_t snd_pcm_plugin_mmap_forward(snd_pcm_t *pcm, snd_pcm_uframes_t size); snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm); int snd_pcm_plugin_mmap_status(snd_pcm_t *pcm); int snd_pcm_plugin_mmap_control(snd_pcm_t *pcm); int snd_pcm_plugin_mmap(snd_pcm_t *pcm); int snd_pcm_plugin_munmap_status(snd_pcm_t *pcm); int snd_pcm_plugin_munmap_control(snd_pcm_t *pcm); int snd_pcm_plugin_munmap(snd_pcm_t *pcm); int snd_pcm_plugin_poll_descriptor(snd_pcm_t *pcm); int snd_pcm_plugin_hw_params_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); int snd_pcm_plugin_hw_refine_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); #define SND_PCM_FMTBIT_LINEAR \ ((1 << (unsigned long) SND_PCM_FORMAT_S8) | \ (1 << (unsigned long) SND_PCM_FORMAT_U8) | \ (1 << (unsigned long) SND_PCM_FORMAT_S16_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_S16_BE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U16_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U16_BE) | \ (1 << (unsigned long) SND_PCM_FORMAT_S24_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_S24_BE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U24_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U24_BE) | \ (1 << (unsigned long) SND_PCM_FORMAT_S32_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_S32_BE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U32_LE) | \ (1 << (unsigned long) SND_PCM_FORMAT_U32_BE)) extern snd_pcm_fast_ops_t snd_pcm_plugin_fast_ops; #define RATE_MIN 4000 #define RATE_MAX 192000 #define ROUTE_PLUGIN_FLOAT 1 #define ROUTE_PLUGIN_RESOLUTION 16 #if ROUTE_PLUGIN_FLOAT typedef float snd_pcm_route_ttable_entry_t; #define HALF 0.5 #define FULL 1.0 #else typedef int snd_pcm_route_ttable_entry_t; #define HALF (ROUTE_PLUGIN_RESOLUTION / 2) #define FULL ROUTE_PLUGIN_RESOLUTION #endif int snd_pcm_linear_get_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); int snd_pcm_linear_put_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); int snd_pcm_linear_convert_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); int snd_pcm_copy_open(snd_pcm_t **pcmp, char *name, snd_pcm_t *slave, int close_slave); int snd_pcm_linear_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave); int snd_pcm_mulaw_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave); int snd_pcm_alaw_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave); int snd_pcm_adpcm_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave); int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *ttable, unsigned int tt_csize, unsigned int tt_ssize, unsigned int *tt_cused, unsigned int *tt_sused, int schannels); int snd_pcm_route_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, unsigned int schannels, snd_pcm_route_ttable_entry_t *ttable, unsigned int tt_ssize, unsigned int tt_cused, unsigned int tt_sused, snd_pcm_t *slave, int close_slave); int snd_pcm_rate_open(snd_pcm_t **pcmp, char *name, snd_pcm_format_t sformat, int srate, snd_pcm_t *slave, int close_slave); #define SND_PCM_ACCBIT_PLUGIN ((1 << (unsigned long) SND_PCM_ACCESS_MMAP_INTERLEAVED) | \ (1 << (unsigned long) SND_PCM_ACCESS_RW_INTERLEAVED) | \ (1 << (unsigned long) SND_PCM_ACCESS_MMAP_NONINTERLEAVED) | \ (1 << (unsigned long) SND_PCM_ACCESS_RW_NONINTERLEAVED)) void snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int convidx); void snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int putidx); void snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int getidx); void snd_pcm_mulaw_decode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int putidx); void snd_pcm_mulaw_encode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int getidx); typedef struct _snd_pcm_adpcm_state { int pred_val; /* Calculated predicted value */ int step_idx; /* Previous StepSize lookup index */ } snd_pcm_adpcm_state_t; void snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int putidx, snd_pcm_adpcm_state_t *states); void snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, int getidx, snd_pcm_adpcm_state_t *states);