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