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