17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4PCM_PCMReader.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief PCM reader implementation 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This file implements functions of the PCM reader 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CharStar.h" 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4PCMR_CoreReader.h" 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CharStar.h" 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * PCM reader version numbers 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* CHANGE_VERSION_HERE */ 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4PCMR_VERSION_MAJOR 1 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4PCMR_VERSION_MINOR 0 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4PCMR_VERSION_REVISION 0 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_openRead(M4OSA_Context* pContext, M4OSA_Void* pUrl, 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_FileReaderPointer* pFileFunction) 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function opens a PCM file 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - opens a PCM file 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - initializes PCM context, 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - verifies PCM file format 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Fill decoder config structure 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Changes state of the reader in 'Opening' 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (OUT) Pointer on the PCM Reader context 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pUrl: (IN) Name of the PCM file 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pFileFunctions: (IN) Pointer on the file access functions 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error during the opening 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER pContext and/or pUrl and/or pFileFunction is NULL 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC there is no more memory available 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_FILE_NOT_FOUND the file cannot be found 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4PCMC_ERR_PCM_NOT_COMPLIANT the file does not seem to be compliant, no RIFF, 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * or lack of any mandatory chunk. 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4PCMC_ERR_PCM_NOT_SUPPORTED the PCM format of this file is not supported by the 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * reader 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Any M4OSA_FILE errors see OSAL File specification for detailed errors 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_openRead(M4OSA_Context* pContext, M4OSA_Void* pUrl, 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileReadPointer* pFileFunction) 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *context; 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char* pTempURL; 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char value[6]; 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == pContext)|| (M4OSA_NULL == pUrl) ||(M4OSA_NULL == pFileFunction)) 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Allocates the context */ 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context = M4OSA_NULL; 78694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu context = (M4PCMR_Context *)M4OSA_32bitAlignedMalloc(sizeof(M4PCMR_Context), M4WAV_READER, 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"M4PCMR_openRead"); 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == context) 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = (M4OSA_Context)context; 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Initialize the context */ 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_offset = 0; 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_state = M4PCMR_kInit; 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_microState = M4PCMR_kInit; 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_pFileReadFunc = M4OSA_NULL; 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_fileContext = M4OSA_NULL; 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_pAuBuffer = M4OSA_NULL; 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_pDecoderSpecInfo = M4OSA_NULL; 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set sample frequency */ 97947721ba962c19913b76658cdbb19ae8c77c9c50Dheeraj Sharma pTempURL = (M4OSA_Char*)pUrl + (strlen((const char *)pUrl)-11); 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_chrNCopy(value, pTempURL, 5); 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_chrGetUInt32(pTempURL, &(context->m_decoderConfig.SampleFrequency), 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL, M4OSA_kchrDec); 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set number of channels */ 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTempURL += 6; 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_chrNCopy(value, pTempURL, 1); 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_chrGetUInt16(pTempURL, &(context->m_decoderConfig.nbChannels), 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL, M4OSA_kchrDec); 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 108947721ba962c19913b76658cdbb19ae8c77c9c50Dheeraj Sharma M4OSA_chrNCopy(pUrl,pUrl, (strlen((const char *)pUrl)-12)); 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Open the file */ 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_fileContext = M4OSA_NULL; 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pFileFunction->openRead(&(context->m_fileContext), pUrl, M4OSA_kFileRead); 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4NO_ERROR != err) 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_decoderConfig.BitsPerSample = 16; 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_decoderConfig.AvgBytesPerSec = context->m_decoderConfig.SampleFrequency * 2 \ 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * context->m_decoderConfig.nbChannels; 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pFileFunction->getOption(context->m_fileContext, M4OSA_kFileReadGetFileSize, 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_DataOption*)&(context->m_decoderConfig.DataLength)); 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4NO_ERROR != err) 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_blockSize = 2048 * context->m_decoderConfig.nbChannels; // Raw PCM. Hence, get a 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // chunk of data 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(context->m_decoderConfig.SampleFrequency == 8000) 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AMR case, no pb */ 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_blockSize = context->m_decoderConfig.nbChannels *\ 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (context->m_decoderConfig.SampleFrequency / 50) * \ 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (context->m_decoderConfig.BitsPerSample / 8); 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(context->m_decoderConfig.SampleFrequency == 16000) 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AAC case, we can't read only 20 ms blocks */ 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_blockSize = 2048 * context->m_decoderConfig.nbChannels; 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_dataStartOffset = 0; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_pFileReadFunc = pFileFunction; 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 143694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu context->m_pAuBuffer = (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(context->m_blockSize, M4WAV_READER, 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"Core PCM reader Access Unit"); 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == context->m_pAuBuffer) 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4ERR_ALLOC; 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Change state */ 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_state = M4PCMR_kOpening; 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargicleanup: 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Close the file */ 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(context->m_pFileReadFunc != M4OSA_NULL) 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi context->m_pFileReadFunc->closeRead(context->m_fileContext); 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Free internal context */ 163694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(context); 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL; 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_getNextStream(M4OSA_Context context, M4SYS_StreamDescription* pStreamDesc) 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function get the (unique) stream of a PCM file 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Allocates and fills the decoder specific info structure 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Fills decoder specific infos structure 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Fills pStreamDesc structure allocated by the caller 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pStreamDesc: (IN) Stream Description context 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC there is no more memory available 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Any M4OSA_FILE errors see OSAL File specification for detailed errors 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_getNextStream(M4OSA_Context context, M4SYS_StreamDescription* pStreamDesc) 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == context)|| (M4OSA_NULL == pStreamDesc)) 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (c->m_state == M4PCMR_kOpening_streamRetrieved) 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_STREAM; 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's m_state */ 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kOpening) 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Only one stream is contained in PCM file */ 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamID = 1; 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Not used */ 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->profileLevel = 0; 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->decoderSpecificInfoSize = sizeof(M4PCMC_DecoderSpecificInfo); 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Allocates decoder specific info structure */ 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->decoderSpecificInfo = M4OSA_NULL; 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->decoderSpecificInfo = 215694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc( sizeof(M4PCMC_DecoderSpecificInfo), M4WAV_READER, 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"M4PCMR_getNextStream"); 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pStreamDesc->decoderSpecificInfo == M4OSA_NULL) 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Fill decoderSpecificInfo structure, with decoder config structure filled in 'openread' 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi function */ 22332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pStreamDesc->decoderSpecificInfo, 22432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)&c->m_decoderConfig, sizeof(M4PCMC_DecoderSpecificInfo)); 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Fill other fields of pStreamDesc structure */ 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->timeScale = 1000; 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->duration = (M4OSA_Time)(((M4OSA_Double)(c->m_decoderConfig.DataLength)\ 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / (M4OSA_Double)(c->m_decoderConfig.AvgBytesPerSec))*pStreamDesc->timeScale); 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->averageBitrate = c->m_decoderConfig.AvgBytesPerSec * 8;/* in bits, multiply by 8*/ 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->maxBitrate = pStreamDesc->averageBitrate; /* PCM stream has constant bitrate */ 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Determines Stream type */ 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(c->m_decoderConfig.BitsPerSample) 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 8: 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(c->m_decoderConfig.nbChannels) 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 1: 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kPCM_8bitsU; 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// case 2: 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// pStreamDesc->streamType = M4SYS_kPCM_8bitsS; /* ??? 8bits stereo not 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // defined ? */ 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// break; 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kAudioUnknown; 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 16: 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(c->m_decoderConfig.nbChannels) 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 1: 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kPCM_16bitsU; 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 2: 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kPCM_16bitsS; 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kAudioUnknown; 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = M4SYS_kAudioUnknown; 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_pDecoderSpecInfo = pStreamDesc->decoderSpecificInfo; 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_state = M4PCMR_kOpening_streamRetrieved; 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_startReading(M4OSA_Context context, M4SYS_StreamID* pStreamIDs) 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function starts reading the unique stream of a PCM file 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to start reading a stream 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Check that provided StreamId is correct (always true, only one stream...) 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * In the player application, a StreamId table is initialized as follow: 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4SYS_StreamID pStreamID[2]={1,0}; 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Change state of the reader in 'Reading' 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamID: (IN) Stream selection 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_BAD_STREAM_ID at least one of the streamID does not exist 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (should never happen if table pStreamID is correctly initialized as above) 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_startReading(M4OSA_Context context, M4SYS_StreamID* pStreamIDs) 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == context) || (M4OSA_NULL == pStreamIDs)) 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's state */ 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kOpening_streamRetrieved) 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check pStreamID and if they're OK, change reader's state */ 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pStreamIDs[0] == 1 || pStreamIDs[0] == 0) 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First and unique stream contained in PCM file */ 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_state = M4PCMR_kReading; 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_microState = M4PCMR_kReading; 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_nextAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function reads the next AU contained in the PCM file 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to read an AU 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Allocates memory to store read AU 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Read data from file and store them into previously allocated memory 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Fill AU structure fileds (CTS...) 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Change state of the reader in 'Reading' (not useful...) 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Change Micro state 'Reading' in M4PCMR_kReading_nextAU 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (AU is read and can be deleted) 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Check if the last AU has been read or if we're about to read it 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamID: (IN) Stream selection 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAU: (IN/OUT) Acces Unit Structure 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC there is no more memory available 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4M4WAR_NO_DATA_YET there is no enough data in the file to provide a new access unit. 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4WAR_END_OF_STREAM There is no more access unit in the stream, 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * or the sample number is bigger the maximum one. 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_nextAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size_read; 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == context) || (M4OSA_NULL == pAU)) 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's state */ 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kReading && c->m_microState != M4PCMR_kReading) 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Allocates AU dataAdress */ 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->dataAddress = c->m_pAuBuffer; 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size_read = c->m_blockSize; 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((c->m_offset + size_read) >= c->m_decoderConfig.DataLength) 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size_read = c->m_decoderConfig.DataLength - c->m_offset; 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Read data in file, and copy it to AU Structure */ 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = c->m_pFileReadFunc->readData(c->m_fileContext, (M4OSA_MemAddr8)pAU->dataAddress, 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)&size_read); 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4NO_ERROR != err) 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Calculates the new m_offset, used to determine whether we're at end of reading or not */ 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_offset = c->m_offset + size_read; 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Fill others parameters of AU structure */ 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->CTS = 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Time)(((M4OSA_Double)c->m_offset/(M4OSA_Double)c->m_decoderConfig.AvgBytesPerSec)\ 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *1000); 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->DTS = pAU->CTS; 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->attribute = 0; 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->frag = M4OSA_NULL; 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->nbFrag = 0; 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->stream = M4OSA_NULL; 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->size = size_read; 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Change states */ 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_state = M4PCMR_kReading; /* Not changed ... */ 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_microState = M4PCMR_kReading_nextAU; /* AU is read and can be deleted */ 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check if there is another AU to read */ 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ie: if decoded nb of bytes = nb of bytes to decode, 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it means there is no more AU to decode */ 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_offset >= c->m_decoderConfig.DataLength) 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_AU; 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_freeAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function frees the AU provided in parameter 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to free an AU 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Free dataAddress field of AU structure 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Change state of the reader in 'Reading' (not useful...) 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Change Micro state 'Reading' in M4PCMR_kReading (another AU can be read) 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamID: (IN) Stream selection 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAU: (IN) Acces Unit Structure 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_freeAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == context ) || (M4OSA_NULL == pAU)) 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's state */ 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kReading && c->m_microState != M4PCMR_kReading_nextAU) 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAU->dataAddress = M4OSA_NULL; 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Change states */ 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_state = M4PCMR_kReading; /* Not changed ... */ 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_microState = M4PCMR_kReading; /* AU is deleted, another AU can be read */ 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_seek(M4OSA_Context context, M4SYS_StreamID* pStreamID, 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Time time, M4SYS_seekAccessMode seekAccessMode, 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Time* pObtainCTS[]) 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function seeks into the PCM file at the provided time 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to seek 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Determines from provided time m_offset to seek in file 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - If m_offset is correct, seek in file 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Update new m_offset in PCM reader context 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pStreamID: (IN) Stream selection (not used, only 1 stream) 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param time: (IN) Targeted time 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param seekMode: (IN) Selects the seek access mode 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pObtainCTS[]: (OUT) Returned Time (not used) 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC there is no more memory available 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4WAR_INVALID_TIME Specified time is not reachable 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param M4ERR_NOT_IMPLEMENTED This seek mode is not implemented yet 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_seek(M4OSA_Context context, M4SYS_StreamID* pStreamID, M4OSA_Time time, 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_SeekAccessMode seekAccessMode, M4OSA_Time* pObtainCTS) 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 offset; 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 alignment; 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size_read; 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_NULL == context) || (M4OSA_NULL == pStreamID)) 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's state */ 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kOpening_streamRetrieved && c->m_state != M4PCMR_kReading) 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(seekAccessMode) 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kBeginning: 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Determine m_offset from time*/ 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi offset = 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(time * ((M4OSA_Double)(c->m_decoderConfig.AvgBytesPerSec) / 1000)); 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** check the alignment on sample boundary */ 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi alignment = c->m_decoderConfig.nbChannels*c->m_decoderConfig.BitsPerSample/8; 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (offset%alignment != 0) 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi offset -= offset%alignment; 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add the header offset*/ 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi offset += c->m_dataStartOffset; 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If m_offset is over file size -> Invalid time */ 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (offset > (c->m_dataStartOffset + c->m_decoderConfig.DataLength)) 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_INVALID_TIME; 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Seek file */ 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size_read = offset; 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = c->m_pFileReadFunc->seek(c->m_fileContext, M4OSA_kFileSeekBeginning, 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_FilePosition *) &size_read); 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4NO_ERROR != err) 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update m_offset in M4PCMR_context */ 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_offset = offset - c->m_dataStartOffset; 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_closeRead(M4OSA_Context context) 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function closes PCM file, and frees context 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows close the PCM file 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Closes the file 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Free structures 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this function cannot be called now 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_closeRead(M4OSA_Context context) 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c = (M4PCMR_Context *)context; 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == context) 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_pDecoderSpecInfo != M4OSA_NULL) 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 571694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(c->m_pDecoderSpecInfo); 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check Reader's state */ 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(c->m_state != M4PCMR_kReading) 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if(c->m_microState == M4PCMR_kReading_nextAU) 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != c->m_pAuBuffer) 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 586694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(c->m_pAuBuffer); 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Close the file */ 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != c->m_pFileReadFunc) 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = c->m_pFileReadFunc->closeRead(c->m_fileContext); 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Free internal context */ 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != c) 5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 598694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(c); 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_getOption(M4OSA_Context context, M4PCMR_OptionID optionID, 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_DataOption* pValue) 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function get option of the PCM Reader 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to get an option 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Return corresponding option value 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param optionID: (IN) ID of the option to get 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pValue: (OUT) Variable where the option value is returned 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error. 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL. 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_BAD_OPTION_ID the optionID is not a valid one. 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this option is not available now. 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_NOT_IMPLEMENTED this option is not implemented 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_getOption(M4OSA_Context context, M4PCMR_OptionID optionID, 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DataOption* pValue) 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c =(M4PCMR_Context *)context; 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == context) 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check reader's state */ 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((c->m_state != M4PCMR_kOpening) && (c->m_state != M4PCMR_kOpening_streamRetrieved)\ 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (c->m_state != M4PCMR_kReading)) 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Depend of the OptionID, the value to return is different */ 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(optionID) 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4PCMR_kPCMblockSize: 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pValue = &c->m_blockSize; 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_OPTION_ID; 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4PCMR_setOption(M4OSA_Context context, M4PCMR_OptionID optionID, 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_DataOption Value) 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function set option of the PCM Reader 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function : 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Verifies that the current reader's state allows to set an option 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * - Set corresponding option value 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param context: (IN/OUT) PCM Reader context 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param optionID: (IN) ID of the option to get 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param Value: (IN) Variable where the option value is stored 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR there is no error. 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER at least one parameter is NULL. 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_BAD_OPTION_ID the optionID is not a valid one. 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE this option is not available now. 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_NOT_IMPLEMENTED this option is not implemented 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************ 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_setOption(M4OSA_Context context, M4PCMR_OptionID optionID, M4OSA_DataOption Value) 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4PCMR_Context *c =(M4PCMR_Context *)context; 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check parameters */ 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(context == M4OSA_NULL) 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check reader's state */ 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((c->m_state != M4PCMR_kOpening) && (c->m_state != M4PCMR_kOpening_streamRetrieved)\ 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (c->m_state != M4PCMR_kReading)) 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Depend of the OptionID, the value to set is different */ 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(optionID) 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4PCMR_kPCMblockSize: 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi c->m_blockSize = (M4OSA_UInt32)Value; 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_OPTION_ID; 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4PCMR_getVersion (M4_VersionInfo *pVersion) 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4PCMR_getVersion called with pVersion: 0x%x", pVersion); 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(((M4OSA_UInt32) pVersion == 0),M4ERR_PARAMETER, 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "pVersion is NULL in M4PCMR_getVersion"); 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_major = M4PCMR_VERSION_MAJOR; 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_minor = M4PCMR_VERSION_MINOR; 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_revision = M4PCMR_VERSION_REVISION; 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 717