1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * PCM - Common plugin code 3d5ac70f0Sopenharmony_ci * Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> 4d5ac70f0Sopenharmony_ci * 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 7d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 8d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 9d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 10d5ac70f0Sopenharmony_ci * 11d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 12d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 15d5ac70f0Sopenharmony_ci * 16d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 18d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19d5ac70f0Sopenharmony_ci * 20d5ac70f0Sopenharmony_ci */ 21d5ac70f0Sopenharmony_ci 22d5ac70f0Sopenharmony_ci#include "pcm_generic.h" 23d5ac70f0Sopenharmony_ci 24d5ac70f0Sopenharmony_citypedef snd_pcm_uframes_t (*snd_pcm_slave_xfer_areas_func_t) 25d5ac70f0Sopenharmony_ci (snd_pcm_t *pcm, 26d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *areas, 27d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, 28d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size, 29d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *slave_areas, 30d5ac70f0Sopenharmony_ci snd_pcm_uframes_t slave_offset, 31d5ac70f0Sopenharmony_ci snd_pcm_uframes_t *slave_sizep); 32d5ac70f0Sopenharmony_ci 33d5ac70f0Sopenharmony_citypedef snd_pcm_sframes_t (*snd_pcm_slave_xfer_areas_undo_func_t) 34d5ac70f0Sopenharmony_ci (snd_pcm_t *pcm, 35d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *res_areas, /* result areas */ 36d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_offset, /* offset of result areas */ 37d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_size, /* size of result areas */ 38d5ac70f0Sopenharmony_ci snd_pcm_uframes_t slave_undo_size); 39d5ac70f0Sopenharmony_ci 40d5ac70f0Sopenharmony_citypedef struct { 41d5ac70f0Sopenharmony_ci snd_pcm_generic_t gen; 42d5ac70f0Sopenharmony_ci snd_pcm_slave_xfer_areas_func_t read; 43d5ac70f0Sopenharmony_ci snd_pcm_slave_xfer_areas_func_t write; 44d5ac70f0Sopenharmony_ci snd_pcm_slave_xfer_areas_undo_func_t undo_read; 45d5ac70f0Sopenharmony_ci snd_pcm_slave_xfer_areas_undo_func_t undo_write; 46d5ac70f0Sopenharmony_ci int (*init)(snd_pcm_t *pcm); 47d5ac70f0Sopenharmony_ci snd_pcm_uframes_t appl_ptr, hw_ptr; 48d5ac70f0Sopenharmony_ci} snd_pcm_plugin_t; 49d5ac70f0Sopenharmony_ci 50d5ac70f0Sopenharmony_ci/* make local functions really local */ 51d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_init \ 52d5ac70f0Sopenharmony_ci snd1_pcm_plugin_init 53d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_may_wait_for_avail_min_conv \ 54d5ac70f0Sopenharmony_ci snd1_pcm_plugin_may_wait_for_avail_min_conv 55d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_may_wait_for_avail_min \ 56d5ac70f0Sopenharmony_ci snd1_pcm_plugin_may_wait_for_avail_min 57d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_fast_ops \ 58d5ac70f0Sopenharmony_ci snd1_pcm_plugin_fast_ops 59d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_undo_read_generic \ 60d5ac70f0Sopenharmony_ci snd1_pcm_plugin_undo_read_generic 61d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_undo_write_generic \ 62d5ac70f0Sopenharmony_ci snd1_pcm_plugin_undo_write_generic 63d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_rewind \ 64d5ac70f0Sopenharmony_ci snd1_pcm_plugin_rewind 65d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_forward \ 66d5ac70f0Sopenharmony_ci snd1_pcm_plugin_forward 67d5ac70f0Sopenharmony_ci 68d5ac70f0Sopenharmony_civoid snd_pcm_plugin_init(snd_pcm_plugin_t *plugin); 69d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 70d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 71d5ac70f0Sopenharmony_ciint snd_pcm_plugin_may_wait_for_avail_min_conv(snd_pcm_t *pcm, snd_pcm_uframes_t avail, 72d5ac70f0Sopenharmony_ci snd_pcm_uframes_t (*conv)(snd_pcm_t *, snd_pcm_uframes_t)); 73d5ac70f0Sopenharmony_ciint snd_pcm_plugin_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail); 74d5ac70f0Sopenharmony_ci 75d5ac70f0Sopenharmony_ciextern const snd_pcm_fast_ops_t snd_pcm_plugin_fast_ops; 76d5ac70f0Sopenharmony_ci 77d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_undo_read_generic 78d5ac70f0Sopenharmony_ci (snd_pcm_t *pcm, 79d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *res_areas, /* result areas */ 80d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_offset, /* offset of result areas */ 81d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_size, /* size of result areas */ 82d5ac70f0Sopenharmony_ci snd_pcm_uframes_t slave_undo_size); 83d5ac70f0Sopenharmony_ci 84d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_undo_write_generic 85d5ac70f0Sopenharmony_ci (snd_pcm_t *pcm, 86d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *res_areas, /* result areas */ 87d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_offset, /* offset of result areas */ 88d5ac70f0Sopenharmony_ci snd_pcm_uframes_t res_size, /* size of result areas */ 89d5ac70f0Sopenharmony_ci snd_pcm_uframes_t slave_undo_size); 90d5ac70f0Sopenharmony_ci 91d5ac70f0Sopenharmony_ci/* make local functions really local */ 92d5ac70f0Sopenharmony_ci#define snd_pcm_linear_get_index snd1_pcm_linear_get_index 93d5ac70f0Sopenharmony_ci#define snd_pcm_linear_put_index snd1_pcm_linear_put_index 94d5ac70f0Sopenharmony_ci#define snd_pcm_linear_convert_index snd1_pcm_linear_convert_index 95d5ac70f0Sopenharmony_ci#define snd_pcm_linear_convert snd1_pcm_linear_convert 96d5ac70f0Sopenharmony_ci#define snd_pcm_linear_getput snd1_pcm_linear_getput 97d5ac70f0Sopenharmony_ci#define snd_pcm_alaw_decode snd1_pcm_alaw_decode 98d5ac70f0Sopenharmony_ci#define snd_pcm_alaw_encode snd1_pcm_alaw_encode 99d5ac70f0Sopenharmony_ci#define snd_pcm_mulaw_decode snd1_pcm_mulaw_decode 100d5ac70f0Sopenharmony_ci#define snd_pcm_mulaw_encode snd1_pcm_mulaw_encode 101d5ac70f0Sopenharmony_ci#define snd_pcm_adpcm_decode snd1_pcm_adpcm_decode 102d5ac70f0Sopenharmony_ci#define snd_pcm_adpcm_encode snd1_pcm_adpcm_encode 103d5ac70f0Sopenharmony_ci 104d5ac70f0Sopenharmony_ciint snd_pcm_linear_get_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); 105d5ac70f0Sopenharmony_ciint snd_pcm_linear_put_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); 106d5ac70f0Sopenharmony_ciint snd_pcm_linear_convert_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); 107d5ac70f0Sopenharmony_ci 108d5ac70f0Sopenharmony_civoid snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, 109d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, 110d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 111d5ac70f0Sopenharmony_ci unsigned int convidx); 112d5ac70f0Sopenharmony_civoid snd_pcm_linear_getput(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, 113d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, 114d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 115d5ac70f0Sopenharmony_ci unsigned int get_idx, unsigned int put_idx); 116d5ac70f0Sopenharmony_civoid snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, 117d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 118d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 119d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 120d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 121d5ac70f0Sopenharmony_ci unsigned int putidx); 122d5ac70f0Sopenharmony_civoid snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas, 123d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 124d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 125d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 126d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 127d5ac70f0Sopenharmony_ci unsigned int getidx); 128d5ac70f0Sopenharmony_civoid snd_pcm_mulaw_decode(const snd_pcm_channel_area_t *dst_areas, 129d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 130d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 131d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 132d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 133d5ac70f0Sopenharmony_ci unsigned int putidx); 134d5ac70f0Sopenharmony_civoid snd_pcm_mulaw_encode(const snd_pcm_channel_area_t *dst_areas, 135d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 136d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 137d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 138d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 139d5ac70f0Sopenharmony_ci unsigned int getidx); 140d5ac70f0Sopenharmony_ci 141d5ac70f0Sopenharmony_citypedef struct _snd_pcm_adpcm_state { 142d5ac70f0Sopenharmony_ci int pred_val; /* Calculated predicted value */ 143d5ac70f0Sopenharmony_ci int step_idx; /* Previous StepSize lookup index */ 144d5ac70f0Sopenharmony_ci} snd_pcm_adpcm_state_t; 145d5ac70f0Sopenharmony_ci 146d5ac70f0Sopenharmony_civoid snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, 147d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 148d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 149d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 150d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 151d5ac70f0Sopenharmony_ci unsigned int putidx, 152d5ac70f0Sopenharmony_ci snd_pcm_adpcm_state_t *states); 153d5ac70f0Sopenharmony_civoid snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas, 154d5ac70f0Sopenharmony_ci snd_pcm_uframes_t dst_offset, 155d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *src_areas, 156d5ac70f0Sopenharmony_ci snd_pcm_uframes_t src_offset, 157d5ac70f0Sopenharmony_ci unsigned int channels, snd_pcm_uframes_t frames, 158d5ac70f0Sopenharmony_ci unsigned int getidx, 159d5ac70f0Sopenharmony_ci snd_pcm_adpcm_state_t *states); 160