eas_wavefile.c revision 7df30109963092559d3760c0661a020f9daf1030
17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
37df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * File:
47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * eas_wavefile.c
57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Contents and purpose:
77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This file implements the wave file parser.
87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
97df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Copyright Sonic Network Inc. 2005
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Revision Control:
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *   $Revision: 852 $
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *   $Date: 2007-09-04 11:43:49 -0700 (Tue, 04 Sep 2007) $
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_data.h"
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_report.h"
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_host.h"
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_config.h"
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_parser.h"
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_pcm.h"
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_wavefile.h"
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* lint is choking on the ARM math.h file, so we declare the log10 function here */
397df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern double log10(double x);
407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* increase gain to compensate for loss in mixer */
427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define WAVE_GAIN_OFFSET			6
437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* constant for 1200 / log10(2.0) */
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define PITCH_CENTS_CONVERSION		3986.313714
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WAVE file defines
497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* RIFF chunks */
527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define	CHUNK_TYPE(a,b,c,d)	(	\
537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		( ((EAS_U32)(a) & 0xFF) << 24 ) \
547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	+	( ((EAS_U32)(b) & 0xFF) << 16 ) \
557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	+	( ((EAS_U32)(c) & 0xFF) <<  8 ) \
567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	+	( ((EAS_U32)(d) & 0xFF)       ) )
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_RIFF					CHUNK_TYPE('R','I','F','F')
597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_WAVE					CHUNK_TYPE('W','A','V','E')
607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_FMT 					CHUNK_TYPE('f','m','t',' ')
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_DATA					CHUNK_TYPE('d','a','t','a')
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_LIST					CHUNK_TYPE('L','I','S','T')
637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_INFO					CHUNK_TYPE('I','N','F','O')
647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_INAM					CHUNK_TYPE('I','N','A','M')
657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_ICOP					CHUNK_TYPE('I','C','O','P')
667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define CHUNK_IART					CHUNK_TYPE('I','A','R','T')
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* wave file format identifiers */
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define WAVE_FORMAT_PCM				0x0001
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define WAVE_FORMAT_IMA_ADPCM		0x0011
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/* file size for streamed file */
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#define FILE_SIZE_STREAMING			0x80000000
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * prototypes
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveCheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *pHandle, EAS_I32 offset);
807df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WavePrepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveState (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState);
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveClose (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveReset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveLocate (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 time, EAS_BOOL *pParserLocate);
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WavePause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveResume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData);
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveSetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveGetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveParseHeader (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, S_WAVE_STATE *pWaveData);
907df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveGetMetaData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pMediaLength);
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef MMAPI_SUPPORT
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SaveFmtChunk (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, S_WAVE_STATE *pWaveData, EAS_I32 size);
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * EAS_Wave_Parser
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This structure contains the functional interface for the Wave file parser
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectconst S_FILE_PARSER_INTERFACE EAS_Wave_Parser =
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveCheckFileType,
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WavePrepare,
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	NULL,
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	NULL,
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveState,
1107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveClose,
1117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveReset,
1127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WavePause,
1137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveResume,
1147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveLocate,
1157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveSetData,
1167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveGetData,
1177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	WaveGetMetaData
1187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project};
1197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
1217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveCheckFileType()
1227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
1237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
1247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Check the file type to see if we can parse it
1257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
1277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
1287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
1297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
1317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
1347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
1367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1377df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveCheckFileType (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, EAS_VOID_PTR *pHandle, EAS_I32 offset)
1387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
1397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
1407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* zero the memory to insure complete initialization */
1427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	*pHandle = NULL;
1437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* read the file header */
1457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (WaveParseHeader(pEASData, fileHandle, NULL) == EAS_SUCCESS)
1467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
1477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* check for static memory allocation */
1497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (pEASData->staticMemoryModel)
1507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			pWaveData = EAS_CMEnumData(EAS_CM_WAVE_DATA);
1517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		else
1527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			pWaveData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_WAVE_STATE));
1537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (!pWaveData)
1547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_ERROR_MALLOC_FAILED;
1557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		EAS_HWMemSet(pWaveData, 0, sizeof(S_WAVE_STATE));
1567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* return a pointer to the instance data */
1587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pWaveData->fileHandle = fileHandle;
1597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pWaveData->fileOffset = offset;
1607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		*pHandle = pWaveData;
1617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
1627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_SUCCESS;
1647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
1657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
1677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WavePrepare()
1687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
1697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
1707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Prepare to parse the file.
1717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
1737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
1747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
1757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
1777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
1807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
1817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
1827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
1837df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WavePrepare (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
1847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
1857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
1867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_RESULT result;
1877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* validate parser state */
1897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData = (S_WAVE_STATE*) pInstData;
1907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData->streamHandle != NULL)
1917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
1927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* back to start of file */
1947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->time = 0;
1957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWFileSeek(pEASData->hwInstData, pWaveData->fileHandle, pWaveData->fileOffset)) != EAS_SUCCESS)
1967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
1977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* parse the file header */
1997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = WaveParseHeader(pEASData, pWaveData->fileHandle, pWaveData)) != EAS_SUCCESS)
2007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
2017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_SUCCESS;
2037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
2047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
2067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveState()
2077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
2087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
2097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Returns the current state of the stream
2107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
2127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
2137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
2147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pState			- pointer to variable to store state
2157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
2177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
2207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Notes:
2227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This interface is also exposed in the internal library for use by the other modules.
2237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
2247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
2257df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveState (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_STATE *pState)
2267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
2277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
2287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* return current state */
2307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData = (S_WAVE_STATE*) pInstData;
2317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData->streamHandle)
2327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_PEState(pEASData, pWaveData->streamHandle, pState);
2337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* if no stream handle, and time is not zero, we are done */
2357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData->time > 0)
2367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		*pState = EAS_STATE_STOPPED;
2377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	else
2387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		*pState = EAS_STATE_OPEN;
2397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_SUCCESS;
2407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
2417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
2437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveClose()
2447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
2457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
2467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Close the file and clean up
2477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
2497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
2507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
2517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
2537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
2567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
2587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
2597df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveClose (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
2607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
2617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
2627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_RESULT result;
2637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData = (S_WAVE_STATE*) pInstData;
2657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* close the stream */
2677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData->streamHandle)
2687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
2697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_PEClose(pEASData, pWaveData->streamHandle)) != EAS_SUCCESS)
2707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
2717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pWaveData->streamHandle = NULL;
2727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
2737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* if using dynamic memory, free it */
2757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (!pEASData->staticMemoryModel)
2767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
2777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef MMAPI_SUPPORT
2797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* need to free the fmt chunk */
2807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (pWaveData->fmtChunk != NULL)
2817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			EAS_HWFree(pEASData->hwInstData, pWaveData->fmtChunk);
2827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
2837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* free the instance data */
2857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		EAS_HWFree(pEASData->hwInstData, pWaveData);
2867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
2887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_SUCCESS;
2897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
2907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
2917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
2927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveReset()
2937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
2947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
2957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Reset the sequencer. Used for locating backwards in the file.
2967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
2977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
2987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
2997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
3007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
3027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
3057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3087df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveReset (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
3097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
3107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_PCM_HANDLE streamHandle;
3117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* reset to first byte of data in the stream */
3137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	streamHandle = ((S_WAVE_STATE*)pInstData)->streamHandle;
3147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (streamHandle)
3157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_PEReset(pEASData, streamHandle);
3167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
3177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
3187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
3207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveLocate()
3217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
3237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Rewind/fast-forward in file.
3247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
3267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to overall EAS data structure
3277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to file handle
3287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * time				- time (in msecs)
3297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
3317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
3347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pParserLocate) reserved for future use */
3387df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveLocate (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 time, EAS_BOOL *pParserLocate)
3397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
3407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_PCM_HANDLE streamHandle;
3417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* reset to first byte of data in the stream */
3437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	streamHandle = ((S_WAVE_STATE*)pInstData)->streamHandle;
3447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (streamHandle)
3457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_PELocate(pEASData, streamHandle, time);
3467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
3477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
3487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
3507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WavePause()
3517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
3537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Mute and stop rendering a PCM stream. Sets the gain target to zero and stops the playback
3547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * at the end of the next audio frame.
3557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
3577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to EAS library instance data
3587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to S_WAVE_STATE for this stream
3597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
3617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
3647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */
3687df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WavePause (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
3697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
3707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_PCM_HANDLE streamHandle;
3717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* pause the stream */
3737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	streamHandle = ((S_WAVE_STATE*)pInstData)->streamHandle;
3747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (streamHandle)
3757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_PEPause(pEASData, streamHandle);
3767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
3777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
3787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
3797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
3807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveResume()
3817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
3837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Resume rendering a PCM stream. Sets the gain target back to its
3847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * previous setting and restarts playback at the end of the next audio
3857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * frame.
3867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
3887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to EAS library instance data
3897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to S_WAVE_STATE for this stream
3907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
3927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
3957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
3967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
3977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
3987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */
3997df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveResume (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData)
4007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
4017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_PCM_HANDLE streamHandle;
4027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* resume the stream */
4047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	streamHandle = ((S_WAVE_STATE*)pInstData)->streamHandle;
4057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (streamHandle)
4067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_PEResume(pEASData, streamHandle);
4077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_ERROR_NOT_VALID_IN_THIS_STATE;
4087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
4097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
4117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveSetData()
4127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
4147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
4167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to EAS library instance data
4177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to S_WAVE_STATE for this stream
4187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
4207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
4237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
4267df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveSetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
4277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
4287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData = (S_WAVE_STATE*) pInstData;
4297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	switch (param)
4317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
4327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* set metadata callback */
4337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_METADATA_CB:
4347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			EAS_HWMemCpy(&pWaveData->metadata, (void*) value, sizeof(S_METADATA_CB));
4357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_SUCCESS;
4367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_PLAYBACK_RATE:
4387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			value = (EAS_I32) (PITCH_CENTS_CONVERSION * log10((double) value / (double) (1 << 28)));
4397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_PEUpdatePitch(pEASData, pWaveData->streamHandle, (EAS_I16) value);
4407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_VOLUME:
4427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_PEUpdateVolume(pEASData, pWaveData->streamHandle, (EAS_I16) value);
4437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		default:
4457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_ERROR_INVALID_PARAMETER;
4467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
4477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
4487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
4507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveGetData()
4517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
4537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
4557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to EAS library instance data
4567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to S_WAVE_STATE for this stream
4577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
4597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
4627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
4637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
4657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pEASData) reserved for future use */
4667df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveGetData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
4677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
4687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
4697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData = (S_WAVE_STATE*) pInstData;
4717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	switch (param)
4727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
4737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* return file type as WAVE */
4747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_FILE_TYPE:
4757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			*pValue = pWaveData->fileType;
4767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
4777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef MMAPI_SUPPORT
4797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* return pointer to 'fmt' chunk */
4807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_FORMAT:
4817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			*pValue = (EAS_I32) pWaveData->fmtChunk;
4827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
4837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
4847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		case PARSER_DATA_GAIN_OFFSET:
4867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			*pValue = WAVE_GAIN_OFFSET;
4877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
4887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		default:
4907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return EAS_ERROR_INVALID_PARAMETER;
4917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
4927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_SUCCESS;
4947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
4957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
4967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
4977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveParseHeader()
4987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
4997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
5007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Parse the WAVE file header.
5017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
5027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Inputs:
5037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * pEASData			- pointer to EAS library instance data
5047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * handle			- pointer to S_WAVE_STATE for this stream
5057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
5067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs:
5077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
5087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
5097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Side Effects:
5107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
5117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
5127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
5137df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveParseHeader (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, S_WAVE_STATE *pWaveData)
5147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
5157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_PCM_OPEN_PARAMS params;
5167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_RESULT result;
5177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 tag;
5187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 fileSize;
5197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 size;
5207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 pos;
5217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 audioOffset;
5227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U16 usTemp;
5237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_BOOL parseDone;
5247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 avgBytesPerSec;
5257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* init some data (and keep lint happy) */
5277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.sampleRate = 0;
5287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.size = 0;
5297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	audioOffset = 0;
5307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.decoder = 0;
5317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.blockSize = 0;
5327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.pCallbackFunc = NULL;
5337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.cbInstData = NULL;
5347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.loopSamples = 0;
5357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.fileHandle = fileHandle;
5367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.volume = 0x7fff;
5377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.envData = 0;
5387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	avgBytesPerSec = 8000;
5397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* check for 'RIFF' tag */
5417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &tag, EAS_TRUE)) != EAS_FALSE)
5427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
5437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (tag != CHUNK_RIFF)
5447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_UNRECOGNIZED_FORMAT;
5457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* get size */
5477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &fileSize, EAS_FALSE)) != EAS_FALSE)
5487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
5497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* check for 'WAVE' tag */
5517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &tag, EAS_TRUE)) != EAS_FALSE)
5527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
5537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (tag != CHUNK_WAVE)
5547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_UNRECOGNIZED_FORMAT;
5557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* this is enough to say we recognize the file */
5577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData == NULL)
5587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_SUCCESS;
5597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* check for streaming mode */
5617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->flags = 0;
5627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->mediaLength = -1;
5637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->infoChunkPos = -1;
5647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->infoChunkSize = -1;
5657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (fileSize== FILE_SIZE_STREAMING)
5667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
5677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pWaveData->flags |= PCM_FLAGS_STREAMING;
5687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		fileSize = 0x7fffffff;
5697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
5707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* find out where we're at */
5727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, &pos)) != EAS_SUCCESS)
5737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
5747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	fileSize -= 4;
5757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	parseDone = EAS_FALSE;
5777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	for (;;)
5787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
5797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* get tag and size for next chunk */
5807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &tag, EAS_TRUE)) != EAS_FALSE)
5817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
5827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &size, EAS_FALSE)) != EAS_FALSE)
5837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
5847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* process chunk */
5867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pos += 8;
5877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		switch (tag)
5887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		{
5897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_FMT:
5907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef MMAPI_SUPPORT
5927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = SaveFmtChunk(pEASData, fileHandle, pWaveData, (EAS_I32) size)) != EAS_SUCCESS)
5937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
5947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
5957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
5967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get audio format */
5977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetWord(pEASData->hwInstData, fileHandle, &usTemp, EAS_FALSE)) != EAS_FALSE)
5987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
5997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if (usTemp == WAVE_FORMAT_PCM)
6007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					params.decoder = EAS_DECODER_PCM;
6027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					pWaveData->fileType = EAS_FILE_WAVE_PCM;
6037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				else if (usTemp == WAVE_FORMAT_IMA_ADPCM)
6057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					params.decoder = EAS_DECODER_IMA_ADPCM;
6077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					pWaveData->fileType = EAS_FILE_WAVE_IMA_ADPCM;
6087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				else
6107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return EAS_ERROR_UNRECOGNIZED_FORMAT;
6117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get number of channels */
6137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetWord(pEASData->hwInstData, fileHandle, &usTemp, EAS_FALSE)) != EAS_FALSE)
6147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if (usTemp == 2)
6167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					pWaveData->flags |= PCM_FLAGS_STEREO;
6177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				else if (usTemp != 1)
6187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return EAS_ERROR_UNRECOGNIZED_FORMAT;
6197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get sample rate */
6217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &params.sampleRate, EAS_FALSE)) != EAS_FALSE)
6227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get stream rate */
6257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &avgBytesPerSec, EAS_FALSE)) != EAS_FALSE)
6267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get block alignment */
6297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetWord(pEASData->hwInstData, fileHandle, &usTemp, EAS_FALSE)) != EAS_FALSE)
6307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				params.blockSize = usTemp;
6327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get bits per sample */
6347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetWord(pEASData->hwInstData, fileHandle, &usTemp, EAS_FALSE)) != EAS_FALSE)
6357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* PCM, must be 8 or 16 bit samples */
6387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if (params.decoder == EAS_DECODER_PCM)
6397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					if (usTemp == 8)
6417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project						pWaveData->flags |= PCM_FLAGS_8_BIT | PCM_FLAGS_UNSIGNED;
6427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					else if (usTemp != 16)
6437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project						return EAS_ERROR_UNRECOGNIZED_FORMAT;
6447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* for IMA ADPCM, we only support mono 4-bit ADPCM */
6477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				else
6487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					if ((usTemp != 4) || (pWaveData->flags & PCM_FLAGS_STEREO))
6507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project						return EAS_ERROR_UNRECOGNIZED_FORMAT;
6517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
6547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_DATA:
6567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				audioOffset = pos;
6577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if (pWaveData->flags & PCM_FLAGS_STREAMING)
6587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					params.size = 0x7fffffff;
6607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					parseDone = EAS_TRUE;
6617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				else
6637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					params.size = (EAS_I32) size;
6657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					params.loopStart = size;
6667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					/* use more accurate method if possible */
6677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					if (size <= (0x7fffffff / 1000))
6687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project						pWaveData->mediaLength = (EAS_I32) ((size * 1000) / avgBytesPerSec);
6697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					else
6707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project						pWaveData->mediaLength = (EAS_I32) (size / (avgBytesPerSec / 1000));
6717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
6737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_LIST:
6757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				/* get the list type */
6767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if ((result = EAS_HWGetDWord(pEASData->hwInstData, fileHandle, &tag, EAS_TRUE)) != EAS_FALSE)
6777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					return result;
6787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				if (tag == CHUNK_INFO)
6797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{
6807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					pWaveData->infoChunkPos = pos + 4;
6817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					pWaveData->infoChunkSize = (EAS_I32) size - 4;
6827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				}
6837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
6847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			default:
6867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "WaveParseHeader: %c%c%c%c chunk - %d byte(s) ignored\n",
6877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					(char) (tag >> 24), (char) (tag >> 16), (char) (tag >> 8), (char) tag, size); */ }
6887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
6897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		}
6907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (parseDone)
6927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
6937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* subtract header size */
6957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		fileSize -= 8;
6967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
6977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* account for zero-padding on odd length chunks */
6987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (size & 1)
6997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			size++;
7007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* this check works for files with odd length last chunk and no zero-pad */
7027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (size >= fileSize)
7037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		{
7047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			if (size > fileSize)
7057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "WaveParseHeader: '%c%c%c%c' chunk size exceeds length of file or is not zero-padded\n",
7067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					(char) (tag >> 24), (char) (tag >> 16), (char) (tag >> 8), (char) tag, size); */ }
7077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
7087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		}
7097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* subtract size of data chunk (including any zero-pad) */
7117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		fileSize -= size;
7127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* seek to next chunk */
7147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pos += (EAS_I32) size;
7157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, pos)) != EAS_SUCCESS)
7167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
7177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
7187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* check for valid header */
7207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((params.sampleRate == 0) || (params.size == 0))
7217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_UNRECOGNIZED_FORMAT;
7227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* save the pertinent information */
7247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->audioOffset = audioOffset;
7257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	params.flags = pWaveData->flags;
7267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* seek to data */
7287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWFileSeek(pEASData->hwInstData, fileHandle, audioOffset)) != EAS_SUCCESS)
7297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
7307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* open a stream in the PCM engine */
7327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_PEOpenStream(pEASData, &params, &pWaveData->streamHandle);
7337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
7347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
7367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WaveGetMetaData()
7377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
7397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Process the INFO chunk and return metadata to host
7407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
7417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
7427df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT WaveGetMetaData (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I32 *pMediaLength)
7437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
7447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	S_WAVE_STATE *pWaveData;
7457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_RESULT result;
7467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 pos;
7477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 size;
7487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 infoSize;
7497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_U32 tag;
7507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 restorePos;
7517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	E_EAS_METADATA_TYPE metaType;
7527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 metaLen;
7537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* get current position so we can restore it */
7557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData = (S_WAVE_STATE*) pInstData;
7567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* return media length */
7587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	*pMediaLength = pWaveData->mediaLength;
7597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* did we encounter an INFO chunk? */
7617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (pWaveData->infoChunkPos < 0)
7627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_SUCCESS;
7637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWFilePos(pEASData->hwInstData, pWaveData->fileHandle, &restorePos)) != EAS_SUCCESS)
7657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
7667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* offset to start of first chunk in INFO chunk */
7687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pos = pWaveData->infoChunkPos;
7697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	infoSize = pWaveData->infoChunkSize;
7707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* read all the chunks in the INFO chunk */
7727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	for (;;)
7737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	{
7747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* seek to next chunk */
7767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWFileSeek(pEASData->hwInstData, pWaveData->fileHandle, pos)) != EAS_SUCCESS)
7777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
7787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* get tag and size for next chunk */
7807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWGetDWord(pEASData->hwInstData, pWaveData->fileHandle, &tag, EAS_TRUE)) != EAS_FALSE)
7817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
7827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if ((result = EAS_HWGetDWord(pEASData->hwInstData, pWaveData->fileHandle, &size, EAS_FALSE)) != EAS_FALSE)
7837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			return result;
7847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* process chunk */
7867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pos += 8;
7877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		metaType = EAS_METADATA_UNKNOWN;
7887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		switch (tag)
7897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		{
7907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_INAM:
7917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				metaType = EAS_METADATA_TITLE;
7927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
7937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_IART:
7957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				metaType = EAS_METADATA_AUTHOR;
7967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
7977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
7987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			case CHUNK_ICOP:
7997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				metaType = EAS_METADATA_COPYRIGHT;
8007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
8017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			default:
8037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_INFO, "WaveParseHeader: %c%c%c%c chunk - %d byte(s) ignored\n",
8047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project					(char) (tag >> 24), (char) (tag >> 16), (char) (tag >> 8), (char) tag, size); */ }
8057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				break;
8067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		}
8077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* process known metadata */
8097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (metaType != EAS_METADATA_UNKNOWN)
8107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		{
8117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			metaLen = pWaveData->metadata.bufferSize - 1;
8127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			if (metaLen > (EAS_I32) size)
8137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				metaLen = (EAS_I32) size;
8147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			if ((result = EAS_HWReadFile(pEASData->hwInstData, pWaveData->fileHandle, pWaveData->metadata.buffer, metaLen, &metaLen)) != EAS_SUCCESS)
8157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project				return result;
8167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			pWaveData->metadata.buffer[metaLen] = 0;
8177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			pWaveData->metadata.callback(metaType, pWaveData->metadata.buffer, pWaveData->metadata.pUserData);
8187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		}
8197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		/* subtract this block */
8217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (size & 1)
8227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			size++;
8237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		infoSize -= (EAS_I32) size + 8;
8247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		if (infoSize == 0)
8257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project			break;
8267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		pos += (EAS_I32) size;
8277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	}
8287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* restore original position */
8317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_HWFileSeek(pEASData->hwInstData, pWaveData->fileHandle, restorePos);
8327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
8337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef MMAPI_SUPPORT
8357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*----------------------------------------------------------------------------
8367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * SaveFmtChunk()
8377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
8387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Purpose:
8397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Save the fmt chunk for the MMAPI library
8407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *----------------------------------------------------------------------------
8417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/
8427df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectstatic EAS_RESULT SaveFmtChunk (S_EAS_DATA *pEASData, EAS_FILE_HANDLE fileHandle, S_WAVE_STATE *pWaveData, EAS_I32 fmtSize)
8437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{
8447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_RESULT result;
8457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 pos;
8467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	EAS_I32 count;
8477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* save current file position */
8497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWFilePos(pEASData->hwInstData, fileHandle, &pos)) != EAS_SUCCESS)
8507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
8517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* allocate a chunk of memory */
8537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	pWaveData->fmtChunk = EAS_HWMalloc(pEASData->hwInstData, fmtSize);
8547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (!pWaveData->fmtChunk)
8557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_MALLOC_FAILED;
8567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* read the fmt chunk into memory */
8587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if ((result = EAS_HWReadFile(pEASData->hwInstData, fileHandle, pWaveData->fmtChunk, fmtSize, &count)) != EAS_SUCCESS)
8597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return result;
8607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	if (count != fmtSize)
8617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project		return EAS_ERROR_FILE_READ_FAILED;
8627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
8637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	/* restore file position */
8647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	return EAS_HWFileSeek(pEASData->hwInstData, fileHandle, pos);
8657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project}
8667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif
8677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
868