/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
//////////////////////////////////////////////////////////////////////////////
//                                                                          //
//  plSoundDeswizzler - Quick helper class to extract a single channel of   //
//                      data from stereo (or more)-channel data.            //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////

#include "hsTypes.h"
#include "plSoundDeswizzler.h"
#include <string.h>


plSoundDeswizzler::plSoundDeswizzler( void *srcPtr, UInt32 srcLength, UInt8 numChannels, UInt32 sampleSize )
{
    fNumSamples = srcLength / sampleSize;
    fSampleSize = sampleSize;
    fStride = fSampleSize * numChannels;
    fData = (UInt8 *)srcPtr;
    fOwnsData = false;
}

plSoundDeswizzler::plSoundDeswizzler( UInt32 srcLength, UInt8 numChannels, UInt32 sampleSize )
{
    fNumSamples = srcLength / sampleSize;
    fSampleSize = sampleSize;
    fStride = fSampleSize * numChannels;
    fData = TRACKED_NEW UInt8[ srcLength ];
    fOwnsData = true;
}

plSoundDeswizzler::~plSoundDeswizzler()
{
    if( fOwnsData )
        delete [] fData;
}

void    plSoundDeswizzler::Extract( UInt8 channelSelect, void *dest, UInt32 numBytesToProcess )
{
    UInt8   *srcPtr = fData + channelSelect * fSampleSize;
    UInt8   *destPtr = (UInt8 *)dest;
    UInt32  i;


    if( numBytesToProcess == 0 )
        numBytesToProcess = fNumSamples;
    else
        numBytesToProcess /= fStride;

    // Extract!
    for( i = 0; i < numBytesToProcess; i++ )
    {
        memcpy( destPtr, srcPtr, fSampleSize );
        destPtr += fSampleSize;
        srcPtr += fStride;
    }
}