You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
7.5 KiB
158 lines
7.5 KiB
4 months ago
|
/*----------------------------------------------------------------------------
|
||
|
*
|
||
|
* File:
|
||
|
* eas_pcmdata.h
|
||
|
*
|
||
|
* Contents and purpose:
|
||
|
* Data declarations for the PCM engine
|
||
|
*
|
||
|
*
|
||
|
* Copyright Sonic Network Inc. 2005
|
||
|
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
*----------------------------------------------------------------------------
|
||
|
* Revision Control:
|
||
|
* $Revision: 847 $
|
||
|
* $Date: 2007-08-27 21:30:08 -0700 (Mon, 27 Aug 2007) $
|
||
|
*----------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#ifndef _EAS_PCMDATA_H
|
||
|
#define _EAS_PCMDATA_H
|
||
|
|
||
|
/* sets the maximum number of simultaneous PCM streams */
|
||
|
#ifndef MAX_PCM_STREAMS
|
||
|
#define MAX_PCM_STREAMS 16
|
||
|
#define PCM_STREAM_THRESHOLD (MAX_PCM_STREAMS - 4)
|
||
|
#endif
|
||
|
|
||
|
/* coefficents for high-pass filter in ADPCM */
|
||
|
#define INTEGRATOR_COEFFICIENT 100 /* coefficient for leaky integrator */
|
||
|
|
||
|
/* additional flags in S_PCM_STATE.flags used internal to module */
|
||
|
#define PCM_FLAGS_EMPTY 0x01000000 /* unsigned format */
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
* S_PCM_STATE
|
||
|
*
|
||
|
* Retains state information for PCM streams.
|
||
|
*----------------------------------------------------------------------------
|
||
|
*/
|
||
|
typedef struct s_decoder_state_tag
|
||
|
{
|
||
|
EAS_I32 output; /* last output for DC offset filter */
|
||
|
EAS_I32 acc; /* accumulator for DC offset filter */
|
||
|
EAS_I32 step; /* current ADPCM step size */
|
||
|
EAS_PCM x1; /* current generated sample */
|
||
|
EAS_PCM x0; /* previous generated sample */
|
||
|
} S_DECODER_STATE;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
PCM_ENV_START = 0,
|
||
|
PCM_ENV_ATTACK,
|
||
|
PCM_ENV_DECAY,
|
||
|
PCM_ENV_SUSTAIN,
|
||
|
PCM_ENV_RELEASE,
|
||
|
PCM_ENV_END
|
||
|
} E_PCM_ENV_STATE;
|
||
|
|
||
|
typedef struct s_pcm_state_tag
|
||
|
{
|
||
|
#ifdef _CHECKED_BUILD
|
||
|
EAS_U32 handleCheck; /* signature check for checked build */
|
||
|
#endif
|
||
|
EAS_FILE_HANDLE fileHandle; /* pointer to input file */
|
||
|
EAS_PCM_CALLBACK pCallback; /* pointer to callback function */
|
||
|
EAS_VOID_PTR cbInstData; /* instance data for callback function */
|
||
|
struct s_decoder_interface_tag EAS_CONST * pDecoder; /* pointer to decoder interface */
|
||
|
EAS_STATE state; /* stream state */
|
||
|
EAS_I32 time; /* media time */
|
||
|
EAS_I32 startPos; /* start of PCM stream */
|
||
|
EAS_I32 loopLocation; /* file location where loop starts */
|
||
|
EAS_I32 byteCount; /* size of file */
|
||
|
EAS_U32 loopStart; /* loop start, offset in samples from startPos */
|
||
|
/* NOTE: For CMF, we use this to store total sample size */
|
||
|
EAS_U32 loopSamples; /* total loop length, in samples, 0 means no loop */
|
||
|
/* NOTE: For CMF, non-zero means looped */
|
||
|
EAS_U32 samplesInLoop; /* samples left in the loop to play back */
|
||
|
EAS_I32 samplesTilLoop; /* samples left to play until top of loop */
|
||
|
EAS_I32 bytesLeft; /* count of bytes left in stream */
|
||
|
EAS_I32 bytesLeftLoop; /* count of bytes left in stream, value at start of loop */
|
||
|
EAS_U32 phase; /* current phase for interpolator */
|
||
|
EAS_U32 basefreq; /* frequency multiplier */
|
||
|
EAS_U32 flags; /* stream flags */
|
||
|
EAS_U32 envData; /* envelope data (and LFO data) */
|
||
|
EAS_U32 envValue; /* current envelope value */
|
||
|
EAS_U32 envScale; /* current envelope scale */
|
||
|
EAS_U32 startOrder; /* start order index, first is 0, next is 1, etc. */
|
||
|
S_DECODER_STATE decoderL; /* left (mono) ADPCM state */
|
||
|
S_DECODER_STATE decoderR; /* right ADPCM state */
|
||
|
S_DECODER_STATE decoderLLoop; /* left (mono) ADPCM state, value at start of loop */
|
||
|
S_DECODER_STATE decoderRLoop; /* right ADPCM state, value at start of loop */
|
||
|
E_PCM_ENV_STATE envState; /* current envelope state */
|
||
|
EAS_I16 volume; /* volume for stream */
|
||
|
EAS_I16 pitch; /* relative pitch in cents - zero is unity playback */
|
||
|
EAS_I16 gainLeft; /* requested gain */
|
||
|
EAS_I16 gainRight; /* requested gain */
|
||
|
EAS_I16 currentGainLeft; /* current gain for anti-zipper filter */
|
||
|
EAS_I16 currentGainRight; /* current gain for anti-zipper filter */
|
||
|
EAS_U16 blockSize; /* block size for ADPCM decoder */
|
||
|
EAS_U16 blockCount; /* block counter for ADPCM decoder */
|
||
|
EAS_U16 sampleRate; /* input sample rate */
|
||
|
EAS_U8 srcByte; /* source byte */
|
||
|
EAS_U8 msBitCount; /* count keeps track of MS bits */
|
||
|
EAS_U8 msBitMask; /* mask keeps track of MS bits */
|
||
|
EAS_U8 msBitValue; /* value keeps track of MS bits */
|
||
|
EAS_U8 msBitCountLoop; /* count keeps track of MS bits, value at loop start */
|
||
|
EAS_U8 msBitMaskLoop; /* mask keeps track of MS bits, value at loop start */
|
||
|
EAS_U8 msBitValueLoop; /* value keeps track of MS bits, value at loop start */
|
||
|
EAS_BOOL8 hiNibble; /* indicates high/low nibble is next */
|
||
|
EAS_BOOL8 hiNibbleLoop; /* indicates high/low nibble is next, value loop start */
|
||
|
EAS_U8 rateShift; /* for playback rate greater than 1.0 */
|
||
|
} S_PCM_STATE;
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
* S_DECODER_INTERFACE
|
||
|
*
|
||
|
* Generic interface for audio decoders
|
||
|
*----------------------------------------------------------------------------
|
||
|
*/
|
||
|
typedef struct s_decoder_interface_tag
|
||
|
{
|
||
|
EAS_RESULT (* EAS_CONST pfInit)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState);
|
||
|
EAS_RESULT (* EAS_CONST pfDecodeSample)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState);
|
||
|
EAS_RESULT (* EAS_CONST pfLocate)(EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 time);
|
||
|
} S_DECODER_INTERFACE;
|
||
|
|
||
|
|
||
|
/* header chunk for SMAF ADPCM */
|
||
|
#define TAG_YAMAHA_ADPCM 0x4d776100
|
||
|
#define TAG_MASK 0xffffff00
|
||
|
#define TAG_RIFF_FILE 0x52494646
|
||
|
#define TAG_WAVE_CHUNK 0x57415645
|
||
|
#define TAG_FMT_CHUNK 0x666d7420
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
* EAS_PESeek
|
||
|
*----------------------------------------------------------------------------
|
||
|
* Purpose:
|
||
|
* Locate to a particular byte in a PCM stream
|
||
|
*----------------------------------------------------------------------------
|
||
|
*/
|
||
|
EAS_RESULT EAS_PESeek (EAS_DATA_HANDLE pEASData, S_PCM_STATE *pState, EAS_I32 *pLocation);
|
||
|
|
||
|
#endif /* _EAS_PCMDATA_H */
|
||
|
|