156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_pcmdata.h
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Data declarations for the PCM engine
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2005
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control:
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Revision: 847 $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-08-27 21:30:08 -0700 (Mon, 27 Aug 2007) $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef _EAS_PCMDATA_H
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define _EAS_PCMDATA_H
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* sets the maximum number of simultaneous PCM streams */
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef MAX_PCM_STREAMS
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MAX_PCM_STREAMS             16
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define PCM_STREAM_THRESHOLD        (MAX_PCM_STREAMS - 4)
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* coefficents for high-pass filter in ADPCM */
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define INTEGRATOR_COEFFICIENT      100     /* coefficient for leaky integrator */
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* additional flags in S_PCM_STATE.flags used internal to module */
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define PCM_FLAGS_EMPTY             0x01000000  /* unsigned format */
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * S_PCM_STATE
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Retains state information for PCM streams.
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct s_decoder_state_tag
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             output;             /* last output for DC offset filter */
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             acc;                /* accumulator for DC offset filter */
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             step;               /* current ADPCM step size */
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM             x1;                 /* current generated sample */
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM             x0;                 /* previous generated sample */
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} S_DECODER_STATE;
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef enum
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_START = 0,
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_ATTACK,
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_DECAY,
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_SUSTAIN,
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_RELEASE,
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    PCM_ENV_END
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} E_PCM_ENV_STATE;
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct s_pcm_state_tag
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _CHECKED_BUILD
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             handleCheck;        /* signature check for checked build */
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_FILE_HANDLE     fileHandle;         /* pointer to input file */
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM_CALLBACK    pCallback;          /* pointer to callback function */
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_VOID_PTR        cbInstData;         /* instance data for callback function */
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    struct s_decoder_interface_tag EAS_CONST * pDecoder;    /* pointer to decoder interface */
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_STATE           state;              /* stream state */
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             time;               /* media time */
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             startPos;           /* start of PCM stream */
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             loopLocation;       /* file location where loop starts */
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             byteCount;          /* size of file */
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             loopStart;          /* loop start, offset in samples from startPos */
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                            /* NOTE: For CMF, we use this to store total sample size */
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             loopSamples;        /* total loop length, in samples, 0 means no loop */
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                            /* NOTE: For CMF, non-zero means looped */
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             samplesInLoop;      /* samples left in the loop to play back */
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             samplesTilLoop;     /* samples left to play until top of loop */
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             bytesLeft;          /* count of bytes left in stream */
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32             bytesLeftLoop;      /* count of bytes left in stream, value at start of loop */
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             phase;              /* current phase for interpolator */
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             basefreq;           /* frequency multiplier */
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             flags;              /* stream flags */
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             envData;            /* envelope data (and LFO data) */
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             envValue;           /* current envelope value */
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             envScale;           /* current envelope scale */
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32             startOrder;         /* start order index, first is 0, next is 1, etc. */
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DECODER_STATE     decoderL;           /* left (mono) ADPCM state */
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DECODER_STATE     decoderR;           /* right ADPCM state */
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DECODER_STATE     decoderLLoop;       /* left (mono) ADPCM state, value at start of loop */
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_DECODER_STATE     decoderRLoop;       /* right ADPCM state, value at start of loop */
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    E_PCM_ENV_STATE     envState;           /* current envelope state */
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             volume;             /* volume for stream */
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             pitch;              /* relative pitch in cents - zero is unity playback */
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             gainLeft;           /* requested gain */
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             gainRight;          /* requested gain */
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             currentGainLeft;    /* current gain for anti-zipper filter */
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16             currentGainRight;   /* current gain for anti-zipper filter */
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16             blockSize;          /* block size for ADPCM decoder */
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16             blockCount;         /* block counter for ADPCM decoder */
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16             sampleRate;         /* input sample rate */
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              srcByte;            /* source byte */
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitCount;         /* count keeps track of MS bits */
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitMask;          /* mask keeps track of MS bits */
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitValue;         /* value keeps track of MS bits */
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitCountLoop;     /* count keeps track of MS bits, value at loop start */
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitMaskLoop;      /* mask keeps track of MS bits, value at loop start */
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              msBitValueLoop;     /* value keeps track of MS bits, value at loop start */
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL8           hiNibble;           /* indicates high/low nibble is next */
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_BOOL8           hiNibbleLoop;       /* indicates high/low nibble is next, value loop start */
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U8              rateShift;          /* for playback rate greater than 1.0 */
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} S_PCM_STATE;
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * S_DECODER_INTERFACE
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Generic interface for audio decoders
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkstypedef struct s_decoder_interface_tag
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT (* EAS_CONST pfInit)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState);
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT (* EAS_CONST pfDecodeSample)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState);
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_RESULT (* EAS_CONST pfLocate)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 time);
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} S_DECODER_INTERFACE;
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* header chunk for SMAF ADPCM */
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TAG_YAMAHA_ADPCM    0x4d776100
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TAG_MASK            0xffffff00
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TAG_RIFF_FILE       0x52494646
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TAG_WAVE_CHUNK      0x57415645
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define TAG_FMT_CHUNK       0x666d7420
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_PESeek
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Locate to a particular byte in a PCM stream
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_PESeek (EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 *pLocation);
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif /* _EAS_PCMDATA_H */
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
158