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