M4READER_Pcm.c revision 7c9d8018755adf1857571125ba1b3598c96ea506
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2004-2011 NXP Software 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2011 The Android Open Source Project 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @file M4READER_Wav.c 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Generic encapsulation of the core pcm reader 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note This file implements the generic M4READER interface 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * on top of the PCM reader 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4OSA_Types.h" 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4OSA_Error.h" 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4OSA_Memory.h" 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4OSA_Debug.h" 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4OSA_CoreID.h" 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4TOOL_VersionInfo.h" 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4PCMR_CoreReader.h" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "M4READER_Pcm.h" 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * structure M4READER_WAV_Context 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief This structure defines the internal context of a wav reader instance 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note The context is allocated and de-allocated by the reader 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct _M4READER_PCM_Context 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_Context m_coreContext; /**< core wav reader context */ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4_StreamHandler* m_pAudioStream; /**< pointer on the audio stream description 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project returned by the core */ 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4SYS_AccessUnit m_audioAu; /**< audio access unit to be filled by the core */ 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_FileReadPointer* m_pOsaFileReaderFcts; /**< OSAL file read functions */ 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} M4READER_PCM_Context; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Creates a wav reader instance 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note allocates the context 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pContext: (OUT) Pointer to a wav reader context 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR: there is no error 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_ALLOC: a memory allocation has failed 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_create(M4OSA_Context* pContext) 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pReaderContext; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((pContext == 0), M4ERR_PARAMETER, 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_create: invalid context pointer"); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pReaderContext = (M4READER_PCM_Context*)M4OSA_malloc(sizeof(M4READER_PCM_Context), 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_WAV, (M4OSA_Char *)"M4READER_PCM_Context"); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pReaderContext == M4OSA_NULL) 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return M4ERR_ALLOC; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pReaderContext->m_coreContext = M4OSA_NULL; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pReaderContext->m_pAudioStream = M4OSA_NULL; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pReaderContext->m_audioAu.dataAddress = M4OSA_NULL; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pReaderContext->m_pOsaFileReaderFcts = M4OSA_NULL; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *pContext = pReaderContext; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return M4NO_ERROR; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Destroy the instance of the reader 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note the context is un-allocated 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) context of the network reader 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR: there is no error 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_destroy(M4OSA_Context context) 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Check function parameters */ 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_destroy: invalid context pointer"); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_free((M4OSA_MemAddr32)pC); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return M4NO_ERROR; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Initializes the reader instance 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) context of the network reader 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pFileDescriptor: (IN) Pointer to proprietary data identifying the media to open 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR: there is no error 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_open(M4OSA_Context context, M4OSA_Void* pFileDescriptor) 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_ERR err; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Check function parameters */ 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_open: invalid context pointer"); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER, 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_open: invalid pointer pFileDescriptor"); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4PCMR_openRead(&(pC->m_coreContext), (M4OSA_Char*)pFileDescriptor, 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pC->m_pOsaFileReaderFcts); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief close the reader 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) Context of the reader 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR there is no error 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER the context is NULL 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_BAD_CONTEXT provided context is not a valid one 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_close(M4OSA_Context context) 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_ERR err; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Check function parameters */ 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_close: invalid context pointer"); 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Free audio AU and audio stream */ 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (M4OSA_NULL != pC->m_pAudioStream) 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (M4OSA_NULL != pC->m_audioAu.dataAddress) 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4PCMR_freeAU(pC->m_coreContext, pC->m_pAudioStream->m_streamId, 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &pC->m_audioAu); 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err != M4NO_ERROR) 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_TRACE1_0("M4READER_PCM_close: Error when freeing audio access unit"); 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_free((M4OSA_MemAddr32)pC->m_pAudioStream); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pC->m_pAudioStream = M4OSA_NULL; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (M4OSA_NULL != pC->m_coreContext) 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Close tha PCM file */ 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4PCMR_closeRead(pC->m_coreContext); 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pC->m_coreContext = M4OSA_NULL; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief set en option value of the reader 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note this function follows the set/get option mechanism described in OSAL 3.0 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * it allows the caller to set a property value: 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) Context of the reader 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param optionId: (IN) indicates the option to set 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pValue: (IN) pointer to structure or value (allocated by user) 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * where option is stored 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR there is no error 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_BAD_CONTEXT provided context is not a valid one 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER at least one parameter is not properly set 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_BAD_OPTION_ID when the option ID is not a valid one 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_setOption(M4OSA_Context context, M4OSA_OptionID optionId, void* pValue) 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_ERR err = M4NO_ERROR; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* Check function parameters */ 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_setOption: invalid context pointer"); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER, 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_setOption: invalid value pointer"); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(optionId) 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case M4READER_kOptionID_SetOsaFileReaderFctsPtr : 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pC->m_pOsaFileReaderFcts = (M4OSA_FileReadPointer*)pValue; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default : 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4ERR_PARAMETER; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Retrieves the an option value from the reader, given an option ID. 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note this function follows the set/get option mechanism described in OSAL 3.0 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * it allows the caller to retrieve a property value: 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) context of the network reader 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param optionId: (IN) option identificator whose option value is to be retrieved. 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pValue: (OUT) option value retrieved. 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR: there is no error 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_BAD_OPTION_ID: the required option identificator is unknown 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_getOption(M4OSA_Context context, M4OSA_OptionID optionId, void* pValue) 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pContext = (M4READER_PCM_Context*)context; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_ERR err = M4NO_ERROR; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* no check of context at this level because some option does not need it */ 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((pValue == 0), M4ERR_PARAMETER, 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_getOption: invalid pointer on value"); 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (optionId) 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case M4READER_kOptionID_Duration: 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *((M4OSA_UInt64*)pValue) = pContext->m_pAudioStream->m_duration; 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case M4READER_kOptionID_Version: 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4PCMR_getVersion((M4_VersionInfo*)pValue); 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case M4READER_kOptionID_Copyright: 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return M4ERR_NOT_IMPLEMENTED; 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case M4READER_kOptionID_Bitrate: 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (M4OSA_NULL != pContext->m_pAudioStream) 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *pBitrate = pContext->m_pAudioStream->m_averageBitRate; 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pBitrate = 0; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4ERR_PARAMETER; 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = M4ERR_BAD_OPTION_ID; 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_TRACE1_0("M4READER_PCM_getOption: unsupported optionId"); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/** 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @brief Get the next stream found in the media 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @note 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param context: (IN) context of the network reader 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pMediaFamily: (OUT) pointer to a user allocated M4READER_MediaFamily that will 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * be filled 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @param pStreamHandler: (OUT) pointer to a stream handler that will be allocated and filled 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * with the found stream description 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4NO_ERROR: there is no error. 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @return M4WAR_NO_MORE_STREAM no more available stream in the media (all streams found) 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ************************************************************************ 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectM4OSA_ERR M4READER_PCM_getNextStream(M4OSA_Context context, M4READER_MediaFamily *pMediaFamily, 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4_StreamHandler **pStreamHandler) 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4READER_PCM_Context* pC=(M4READER_PCM_Context*)context; 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_ERR err; 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* M4_StreamHandler* pStreamHandler = M4OSA_NULL;*/ 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4SYS_StreamDescription streamDesc; 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4_AudioStreamHandler* pAudioStreamHandler; 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_Double fDuration; 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4SYS_StreamID streamIdArray[2]; 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4PCMC_DecoderSpecificInfo* pDsi; 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_getNextStream: invalid context"); 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project M4OSA_DEBUG_IF1((pMediaFamily == 0), M4ERR_PARAMETER, 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "M4READER_PCM_getNextStream: invalid pointer to MediaFamily"); 319 M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, 320 "M4READER_PCM_getNextStream: invalid pointer to StreamHandler"); 321 322 err = M4PCMR_getNextStream( pC->m_coreContext, &streamDesc); 323 if (err == M4WAR_NO_MORE_STREAM) 324 { 325 streamIdArray[0] = 0; 326 streamIdArray[1] = 0; 327 err = M4PCMR_startReading(pC->m_coreContext, streamIdArray); /*to put in open function*/ 328 329 return M4WAR_NO_MORE_STREAM; 330 } 331 else if (M4NO_ERROR != err) 332 { 333 return err; /*also return M4WAR_NO_MORE_STREAM*/ 334 } 335 336 switch (streamDesc.streamType) 337 { 338 case M4SYS_kAudioUnknown: 339 case M4SYS_kPCM_16bitsS: 340 case M4SYS_kPCM_16bitsU: 341 case M4SYS_kPCM_8bitsU: 342 *pMediaFamily = M4READER_kMediaFamilyAudio; 343 M4OSA_TRACE2_0("M4READER_PCM_getNextStream: found audio stream"); 344 break; 345 default: 346 *pMediaFamily = M4READER_kMediaFamilyUnknown; 347 M4OSA_TRACE2_0("M4READER_PCM_getNextStream: found UNKNOWN stream"); 348 return M4NO_ERROR; 349 } 350 351 pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_malloc(sizeof(M4_AudioStreamHandler), 352 M4READER_WAV, (M4OSA_Char *)"M4_AudioStreamHandler"); 353 if (pAudioStreamHandler == M4OSA_NULL) 354 { 355 return M4ERR_ALLOC; 356 } 357 pAudioStreamHandler->m_structSize = sizeof(M4_AudioStreamHandler); 358 pC->m_pAudioStream = (M4_StreamHandler*)(pAudioStreamHandler); 359 360 pDsi = (M4PCMC_DecoderSpecificInfo*)(streamDesc.decoderSpecificInfo); 361 M4OSA_DEBUG_IF1((pDsi == 0), M4ERR_PARAMETER, 362 "M4READER_PCM_getNextStream: invalid decoder specific info in stream"); 363 364 pAudioStreamHandler->m_samplingFrequency = pDsi->SampleFrequency; 365 pAudioStreamHandler->m_byteSampleSize = (M4OSA_UInt32)(pDsi->BitsPerSample/8); 366 /* m_byteFrameLength is badly named: it is not in bytes but in samples number */ 367 if(pAudioStreamHandler->m_samplingFrequency == 8000) 368 { 369 /* AMR case */ 370 pAudioStreamHandler->m_byteFrameLength = 371 (((streamDesc.averageBitrate/8)/50)/pDsi->nbChannels)\ 372 /pAudioStreamHandler->m_byteSampleSize;/*/50 to get around 20 ms of audio*/ 373 } 374 else 375 { 376 /* AAC Case */ 377 pAudioStreamHandler->m_byteFrameLength = 378 (M4OSA_UInt32)(((streamDesc.averageBitrate/8)/15.625)/pDsi->nbChannels)\ 379 /pAudioStreamHandler->m_byteSampleSize; 380 } 381 382 pAudioStreamHandler->m_nbChannels = pDsi->nbChannels; 383 384 M4OSA_TIME_TO_MS( fDuration, streamDesc.duration, streamDesc.timeScale); 385 pC->m_pAudioStream->m_duration = (M4OSA_Int64)fDuration; 386 pC->m_pAudioStream->m_pDecoderSpecificInfo = (M4OSA_UInt8*)(streamDesc.decoderSpecificInfo); 387 pC->m_pAudioStream->m_decoderSpecificInfoSize = streamDesc.decoderSpecificInfoSize; 388 pC->m_pAudioStream->m_streamId = streamDesc.streamID; 389 pC->m_pAudioStream->m_pUserData = 390 (void*)streamDesc.timeScale; /*trick to change*/ 391 pC->m_pAudioStream->m_averageBitRate = streamDesc.averageBitrate; 392 pC->m_pAudioStream->m_maxAUSize = 393 pAudioStreamHandler->m_byteFrameLength*pAudioStreamHandler->m_byteSampleSize\ 394 *pAudioStreamHandler->m_nbChannels; 395 pC->m_pAudioStream->m_streamType = M4DA_StreamTypeAudioPcm; 396 397 *pStreamHandler = pC->m_pAudioStream; 398 return err; 399} 400 401/** 402 ************************************************************************ 403 * @brief fill the access unit structure with initialization values 404 * @note 405 * 406 * @param context: (IN) context of the network reader 407 * @param pStreamHandler: (IN) pointer to the stream handler to which the access unit will 408 * be associated 409 * @param pAccessUnit: (IN) pointer to the access unit(allocated by the caller) to initialize 410 * @return M4NO_ERROR: there is no error. 411 * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) 412 ************************************************************************ 413 */ 414M4OSA_ERR M4READER_PCM_fillAuStruct(M4OSA_Context context, M4_StreamHandler *pStreamHandler, 415 M4_AccessUnit *pAccessUnit) 416{ 417 M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 418 M4SYS_AccessUnit* pAu; 419 420 M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, 421 "M4READER_PCM_fillAuStruct: invalid context"); 422 M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, 423 "M4READER_PCM_fillAuStruct: invalid pointer to M4_StreamHandler"); 424 M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, 425 "M4READER_PCM_fillAuStruct: invalid pointer to M4_AccessUnit"); 426 427 if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) 428 { 429 pAu = &pC->m_audioAu; 430 } 431 else 432 { 433 M4OSA_TRACE1_0("M4READER_PCM_fillAuStruct: passed StreamHandler is not known"); 434 return M4ERR_PARAMETER; 435 } 436 437 pAu->dataAddress = M4OSA_NULL; 438 pAu->size = 0; 439 pAu->CTS = 0; 440 pAu->DTS = 0; 441 pAu->attribute = 0; 442 pAu->nbFrag = 0; 443 444 pAccessUnit->m_size = 0; 445 pAccessUnit->m_CTS = 0; 446 pAccessUnit->m_DTS = 0; 447 pAccessUnit->m_attribute = 0; 448 pAccessUnit->m_dataAddress = M4OSA_NULL;/*pBuffer;*/ 449 pAccessUnit->m_maxsize = pStreamHandler->m_maxAUSize; 450 pAccessUnit->m_streamID = pStreamHandler->m_streamId; 451 pAccessUnit->m_structSize = sizeof(M4_AccessUnit); 452 453 return M4NO_ERROR; 454} 455 456/** 457 ************************************************************************ 458 * @brief reset the stream, that is: seek it to beginning and make it ready to be read 459 * @note 460 * @param context: (IN) context of the network reader 461 * @param pStreamHandler: (IN) The stream handler of the stream to reset 462 * @return M4NO_ERROR: there is no error. 463 ************************************************************************ 464 */ 465M4OSA_ERR M4READER_PCM_reset(M4OSA_Context context, M4_StreamHandler *pStreamHandler) 466{ 467 M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 468 M4SYS_StreamID streamIdArray[2]; 469 M4OSA_ERR err; 470 M4SYS_AccessUnit* pAu; 471 M4OSA_Time time64 = 0; 472 473 M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_PCM_reset: invalid context"); 474 M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, 475 "M4READER_PCM_reset: invalid pointer to M4_StreamHandler"); 476 477 if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) 478 { 479 pAu = &pC->m_audioAu; 480 } 481 else 482 { 483 M4OSA_TRACE1_0("M4READER_PCM_reset: passed StreamHandler is not known"); 484 return M4ERR_PARAMETER; 485 } 486 487 if (pAu->dataAddress != M4OSA_NULL) 488 { 489 err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); 490 if (err != M4NO_ERROR) 491 { 492 M4OSA_TRACE1_0("M4READER_PCM_reset: error when freeing access unit"); 493 return err; 494 } 495 pAu->dataAddress = M4OSA_NULL; 496 } 497 498 streamIdArray[0] = pStreamHandler->m_streamId; 499 streamIdArray[1] = 0; 500 501 pAu->CTS = 0; 502 pAu->DTS = 0; 503 504 /* This call is needed only when replay during playback */ 505 err = M4PCMR_seek(pC->m_coreContext, streamIdArray, time64, M4SYS_kBeginning, &time64); 506 507 return err; 508} 509 510/** 511 ************************************************************************ 512 * @brief Get the next access unit of the specified stream 513 * @note 514 * @param context: (IN) Context of the reader 515 * @param pStreamHandler (IN) The stream handler of the stream to make jump 516 * @param pAccessUnit (IN/OUT) Pointer to an access unit to fill with read data 517 * (the au structure is allocated by the user, and must be 518 * initialized 519 * by calling M4READER_fillAuStruct_fct after creation) 520 * @return M4NO_ERROR there is no error 521 * @return M4ERR_BAD_CONTEXT provided context is not a valid one 522 * @return M4ERR_PARAMETER at least one parameter is not properly set 523 * @returns M4ERR_ALLOC memory allocation failed 524 * @returns M4ERR_BAD_STREAM_ID at least one of the stream Id. does not exist. 525 * @returns M4WAR_NO_DATA_YET there is no enough data on the stream for new access unit 526 * @returns M4WAR_NO_MORE_AU there are no more access unit in the stream (end of stream) 527 ************************************************************************ 528 */ 529M4OSA_ERR M4READER_PCM_getNextAu(M4OSA_Context context, M4_StreamHandler *pStreamHandler, 530 M4_AccessUnit *pAccessUnit) 531{ 532 M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 533 M4OSA_ERR err = M4NO_ERROR; 534 M4SYS_AccessUnit* pAu; 535 536 M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, 537 "M4READER_PCM_getNextAu: invalid context"); 538 M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, 539 "M4READER_PCM_getNextAu: invalid pointer to M4_StreamHandler"); 540 M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, 541 "M4READER_PCM_getNextAu: invalid pointer to M4_AccessUnit"); 542 543 /* keep trace of the allocated buffers in AU to be able to free them at destroy() 544 but be aware that system is risky and would need upgrade if more than 545 one video and one audio AU is needed */ 546 if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) 547 { 548 pAu = &pC->m_audioAu; 549 } 550 else 551 { 552 M4OSA_TRACE1_0("M4READER_PCM_getNextAu: passed StreamHandler is not known"); 553 return M4ERR_PARAMETER; 554 } 555 556 if (pAu->dataAddress != M4OSA_NULL) 557 { 558 err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); 559 if (err != M4NO_ERROR) 560 { 561 M4OSA_TRACE1_0("M4READER_PCM_getNextAu: error when freeing access unit"); 562 return err; 563 } 564 } 565 566 pAu->nbFrag = 0; 567 err = M4PCMR_nextAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); 568 569 if (err == M4NO_ERROR) 570 { 571 pAccessUnit->m_dataAddress = (M4OSA_MemAddr8)pAu->dataAddress; 572 pAccessUnit->m_size = pAu->size; 573 pAccessUnit->m_CTS = (M4OSA_Double)pAu->CTS; 574 pAccessUnit->m_DTS = (M4OSA_Double)pAu->DTS; 575 pAccessUnit->m_attribute = pAu->attribute; 576 } 577 else 578 { 579 pAccessUnit->m_size=0; 580 } 581 582 return err; 583} 584 585 586/** 587 ************************************************************************ 588 * @brief jump into the stream at the specified time 589 * @note 590 * @param context: (IN) Context of the reader 591 * @param pStreamHandler (IN) the stream handler of the stream to make jump 592 * @param pTime (IN/OUT) IN: the time to jump to (in ms) 593 * OUT: the time to which the stream really jumped 594 * But in this reader, we do not modify the time 595 * @return M4NO_ERROR there is no error 596 * @return M4ERR_BAD_CONTEXT provided context is not a valid one 597 * @return M4ERR_PARAMETER at least one parameter is not properly set 598 * @return M4ERR_ALLOC there is no more memory available 599 * @return M4ERR_BAD_STREAM_ID the streamID does not exist 600 ************************************************************************ 601 */ 602M4OSA_ERR M4READER_PCM_jump(M4OSA_Context context, M4_StreamHandler *pStreamHandler, 603 M4OSA_Int32* pTime) 604{ 605 M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; 606 M4SYS_StreamID streamIdArray[2]; 607 M4OSA_ERR err; 608 M4SYS_AccessUnit* pAu; 609 M4OSA_Time time64; 610 611 M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_PCM_jump: invalid context"); 612 M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, 613 "M4READER_PCM_jump: invalid pointer to M4_StreamHandler"); 614 M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER, "M4READER_PCM_jump: invalid time pointer"); 615 616 time64 = (M4OSA_Time)*pTime; 617 618 if (pStreamHandler == pC->m_pAudioStream) 619 { 620 pAu = &pC->m_audioAu; 621 } 622 else 623 { 624 M4OSA_TRACE1_0("M4READER_PCM_jump: passed StreamHandler is not known"); 625 return M4ERR_PARAMETER; 626 } 627 628 if (pAu->dataAddress != M4OSA_NULL) 629 { 630 err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); 631 if (err != M4NO_ERROR) 632 { 633 M4OSA_TRACE1_0("M4READER_PCM_jump: Error when freeing access unit"); 634 return err; 635 } 636 pAu->dataAddress = M4OSA_NULL; 637 } 638 639 streamIdArray[0] = pStreamHandler->m_streamId; 640 streamIdArray[1] = 0; 641 642 pAu->CTS = time64; 643 pAu->DTS = time64; 644 645 err = M4PCMR_seek(pC->m_coreContext, streamIdArray, time64, M4SYS_kBeginning, &time64); 646 647 *pTime = (M4OSA_Int32)time64; 648 649 return err; 650} 651 652/** 653 ************************************************************************* 654 * @brief Retrieves the generic interfaces implemented by the reader 655 * 656 * @param pMediaType : Pointer on a M4READER_MediaType (allocated by the caller) 657 * that will be filled with the media type supported by this reader 658 * @param pRdrGlobalInterface : Address of a pointer that will be set to the global interface 659 * implemented by this reader. The interface is a structure allocated 660 * by the function and must be un-allocated by the caller. 661 * @param pRdrDataInterface : Address of a pointer that will be set to the data interface 662 * implemented by this reader. The interface is a structure allocated 663 * by the function and must be un-allocated by the caller. 664 * 665 * @returns : M4NO_ERROR if OK 666 * ERR_ALLOC if an allocation failed 667 * ERR_PARAMETER at least one parameter is not properly set (in DEBUG only) 668 ************************************************************************* 669 */ 670M4OSA_ERR M4READER_PCM_getInterfaces(M4READER_MediaType *pMediaType, 671 M4READER_GlobalInterface **pRdrGlobalInterface, 672 M4READER_DataInterface **pRdrDataInterface) 673/************************************************************************/ 674{ 675 M4OSA_DEBUG_IF1((pMediaType == 0), M4ERR_PARAMETER, 676 "M4READER_PCM_getInterfaces: invalid pointer to MediaType passed"); 677 M4OSA_DEBUG_IF1((pRdrGlobalInterface == 0), M4ERR_PARAMETER, 678 "M4READER_PCM_getInterfaces: invalid pointer to M4READER_GlobalInterface"); 679 M4OSA_DEBUG_IF1((pRdrDataInterface == 0), M4ERR_PARAMETER, 680 "M4READER_PCM_getInterfaces: invalid pointer to M4READER_DataInterface"); 681 682 *pRdrGlobalInterface = 683 (M4READER_GlobalInterface*)M4OSA_malloc( sizeof(M4READER_GlobalInterface), M4READER_WAV, 684 (M4OSA_Char *)"M4READER_PCM GlobalInterface"); 685 if (M4OSA_NULL == *pRdrGlobalInterface) 686 { 687 return M4ERR_ALLOC; 688 } 689 *pRdrDataInterface = 690 (M4READER_DataInterface*)M4OSA_malloc( sizeof(M4READER_DataInterface), M4READER_WAV, 691 (M4OSA_Char *) "M4READER_PCM DataInterface"); 692 if (M4OSA_NULL == *pRdrDataInterface) 693 { 694 M4OSA_free((M4OSA_MemAddr32)*pRdrGlobalInterface); 695 return M4ERR_ALLOC; 696 } 697 698 *pMediaType = M4READER_kMediaTypePCM; 699 700 (*pRdrGlobalInterface)->m_pFctCreate = M4READER_PCM_create; 701 (*pRdrGlobalInterface)->m_pFctDestroy = M4READER_PCM_destroy; 702 (*pRdrGlobalInterface)->m_pFctOpen = M4READER_PCM_open; 703 (*pRdrGlobalInterface)->m_pFctClose = M4READER_PCM_close; 704 (*pRdrGlobalInterface)->m_pFctStart = M4OSA_NULL; 705 (*pRdrGlobalInterface)->m_pFctStop = M4OSA_NULL; 706 (*pRdrGlobalInterface)->m_pFctGetOption = M4READER_PCM_getOption; 707 (*pRdrGlobalInterface)->m_pFctSetOption = M4READER_PCM_setOption; 708 (*pRdrGlobalInterface)->m_pFctGetNextStream = M4READER_PCM_getNextStream; 709 (*pRdrGlobalInterface)->m_pFctFillAuStruct = M4READER_PCM_fillAuStruct; 710 (*pRdrGlobalInterface)->m_pFctJump = M4READER_PCM_jump; 711 (*pRdrGlobalInterface)->m_pFctReset = M4READER_PCM_reset; 712 (*pRdrGlobalInterface)->m_pFctGetPrevRapTime = M4OSA_NULL; /*all AUs are RAP*/ 713 714 (*pRdrDataInterface)->m_pFctGetNextAu = M4READER_PCM_getNextAu; 715 716 (*pRdrDataInterface)->m_readerContext = M4OSA_NULL; 717 718 return M4NO_ERROR; 719} 720 721 722