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, ¶ms.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, ¶ms, &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