LVM_Buffers.c revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Author: nxp007753 $
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Revision: 1082 $
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Date: 2010-07-05 12:44:39 +0200 (Mon, 05 Jul 2010) $
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent*****************************************************************************************/
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                        */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Includes                                                                              */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                        */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Private.h"
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferManagedIn                                        */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Full buffer management allowing the user to provide input and output buffers on   */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  any alignment and with any number of samples. The alignment is corrected within     */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the buffer management and the samples are grouped in to blocks of the correct size  */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  before processing.                                                                  */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        -    Instance handle                                             */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pInData            -    Pointer to the input data stream                          */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pToProcess        -    Pointer to pointer to the start of data processing          */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pProcessed        -    Pointer to pointer to the destination of the processed data */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        -    Pointer to the number of samples to process               */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferManagedIn(LVM_Handle_t       hInstance,
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         const LVM_INT16    *pInData,
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LVM_INT16          **pToProcess,
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LVM_INT16          **pProcessed,
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LVM_UINT16         *pNumSamples)
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        SampleCount;           /* Number of samples to be processed this call */
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        NumSamples;            /* Number of samples in scratch buffer */
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        *pStart;
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t   *pInstance = (LVM_Instance_t  *)hInstance;
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Buffer_t     *pBuffer;
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        *pDest;
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        NumChannels =2;
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the processing address pointers
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pBuffer     = pInstance->pBufferManagement;
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pDest       = pBuffer->pScratch;
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pToProcess = pBuffer->pScratch;
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pProcessed = pBuffer->pScratch;
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if it is the first call of a block
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->SamplesToProcess == 0)
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * First call for a new block of samples
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->SamplesToProcess = (LVM_INT16)(*pNumSamples + pBuffer->InDelaySamples);
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pInputSamples    = (LVM_INT16 *)pInData;
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->BufferState        = LVM_FIRSTCALL;
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pStart = pInstance->pInputSamples;                       /* Pointer to the input samples */
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pBuffer->SamplesToOutput  = 0;                           /* Samples to output is same as number read for inplace processing */
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the number of samples to process this call and update the buffer state
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->SamplesToProcess > pInstance->InternalBlockSize)
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Process the maximum bock size of samples.
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        SampleCount = pInstance->InternalBlockSize;
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumSamples  = pInstance->InternalBlockSize;
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Last call for the block, so calculate how many frames and samples to process
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent          */
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_INT16   NumFrames;
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumSamples  = pInstance->SamplesToProcess;
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumFrames    = (LVM_INT16)(NumSamples >> MIN_INTERNAL_BLOCKSHIFT);
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        SampleCount = (LVM_INT16)(NumFrames << MIN_INTERNAL_BLOCKSHIFT);
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the buffer state
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->BufferState == LVM_FIRSTCALL)
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->BufferState = LVM_FIRSTLASTCALL;
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->BufferState = LVM_LASTCALL;
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pNumSamples = (LVM_UINT16)SampleCount;                        /* Set the number of samples to process this call */
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy samples from the delay buffer as required
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (((pBuffer->BufferState == LVM_FIRSTCALL) ||
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pBuffer->BufferState == LVM_FIRSTLASTCALL)) &&
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pBuffer->InDelaySamples != 0))
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Copy_16(&pBuffer->InDelayBuffer[0],                             /* Source */
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pDest,                                                  /* Destination */
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (LVM_INT16)(NumChannels*pBuffer->InDelaySamples));      /* Number of delay samples, left and right */
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumSamples = (LVM_INT16)(NumSamples - pBuffer->InDelaySamples); /* Update sample count */
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pDest += NumChannels * pBuffer->InDelaySamples;                 /* Update the destination pointer */
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the rest of the samples for this call from the input buffer
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (NumSamples > 0)
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Copy_16(pStart,                                             /* Source */
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pDest,                                              /* Destination */
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (LVM_INT16)(NumChannels*NumSamples));               /* Number of input samples */
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pStart += NumChannels * NumSamples;                         /* Update the input pointer */
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the input data pointer and samples to output
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->SamplesToOutput = (LVM_INT16)(pBuffer->SamplesToOutput + NumSamples); /* Update samples to output */
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      * Update the sample count and input pointer
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->SamplesToProcess  = (LVM_INT16)(pInstance->SamplesToProcess - SampleCount);      /* Update the count of samples */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pInputSamples     = pStart;                                                      /* Update input sample pointer */
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Save samples to the delay buffer if any left unprocessed
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pBuffer->BufferState == LVM_FIRSTLASTCALL) ||
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pBuffer->BufferState == LVM_LASTCALL))
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumSamples = pInstance->SamplesToProcess;
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pStart     = pBuffer->pScratch;                             /* Start of the buffer */
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pStart    += NumChannels*SampleCount;                       /* Offset by the number of processed samples */
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (NumSamples != 0)
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pStart,                                         /* Source */
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &pBuffer->InDelayBuffer[0],                     /* Destination */
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(NumChannels*NumSamples));           /* Number of input samples */
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the delay sample count
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->InDelaySamples     = NumSamples;                   /* Number of delay sample pairs */
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->SamplesToProcess = 0;                            /* All Samples used */
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferUnmanagedIn                                      */
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    This mode is selected by the user code and disables the buffer management with the */
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  exception of the maximum block size processing. The user must ensure that the       */
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  input and output buffers are 32-bit aligned and also that the number of samples to  */
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    process is a correct multiple of samples.                                         */
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        -    Instance handle                                             */
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pToProcess        -    Pointer to the start of data processing                     */
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pProcessed        -    Pointer to the destination of the processed data            */
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        -    Pointer to the number of samples to process               */
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferUnmanagedIn(LVM_Handle_t     hInstance,
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_INT16        **pToProcess,
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_INT16        **pProcessed,
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_UINT16       *pNumSamples)
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t    *pInstance = (LVM_Instance_t  *)hInstance;
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if this is the first call of a block
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->SamplesToProcess == 0)
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->SamplesToProcess = (LVM_INT16)*pNumSamples;       /* Get the number of samples on first call */
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pInputSamples    = *pToProcess;                   /* Get the I/O pointers */
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pOutputSamples    = *pProcessed;
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set te block size to process
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pInstance->SamplesToProcess > pInstance->InternalBlockSize)
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples = (LVM_UINT16)pInstance->InternalBlockSize;
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples = (LVM_UINT16)pInstance->SamplesToProcess;
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the process pointers
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pToProcess = pInstance->pInputSamples;
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pProcessed = pInstance->pOutputSamples;
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferOptimisedIn                                      */
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Optimised buffer management for the case where the data is outplace processing,   */
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    the output data is 32-bit aligned and there are sufficient samples to allow some  */
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    processing directly in the output buffer. This saves one data copy per sample     */
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    compared with the unoptimsed version.                                             */
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        -    Instance handle                                             */
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pInData            -    Pointer to the input data stream                          */
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pToProcess        -    Pointer to the start of data processing                     */
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pProcessed        -    Pointer to the destination of the processed data            */
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        -    Pointer to the number of samples to process               */
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferOptimisedIn(LVM_Handle_t         hInstance,
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           const LVM_INT16      *pInData,
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_INT16            **pToProcess,
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_INT16            **pProcessed,
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           LVM_UINT16           *pNumSamples)
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t   *pInstance = (LVM_Instance_t  *)hInstance;
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Buffer_t     *pBuffer    = pInstance->pBufferManagement;
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        *pDest;
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        SampleCount;
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        NumSamples;
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16        NumFrames;
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if it is the first call for this block
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->SamplesToProcess == 0)
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * First call for a new block of samples
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->BufferState = LVM_FIRSTCALL;
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pInputSamples    = (LVM_INT16 *)pInData;
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->SamplesToProcess = (LVM_INT16)*pNumSamples;
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->SamplesToOutput    = (LVM_INT16)*pNumSamples;
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pDest = *pProcessed;                                    /* The start of the output buffer */
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy the already processed samples to the output buffer
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->OutDelaySamples != 0)
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(&pBuffer->OutDelayBuffer[0],                    /* Source */
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                          /* Detsination */
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pBuffer->OutDelaySamples));       /* Number of delay samples */
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest += 2 * pBuffer->OutDelaySamples;                  /* Update the output pointer */
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->SamplesToOutput = (LVM_INT16)(pBuffer->SamplesToOutput - pBuffer->OutDelaySamples); /* Update the numbr of samples to output */
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pToProcess = pDest;                                    /* Set the address to start processing */
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pProcessed = pDest;                                    /* Process in the output buffer, now inplace */
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy the input delay buffer (unprocessed) samples to the output buffer
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->InDelaySamples != 0)
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(&pBuffer->InDelayBuffer[0],                     /* Source */
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                          /* Destination */
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pBuffer->InDelaySamples));        /* Number of delay samples */
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest += 2 * pBuffer->InDelaySamples;                   /* Update the output pointer */
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Calculate how many input samples to process and copy
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumSamples    = (LVM_INT16)(*pNumSamples - pBuffer->OutDelaySamples);  /* Number that will fit in the output buffer */
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (NumSamples >= pInstance->InternalBlockSize)
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples = pInstance->InternalBlockSize;
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NumFrames      = (LVM_INT16)(NumSamples >> MIN_INTERNAL_BLOCKSHIFT);
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        SampleCount   = (LVM_INT16)(NumFrames << MIN_INTERNAL_BLOCKSHIFT);
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pNumSamples  = (LVM_UINT16)SampleCount;                                        /* The number of samples to process */
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->SamplesToOutput = (LVM_INT16)(pBuffer->SamplesToOutput - SampleCount); /* Update the number of samples to output */
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        SampleCount   = (LVM_INT16)(SampleCount - pBuffer->InDelaySamples);             /* The number of samples to copy from the input */
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy samples from the input buffer and update counts and pointers
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Copy_16(pInstance->pInputSamples,                           /* Source */
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pDest,                                              /* Destination */
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (LVM_INT16)(2*SampleCount));                        /* Number of input samples */
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pInputSamples += 2 * SampleCount;                /* Update the input pointer */
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pOutputSamples = pDest + (2 * SampleCount);      /* Update the output pointer */
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->SamplesToProcess = (LVM_INT16)(pInstance->SamplesToProcess - SampleCount); /* Samples left in the input buffer */
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Second or subsequent call in optimised mode
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->SamplesToOutput >= MIN_INTERNAL_BLOCKSIZE)
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * More samples can be processed directly in the output buffer
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pToProcess = pInstance->pOutputSamples;                /* Set the address to start processing */
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pProcessed = pInstance->pOutputSamples;                /* Process in the output buffer, now inplace */
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples  = pBuffer->SamplesToOutput;                 /* Number that will fit in the output buffer */
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (NumSamples >= pInstance->InternalBlockSize)
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                NumSamples = pInstance->InternalBlockSize;
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumFrames      = (LVM_INT16)(NumSamples >> MIN_INTERNAL_BLOCKSHIFT);
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            SampleCount   = (LVM_INT16)(NumFrames << MIN_INTERNAL_BLOCKSHIFT);
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples  = (LVM_UINT16)SampleCount;            /* The number of samples to process */
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy samples from the input buffer and update counts and pointers
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pInstance->pInputSamples,                       /* Source */
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pInstance->pOutputSamples,                      /* Destination */
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*SampleCount));                    /* Number of input samples */
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pInputSamples += 2 * SampleCount;            /* Update the input pointer */
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pOutputSamples += 2 * SampleCount;           /* Update the output pointer */
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->SamplesToProcess = (LVM_INT16)(pInstance->SamplesToProcess - SampleCount);   /* Samples left in the input buffer */
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->SamplesToOutput = (LVM_INT16)(pBuffer->SamplesToOutput - SampleCount);         /* Number that will fit in the output buffer */
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * The remaining samples can not be processed in the output buffer
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->BufferState = LVM_LASTCALL;                    /* Indicate this is the last bock to process */
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pToProcess  = pBuffer->pScratch;                       /* Set the address to start processing */
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pProcessed  = pBuffer->pScratch;                       /* Process in the output buffer, now inplace */
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples   = pInstance->SamplesToProcess;             /* Number left to be processed */
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumFrames     = (LVM_INT16)(NumSamples >> MIN_INTERNAL_BLOCKSHIFT);
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            SampleCount  = (LVM_INT16)(NumFrames << MIN_INTERNAL_BLOCKSHIFT);
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples = (LVM_UINT16)SampleCount;                /* The number of samples to process */
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy samples from the input buffer and update counts and pointers
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pInstance->pInputSamples,                       /* Source */
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pBuffer->pScratch,                              /* Destination */
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*SampleCount));                    /* Number of input samples */
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pInputSamples += 2 * SampleCount;            /* Update the input pointer */
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->SamplesToProcess = (LVM_INT16)(pInstance->SamplesToProcess - SampleCount); /* Samples left in the input buffer */
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferIn                                               */
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    This function manages the data input, it has the following features:              */
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Accepts data in 16-bit aligned memory                                       */
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Copies the data to 32-bit aligned memory                                    */
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Converts Mono inputs to Mono-in-Stereo                                      */
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Accepts any number of samples as input, except 0                            */
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Breaks the input sample stream in to blocks of the configured frame size or */
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          multiples of the frame size                                                 */
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Limits the processing block size to the maximum block size.                 */
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Works with inplace or outplace processing automatically                     */
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  To manage the data the function has a number of operating states:                   */
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_FIRSTCALL        - The first call for this block of input samples         */
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_MAXBLOCKCALL    - The current block is the maximum size. Only used for the */
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                              second and subsequent blocks.                           */
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_LASTCALL        - The last call for this block of input samples           */
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_FIRSTLASTCALL    - This is the first and last call for this block of input*/
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                              samples, this occurs when the number of samples to      */
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                              process is less than the maximum block size.            */
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    The function uses an internal delay buffer the size of the minimum frame, this is */
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  used to temporarily hold samples when the number of samples to process is not a     */
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  multiple of the frame size.                                                         */
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    To ensure correct operation with inplace buffering the number of samples to output*/
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  per call is calculated in this function and is set to the number of samples read    */
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  from the input buffer.                                                              */
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    The total number of samples to process is stored when the function is called for  */
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the first time. The value is overwritten by the size of the block to be processed   */
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  in each call so the size of the processing blocks can be controlled. The number of  */
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    samples actually processed for each block of input samples is always a multiple of*/
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the frame size so for any particular block of input samples the actual number of    */
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  processed samples may not match the number of input samples, sometime it will be    */
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  sometimes less. The average is the same and the difference is never more than the   */
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  frame size.                                                                         */
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        -    Instance handle                                             */
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pInData            -    Pointer to the input data stream                          */
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pToProcess        -    Pointer to the start of data processing                     */
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  *pProcessed        -    Pointer to the destination of the processed data            */
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        -    Pointer to the number of samples to process               */
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferIn(LVM_Handle_t      hInstance,
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                  const LVM_INT16   *pInData,
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                  LVM_INT16         **pToProcess,
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                  LVM_INT16         **pProcessed,
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                  LVM_UINT16        *pNumSamples)
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t    *pInstance = (LVM_Instance_t  *)hInstance;
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check which mode, managed or unmanaged
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->InstParams.BufferMode == LVM_MANAGED_BUFFERS)
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferManagedIn(hInstance,
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pInData,
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pToProcess,
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pProcessed,
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pNumSamples);
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferUnmanagedIn(hInstance,
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pToProcess,
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pProcessed,
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pNumSamples);
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferManagedOut                                       */
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Full buffer management output. This works in conjunction with the managed input     */
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  routine and ensures the correct number of samples are always output to the output   */
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  buffer.                                                                             */
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        - Instance handle                                                */
5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pOutData        - Pointer to the output data stream                               */
5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        - Pointer to the number of samples to process                  */
5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferManagedOut(LVM_Handle_t        hInstance,
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                          LVM_INT16            *pOutData,
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                          LVM_UINT16        *pNumSamples)
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t  *pInstance  = (LVM_Instance_t  *)hInstance;
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Buffer_t    *pBuffer    = pInstance->pBufferManagement;
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       SampleCount = (LVM_INT16)*pNumSamples;
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       NumSamples;
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       *pStart;
5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       *pDest;
5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the pointers
5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    NumSamples = pBuffer->SamplesToOutput;
5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pStart     = pBuffer->pScratch;
5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * check if it is the first call of a block
5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      */
5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pBuffer->BufferState == LVM_FIRSTCALL) ||
5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pBuffer->BufferState == LVM_FIRSTLASTCALL))
5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* First call for a new block */
5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pOutputSamples = pOutData;                        /* Initialise the destination */
5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pDest = pInstance->pOutputSamples;                               /* Set the output address */
5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * If the number of samples is non-zero then there are still samples to send to
5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * the output buffer
5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((NumSamples != 0) &&
5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pBuffer->OutDelaySamples != 0))
5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy the delayed output buffer samples to the output
5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->OutDelaySamples <= NumSamples)
5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy all output delay samples to the output
5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(&pBuffer->OutDelayBuffer[0],                    /* Source */
5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                          /* Detsination */
5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pBuffer->OutDelaySamples));       /* Number of delay samples */
5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the pointer and sample counts
5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest += 2*pBuffer->OutDelaySamples;                                /* Output sample pointer */
5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples = (LVM_INT16)(NumSamples - pBuffer->OutDelaySamples);    /* Samples left to send */
5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->OutDelaySamples = 0;                                       /* No samples left in the buffer */
5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy only some of the ouput delay samples to the output
5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(&pBuffer->OutDelayBuffer[0],                    /* Source */
5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                          /* Detsination */
6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*NumSamples));                     /* Number of delay samples */
6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the pointer and sample counts
6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest += 2*NumSamples;                                                              /* Output sample pointer */
6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->OutDelaySamples = (LVM_INT16)(pBuffer->OutDelaySamples - NumSamples);      /* No samples left in the buffer */
6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Realign the delay buffer data to avoid using circular buffer management
6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(&pBuffer->OutDelayBuffer[2*NumSamples],         /* Source */
6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &pBuffer->OutDelayBuffer[0],                    /* Destination */
6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pBuffer->OutDelaySamples));       /* Number of samples to move */
6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples = 0;                                         /* Samples left to send */
6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the processed results to the output
6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((NumSamples != 0) &&
6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (SampleCount != 0))
6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (SampleCount <= NumSamples)
6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy all processed samples to the output
6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pStart,                                      /* Source */
6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                       /* Detsination */
6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*SampleCount));                 /* Number of processed samples */
6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the pointer and sample counts
6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest      += 2 * SampleCount;                          /* Output sample pointer */
6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples  = (LVM_INT16)(NumSamples - SampleCount);    /* Samples left to send */
6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            SampleCount = 0;                                        /* No samples left in the buffer */
6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Copy only some processed samples to the output
6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pStart,                                         /* Source */
6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pDest,                                          /* Destination */
6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*NumSamples));                     /* Number of processed samples */
6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the pointers and sample counts
6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent               */
6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pStart      += 2 * NumSamples;                          /* Processed sample pointer */
6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pDest        += 2 * NumSamples;                         /* Output sample pointer */
6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            SampleCount  = (LVM_INT16)(SampleCount - NumSamples);   /* Processed samples left */
6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            NumSamples   = 0;                                       /* Clear the sample count */
6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the remaining processed data to the output delay buffer
6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (SampleCount != 0)
6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Copy_16(pStart,                                                 /* Source */
6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                &pBuffer->OutDelayBuffer[2*pBuffer->OutDelaySamples],   /* Destination */
6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (LVM_INT16)(2*SampleCount));                            /* Number of processed samples */
6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pBuffer->OutDelaySamples = (LVM_INT16)(pBuffer->OutDelaySamples + SampleCount); /* Update the buffer count */
6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * pointers, counts and set default buffer processing
6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pBuffer->SamplesToOutput  = NumSamples;                         /* Samples left to send */
6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pOutputSamples = pDest;                              /* Output sample pointer */
6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pBuffer->BufferState      = LVM_MAXBLOCKCALL;                   /* Set for the default call block size */
6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pNumSamples = (LVM_UINT16)pInstance->SamplesToProcess;         /* This will terminate the loop when all samples processed */
6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferUnmanagedOut                                     */
6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This works in conjunction with the unmanaged input routine and updates the number   */
6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    of samples left to be processed    and adjusts the buffer pointers.               */
6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        - Instance handle                                                */
6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        - Pointer to the number of samples to process                  */
6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferUnmanagedOut(LVM_Handle_t        hInstance,
7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            LVM_UINT16          *pNumSamples)
7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance  = (LVM_Instance_t  *)hInstance;
7092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           NumChannels =2;
7102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update sample counts
7142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pInputSamples    += (LVM_INT16)(*pNumSamples * NumChannels); /* Update the I/O pointers */
7162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pOutputSamples   += (LVM_INT16)(*pNumSamples * 2);
7172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->SamplesToProcess  = (LVM_INT16)(pInstance->SamplesToProcess - *pNumSamples); /* Update the sample count */
7182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set te block size to process
7212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->SamplesToProcess > pInstance->InternalBlockSize)
7232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pNumSamples = (LVM_UINT16)pInstance->InternalBlockSize;
7252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
7272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pNumSamples = (LVM_UINT16)pInstance->SamplesToProcess;
7292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
7312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
7342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferOptimisedOut                                     */
7362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
7382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This works in conjunction with the optimised input routine and copies the last few  */
7392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  processed and unprocessed samples to their respective buffers.                      */
7402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
7422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        - Instance handle                                                */
7432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        - Pointer to the number of samples to process                  */
7442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
7462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
7472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
7492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
7502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
7512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferOptimisedOut(LVM_Handle_t    hInstance,
7532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            LVM_UINT16        *pNumSamples)
7542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
7552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance = (LVM_Instance_t  *)hInstance;
7572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Buffer_t        *pBuffer   = pInstance->pBufferManagement;
7582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if it is the last block to process
7612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pBuffer->BufferState == LVM_LASTCALL)
7632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_INT16    *pSrc = pBuffer->pScratch;
7652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy the unprocessed samples to the input delay buffer
7682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pInstance->SamplesToProcess != 0)
7702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pInstance->pInputSamples,                       /* Source */
7722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &pBuffer->InDelayBuffer[0],                     /* Destination */
7732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pInstance->SamplesToProcess));    /* Number of input samples */
7742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->InDelaySamples = pInstance->SamplesToProcess;
7752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->SamplesToProcess = 0;
7762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
7782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->InDelaySamples = 0;
7802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Fill the last empty spaces in the output buffer
7852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pBuffer->SamplesToOutput != 0)
7872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pSrc,                                           /* Source */
7892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pInstance->pOutputSamples,                      /* Destination */
7902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2*pBuffer->SamplesToOutput));       /* Number of input samples */
7912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples = (LVM_UINT16)(*pNumSamples - pBuffer->SamplesToOutput);
7922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pSrc += 2 * pBuffer->SamplesToOutput;                  /* Update scratch pointer */
7932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->SamplesToOutput = 0;                          /* No more samples in this block */
7942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Save any remaining processed samples in the output delay buffer
7992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
8002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (*pNumSamples != 0)
8012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
8022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Copy_16(pSrc,                                           /* Source */
8032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &pBuffer->OutDelayBuffer[0],                    /* Destination */
8042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)(2**pNumSamples));                   /* Number of input samples */
8052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->OutDelaySamples = (LVM_INT16)*pNumSamples;
8072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pNumSamples = 0;                                      /* No more samples in this block */
8092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
8112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
8122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pBuffer->OutDelaySamples = 0;
8132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
8162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
8192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVM_BufferOut                                              */
8212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
8232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function manages the data output, it has the following features:               */
8242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Output data to 16-bit aligned memory                                        */
8252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Reads data from 32-bit aligned memory                                       */
8262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Reads data only in blocks of frame size or multiples of frame size          */
8272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Writes the same number of samples as the LVM_BufferIn function reads        */
8282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        - Works with inplace or outplace processing automatically                     */
8292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  To manage the data the function has a number of operating states:                   */
8312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_FIRSTCALL        - The first call for this block of input samples         */
8322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        LVM_FIRSTLASTCALL    - This is the first and last call for this block of input*/
8332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                              samples, this occurs when the number of samples to      */
8342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                              process is less than the maximum block size.            */
8352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    The function uses an internal delay buffer the size of the minimum frame, this is */
8372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  used to temporarily hold samples when the number of samples to write is not a       */
8382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  multiple of the frame size.                                                         */
8392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    To ensure correct operation with inplace buffering the number of samples to output*/
8412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  per call is always the same as the number of samples read from the input buffer.    */
8422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
8442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance        - Instance handle                                                */
8452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pOutData        - Pointer to the output data stream                               */
8462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pNumSamples        - Pointer to the number of samples to process                  */
8472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
8492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    None                                                                              */
8502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
8522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
8542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_BufferOut(LVM_Handle_t     hInstance,
8562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                   LVM_INT16        *pOutData,
8572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                   LVM_UINT16       *pNumSamples)
8582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
8592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t    *pInstance  = (LVM_Instance_t  *)hInstance;
8612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
8642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check which mode, managed or unmanaged
8652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
8662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->InstParams.BufferMode == LVM_MANAGED_BUFFERS)
8672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferManagedOut(hInstance,
8692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             pOutData,
8702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             pNumSamples);
8712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
8732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferUnmanagedOut(hInstance,
8752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               pNumSamples);
8762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
8782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
879