• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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