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