eas_pcmdata.h revision 7df30109963092559d3760c0661a020f9daf1030
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*/
52typedef 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
61typedef 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
71typedef 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*/
132typedef 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*/
154EAS_RESULT EAS_PESeek (EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 *pLocation);
155
156#endif /* _EAS_PCMDATA_H */
157
158