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