oki_adpcm.h

Go to the documentation of this file.
00001 /*
00002  * SpanDSP - a series of DSP components for telephony
00003  *
00004  * oki_adpcm.h - Conversion routines between linear 16 bit PCM data and
00005  *                       OKI (Dialogic) ADPCM format.
00006  *
00007  * Written by Steve Underwood <steveu@coppice.org>
00008  *
00009  * Copyright (C) 2001 Steve Underwood
00010  *
00011  * Based on a bit from here, a bit from there, eye of toad,
00012  * ear of bat, etc - plus, of course, my own 2 cents.
00013  *
00014  * All rights reserved.
00015  *
00016  * This program is free software; you can redistribute it and/or modify
00017  * it under the terms of the GNU General Public License version 2, as
00018  * published by the Free Software Foundation.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00028  *
00029  * $Id: oki_adpcm.h,v 1.16 2007/04/08 08:16:18 steveu Exp $
00030  */
00031 
00032 /*! \file */
00033 
00034 #if !defined(_SPANDSP_OKI_ADPCM_H_)
00035 #define _SPANDSP_OKI_ADPCM_H_
00036 
00037 /*! \page okiadpcm_page OKI (Dialogic) ADPCM encoding and decoding
00038 \section okiadpcm_page_sec_1 What does it do?
00039 OKI ADPCM is widely used in the CTI industry because it is the principal format
00040 supported by Dialogic. As the market leader, they tend to define "common
00041 practice". It offers a good balance of simplicity and quality at rates of
00042 24kbps or 32kbps. 32kbps is obtained by ADPCM compressing 8k samples/second linear
00043 PCM. 24kbps is obtained by resampling to 6k samples/second and using the same ADPCM
00044 compression algorithm on the slower samples.
00045 
00046 The algorithms for this ADPCM codec can be found in "PC Telephony - The complete guide
00047 to designing, building and programming systems using Dialogic and Related Hardware"
00048 by Bob Edgar. pg 272-276. */
00049 
00050 /*!
00051     Oki (Dialogic) ADPCM conversion state descriptor. This defines the state of
00052     a single working instance of the Oki ADPCM converter. This is used for
00053     either linear to ADPCM or ADPCM to linear conversion.
00054 */
00055 typedef struct
00056 {
00057     int bit_rate;
00058     int16_t last;
00059     int16_t step_index;
00060     uint8_t oki_byte;
00061     int16_t history[32];
00062     int ptr;
00063     int mark;
00064     int phase;
00065 } oki_adpcm_state_t;
00066 
00067 #if defined(__cplusplus)
00068 extern "C"
00069 {
00070 #endif
00071 
00072 /*! Initialise an Oki ADPCM encode or decode context.
00073     \param s The Oki ADPCM context.
00074     \param bit_rate The required bit rate for the ADPCM data.
00075            The valid rates are 24000 and 32000.
00076     \return A pointer to the Oki ADPCM context, or NULL for error. */
00077 oki_adpcm_state_t *oki_adpcm_init(oki_adpcm_state_t *s, int bit_rate);
00078 
00079 /*! Free an Oki ADPCM encode or decode context.
00080     \param s The Oki ADPCM context.
00081     \return 0 for OK. */
00082 int oki_adpcm_release(oki_adpcm_state_t *s);
00083 
00084 /*! Decode a buffer of Oki ADPCM data to linear PCM.
00085     \param s The Oki ADPCM context.
00086     \param amp The audio sample buffer.
00087     \param oki_data
00088     \param oki_bytes
00089     \return The number of samples returned. */
00090 int oki_adpcm_decode(oki_adpcm_state_t *s,
00091                      int16_t amp[],
00092                      const uint8_t oki_data[],
00093                      int oki_bytes);
00094 
00095 /*! Encode a buffer of linear PCM data to Oki ADPCM.
00096     \param s The Oki ADPCM context.
00097     \param oki_data The Oki ADPCM data produced
00098     \param amp The audio sample buffer.
00099     \param len The number of samples in the buffer.
00100     \return The number of bytes of Oki ADPCM data produced. */
00101 int oki_adpcm_encode(oki_adpcm_state_t *s,
00102                      uint8_t oki_data[],
00103                      const int16_t amp[],
00104                      int len);
00105 
00106 #if defined(__cplusplus)
00107 }
00108 #endif
00109 
00110 #endif
00111 /*- End of file ------------------------------------------------------------*/

Generated on Tue Jul 24 11:29:28 2007 for libspandsp by  doxygen 1.5.2