blob: 38584503a6676c1a2a0e2111f3a196caea923bcc [file] [log] [blame]
/*
* Copyright (C) 2004-2010 NXP Software
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**********************************************************************************
INCLUDE FILES
***********************************************************************************/
#include "VectorArithmetic.h"
/**********************************************************************************
FUNCTION COPY_16
***********************************************************************************/
void Copy_16( const LVM_INT16 *src,
LVM_INT16 *dst,
LVM_INT16 n )
{
LVM_INT16 ii;
if (src > dst)
{
for (ii = n; ii != 0; ii--)
{
*dst = *src;
dst++;
src++;
}
}
else
{
src += n - 1;
dst += n - 1;
for (ii = n; ii != 0; ii--)
{
*dst = *src;
dst--;
src--;
}
}
return;
}
#ifdef BUILD_FLOAT
void Copy_Float( const LVM_FLOAT *src,
LVM_FLOAT *dst,
LVM_INT16 n )
{
LVM_INT16 ii;
if (src > dst)
{
for (ii = n; ii != 0; ii--)
{
*dst = *src;
dst++;
src++;
}
}
else
{
src += n - 1;
dst += n - 1;
for (ii = n; ii != 0; ii--)
{
*dst = *src;
dst--;
src--;
}
}
return;
}
#ifdef SUPPORT_MC
// Extract out the stereo channel pair from multichannel source.
void Copy_Float_Mc_Stereo(const LVM_FLOAT *src,
LVM_FLOAT *dst,
LVM_INT16 NrFrames, /* Number of frames */
LVM_INT32 NrChannels)
{
LVM_INT16 ii;
if (NrChannels >= 2)
{
for (ii = NrFrames; ii != 0; ii--)
{
dst[0] = src[0];
dst[1] = src[1];
dst += 2;
src += NrChannels;
}
}
else if (NrChannels == 1)
{ // not expected to occur, provided for completeness.
src += (NrFrames - 1);
dst += 2 * (NrFrames - 1);
for (ii = NrFrames; ii != 0; ii--)
{
dst[0] = src[0];
dst[1] = src[0];
dst -= 2;
src --;
}
}
}
// Merge a multichannel source with stereo contained in dst, to dst.
void Copy_Float_Stereo_Mc(const LVM_FLOAT *src,
LVM_FLOAT *dst,
LVM_INT16 NrFrames, /* Number of frames*/
LVM_INT32 NrChannels)
{
LVM_INT16 ii, jj;
LVM_FLOAT *src_st = dst + 2 * (NrFrames - 1);
// repack dst which carries stereo information
// together with the upper channels of src.
dst += NrChannels * (NrFrames - 1);
src += NrChannels * (NrFrames - 1);
for (ii = NrFrames; ii != 0; ii--)
{
dst[1] = src_st[1];
dst[0] = src_st[0]; // copy 1 before 0 is required for NrChannels == 3.
for (jj = 2; jj < NrChannels; jj++)
{
dst[jj] = src[jj];
}
dst -= NrChannels;
src -= NrChannels;
src_st -= 2;
}
}
#endif
#endif
/**********************************************************************************/