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