1 /* libSoX ima_rw.h -- codex utilities for WAV_FORMAT_IMA_ADPCM 2 * Copyright (C) 1999 Stanley J. Brooks <stabro@megsinet.net> 3 * 4 * This library is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU Lesser General Public License as published by 6 * the Free Software Foundation; either version 2.1 of the License, or (at 7 * your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public License 15 * along with this library; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 18 */ 19 20 #include "sox.h" 21 22 #ifndef SAMPL 23 #define SAMPL short 24 #endif 25 26 /* 27 * call lsx_ima_init_table() before any other Ima* functions, 28 * to create the fast lookup tables 29 */ 30 extern void lsx_ima_init_table(void); 31 32 /* lsx_ima_block_expand_i() outputs interleaved samples into one output buffer */ 33 extern void lsx_ima_block_expand_i( 34 unsigned chans, /* total channels */ 35 const unsigned char *ibuff,/* input buffer[blockAlign] */ 36 SAMPL *obuff, /* output samples, n*chans */ 37 int n /* samples to decode PER channel, REQUIRE n % 8 == 1 */ 38 ); 39 40 /* lsx_ima_block_expand_m() outputs non-interleaved samples into chan separate output buffers */ 41 extern void lsx_ima_block_expand_m( 42 unsigned chans, /* total channels */ 43 const unsigned char *ibuff,/* input buffer[blockAlign] */ 44 SAMPL **obuffs, /* chan output sample buffers, each takes n samples */ 45 int n /* samples to decode PER channel, REQUIRE n % 8 == 1 */ 46 ); 47 48 /* mash one block. if you want to use opt>0, 9 is a reasonable value */ 49 extern void lsx_ima_block_mash_i( 50 unsigned chans, /* total channels */ 51 const SAMPL *ip, /* ip[] is interleaved input samples */ 52 int n, /* samples to encode PER channel, REQUIRE n % 8 == 1 */ 53 int *st, /* input/output state[chans], REQUIRE 0 <= st[ch] <= ISSTMAX */ 54 unsigned char *obuff, /* output buffer[blockAlign] */ 55 int opt /* non-zero allows some cpu-intensive code to improve output */ 56 ); 57 58 /* Some helper functions for computing samples/block and blockalign */ 59 60 /* 61 * lsx_ima_samples_in(dataLen, chans, blockAlign, samplesPerBlock) 62 * returns the number of samples/channel which would go 63 * in the dataLen, given the other parameters ... 64 * if input samplesPerBlock is 0, then returns the max 65 * samplesPerBlock which would go into a block of size blockAlign 66 * Yes, it is confusing usage. 67 */ 68 extern size_t lsx_ima_samples_in( 69 size_t dataLen, 70 size_t chans, 71 size_t blockAlign, 72 size_t samplesPerBlock 73 ); 74 75 /* 76 * size_t lsx_ima_bytes_per_block(chans, samplesPerBlock) 77 * return minimum blocksize which would be required 78 * to encode number of chans with given samplesPerBlock 79 */ 80 extern size_t lsx_ima_bytes_per_block( 81 size_t chans, 82 size_t samplesPerBlock 83 ); 84 85