1*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 2*f81fb7c4SAndroid Build Coastguard Worker * 3*f81fb7c4SAndroid Build Coastguard Worker * File: 4*f81fb7c4SAndroid Build Coastguard Worker * eas_pcmdata.h 5*f81fb7c4SAndroid Build Coastguard Worker * 6*f81fb7c4SAndroid Build Coastguard Worker * Contents and purpose: 7*f81fb7c4SAndroid Build Coastguard Worker * Data declarations for the PCM engine 8*f81fb7c4SAndroid Build Coastguard Worker * 9*f81fb7c4SAndroid Build Coastguard Worker * 10*f81fb7c4SAndroid Build Coastguard Worker * Copyright Sonic Network Inc. 2005 11*f81fb7c4SAndroid Build Coastguard Worker 12*f81fb7c4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 13*f81fb7c4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 14*f81fb7c4SAndroid Build Coastguard Worker * You may obtain a copy of the License at 15*f81fb7c4SAndroid Build Coastguard Worker * 16*f81fb7c4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 17*f81fb7c4SAndroid Build Coastguard Worker * 18*f81fb7c4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 19*f81fb7c4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 20*f81fb7c4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21*f81fb7c4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 22*f81fb7c4SAndroid Build Coastguard Worker * limitations under the License. 23*f81fb7c4SAndroid Build Coastguard Worker * 24*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 25*f81fb7c4SAndroid Build Coastguard Worker * Revision Control: 26*f81fb7c4SAndroid Build Coastguard Worker * $Revision: 847 $ 27*f81fb7c4SAndroid Build Coastguard Worker * $Date: 2007-08-27 21:30:08 -0700 (Mon, 27 Aug 2007) $ 28*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 29*f81fb7c4SAndroid Build Coastguard Worker */ 30*f81fb7c4SAndroid Build Coastguard Worker 31*f81fb7c4SAndroid Build Coastguard Worker #ifndef _EAS_PCMDATA_H 32*f81fb7c4SAndroid Build Coastguard Worker #define _EAS_PCMDATA_H 33*f81fb7c4SAndroid Build Coastguard Worker 34*f81fb7c4SAndroid Build Coastguard Worker /* sets the maximum number of simultaneous PCM streams */ 35*f81fb7c4SAndroid Build Coastguard Worker #ifndef MAX_PCM_STREAMS 36*f81fb7c4SAndroid Build Coastguard Worker #define MAX_PCM_STREAMS 16 37*f81fb7c4SAndroid Build Coastguard Worker #define PCM_STREAM_THRESHOLD (MAX_PCM_STREAMS - 4) 38*f81fb7c4SAndroid Build Coastguard Worker #endif 39*f81fb7c4SAndroid Build Coastguard Worker 40*f81fb7c4SAndroid Build Coastguard Worker /* coefficents for high-pass filter in ADPCM */ 41*f81fb7c4SAndroid Build Coastguard Worker #define INTEGRATOR_COEFFICIENT 100 /* coefficient for leaky integrator */ 42*f81fb7c4SAndroid Build Coastguard Worker 43*f81fb7c4SAndroid Build Coastguard Worker /* additional flags in S_PCM_STATE.flags used internal to module */ 44*f81fb7c4SAndroid Build Coastguard Worker #define PCM_FLAGS_EMPTY 0x01000000 /* unsigned format */ 45*f81fb7c4SAndroid Build Coastguard Worker 46*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 47*f81fb7c4SAndroid Build Coastguard Worker * S_PCM_STATE 48*f81fb7c4SAndroid Build Coastguard Worker * 49*f81fb7c4SAndroid Build Coastguard Worker * Retains state information for PCM streams. 50*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 51*f81fb7c4SAndroid Build Coastguard Worker */ 52*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_decoder_state_tag 53*f81fb7c4SAndroid Build Coastguard Worker { 54*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 output; /* last output for DC offset filter */ 55*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 acc; /* accumulator for DC offset filter */ 56*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 step; /* current ADPCM step size */ 57*f81fb7c4SAndroid Build Coastguard Worker EAS_PCM x1; /* current generated sample */ 58*f81fb7c4SAndroid Build Coastguard Worker EAS_PCM x0; /* previous generated sample */ 59*f81fb7c4SAndroid Build Coastguard Worker } S_DECODER_STATE; 60*f81fb7c4SAndroid Build Coastguard Worker 61*f81fb7c4SAndroid Build Coastguard Worker typedef enum 62*f81fb7c4SAndroid Build Coastguard Worker { 63*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_START = 0, 64*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_ATTACK, 65*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_DECAY, 66*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_SUSTAIN, 67*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_RELEASE, 68*f81fb7c4SAndroid Build Coastguard Worker PCM_ENV_END 69*f81fb7c4SAndroid Build Coastguard Worker } E_PCM_ENV_STATE; 70*f81fb7c4SAndroid Build Coastguard Worker 71*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_pcm_state_tag 72*f81fb7c4SAndroid Build Coastguard Worker { 73*f81fb7c4SAndroid Build Coastguard Worker #ifdef _CHECKED_BUILD 74*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 handleCheck; /* signature check for checked build */ 75*f81fb7c4SAndroid Build Coastguard Worker #endif 76*f81fb7c4SAndroid Build Coastguard Worker EAS_FILE_HANDLE fileHandle; /* pointer to input file */ 77*f81fb7c4SAndroid Build Coastguard Worker EAS_PCM_CALLBACK pCallback; /* pointer to callback function */ 78*f81fb7c4SAndroid Build Coastguard Worker EAS_VOID_PTR cbInstData; /* instance data for callback function */ 79*f81fb7c4SAndroid Build Coastguard Worker struct s_decoder_interface_tag EAS_CONST * pDecoder; /* pointer to decoder interface */ 80*f81fb7c4SAndroid Build Coastguard Worker EAS_STATE state; /* stream state */ 81*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 time; /* media time */ 82*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 startPos; /* start of PCM stream */ 83*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 loopLocation; /* file location where loop starts */ 84*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 byteCount; /* size of file */ 85*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopStart; /* loop start, offset in samples from startPos */ 86*f81fb7c4SAndroid Build Coastguard Worker /* NOTE: For CMF, we use this to store total sample size */ 87*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopSamples; /* total loop length, in samples, 0 means no loop */ 88*f81fb7c4SAndroid Build Coastguard Worker /* NOTE: For CMF, non-zero means looped */ 89*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 samplesInLoop; /* samples left in the loop to play back */ 90*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 samplesTilLoop; /* samples left to play until top of loop */ 91*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 bytesLeft; /* count of bytes left in stream */ 92*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 bytesLeftLoop; /* count of bytes left in stream, value at start of loop */ 93*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 phase; /* current phase for interpolator */ 94*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 basefreq; /* frequency multiplier */ 95*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 flags; /* stream flags */ 96*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 envData; /* envelope data (and LFO data) */ 97*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 envValue; /* current envelope value */ 98*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 envScale; /* current envelope scale */ 99*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 startOrder; /* start order index, first is 0, next is 1, etc. */ 100*f81fb7c4SAndroid Build Coastguard Worker S_DECODER_STATE decoderL; /* left (mono) ADPCM state */ 101*f81fb7c4SAndroid Build Coastguard Worker S_DECODER_STATE decoderR; /* right ADPCM state */ 102*f81fb7c4SAndroid Build Coastguard Worker S_DECODER_STATE decoderLLoop; /* left (mono) ADPCM state, value at start of loop */ 103*f81fb7c4SAndroid Build Coastguard Worker S_DECODER_STATE decoderRLoop; /* right ADPCM state, value at start of loop */ 104*f81fb7c4SAndroid Build Coastguard Worker E_PCM_ENV_STATE envState; /* current envelope state */ 105*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 volume; /* volume for stream */ 106*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 pitch; /* relative pitch in cents - zero is unity playback */ 107*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 gainLeft; /* requested gain */ 108*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 gainRight; /* requested gain */ 109*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 currentGainLeft; /* current gain for anti-zipper filter */ 110*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 currentGainRight; /* current gain for anti-zipper filter */ 111*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 blockSize; /* block size for ADPCM decoder */ 112*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 blockCount; /* block counter for ADPCM decoder */ 113*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 sampleRate; /* input sample rate */ 114*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 srcByte; /* source byte */ 115*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitCount; /* count keeps track of MS bits */ 116*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitMask; /* mask keeps track of MS bits */ 117*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitValue; /* value keeps track of MS bits */ 118*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitCountLoop; /* count keeps track of MS bits, value at loop start */ 119*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitMaskLoop; /* mask keeps track of MS bits, value at loop start */ 120*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 msBitValueLoop; /* value keeps track of MS bits, value at loop start */ 121*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL8 hiNibble; /* indicates high/low nibble is next */ 122*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL8 hiNibbleLoop; /* indicates high/low nibble is next, value loop start */ 123*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 rateShift; /* for playback rate greater than 1.0 */ 124*f81fb7c4SAndroid Build Coastguard Worker } S_PCM_STATE; 125*f81fb7c4SAndroid Build Coastguard Worker 126*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 127*f81fb7c4SAndroid Build Coastguard Worker * S_DECODER_INTERFACE 128*f81fb7c4SAndroid Build Coastguard Worker * 129*f81fb7c4SAndroid Build Coastguard Worker * Generic interface for audio decoders 130*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 131*f81fb7c4SAndroid Build Coastguard Worker */ 132*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_decoder_interface_tag 133*f81fb7c4SAndroid Build Coastguard Worker { 134*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT (* EAS_CONST pfInit)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState); 135*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT (* EAS_CONST pfDecodeSample)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState); 136*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT (* EAS_CONST pfLocate)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 time); 137*f81fb7c4SAndroid Build Coastguard Worker } S_DECODER_INTERFACE; 138*f81fb7c4SAndroid Build Coastguard Worker 139*f81fb7c4SAndroid Build Coastguard Worker 140*f81fb7c4SAndroid Build Coastguard Worker /* header chunk for SMAF ADPCM */ 141*f81fb7c4SAndroid Build Coastguard Worker #define TAG_YAMAHA_ADPCM 0x4d776100 142*f81fb7c4SAndroid Build Coastguard Worker #define TAG_MASK 0xffffff00 143*f81fb7c4SAndroid Build Coastguard Worker #define TAG_RIFF_FILE 0x52494646 144*f81fb7c4SAndroid Build Coastguard Worker #define TAG_WAVE_CHUNK 0x57415645 145*f81fb7c4SAndroid Build Coastguard Worker #define TAG_FMT_CHUNK 0x666d7420 146*f81fb7c4SAndroid Build Coastguard Worker 147*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 148*f81fb7c4SAndroid Build Coastguard Worker * EAS_PESeek 149*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 150*f81fb7c4SAndroid Build Coastguard Worker * Purpose: 151*f81fb7c4SAndroid Build Coastguard Worker * Locate to a particular byte in a PCM stream 152*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 153*f81fb7c4SAndroid Build Coastguard Worker */ 154*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_PESeek (EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 *pLocation); 155*f81fb7c4SAndroid Build Coastguard Worker 156*f81fb7c4SAndroid Build Coastguard Worker #endif /* _EAS_PCMDATA_H */ 157*f81fb7c4SAndroid Build Coastguard Worker 158