JurassicParkTrespasser/jp2_pc/Source/Lib/Audio/AudioPCM.hpp
2018-01-01 23:07:24 +01:00

186 lines
5.6 KiB
C++

/***********************************************************************************************
*
* Copyright © DreamWorks Interactive. 1997
*
* Contents:
* CAudioPCM - PCM audio loading class
*
* Bugs:
*
* To do:
*
* Notes:
* The code contained within this file should be 100% thread safe, this is because
* streamed audio will be loaded from within a thread.
***********************************************************************************************
*
* $Log:: /JP2_PC/Source/Lib/Audio/AudioPCM.hpp $
*
* 4 8/04/98 3:58p Rwyatt
* New constructors for loaders for samples created from databases as the cau header is in the
* database index so does not need to be loaded
*
* 3 6/08/98 12:56p Rwyatt
* The database of a sample is now passed all the way down to the loader. This enables the
* loader to close the file correctly for databases with static file handles.
*
* 2 3/09/98 10:51p Rwyatt
* Uses the new constructor of the base class CCAULoad. This is to enable support of handled
* based sounds.
*
* 1 11/14/97 12:01a Rwyatt
* Loader for PCM audio data
*
***********************************************************************************************/
#ifndef HEADER_AUDIO_PCM_HPP
#define HEADER_AUDIO_PCM_HPP
#include "Lib/Audio/AudioLoader.hpp"
//**********************************************************************************************
//
class CAudioPCM : public CCAULoad
//
// prefix: pcm
//
//**************************************
{
public:
//******************************************************************************************
//
// Construct a PCM loader from data that is in memory or a memory mapped file
//
CAudioPCM(SCAUHeader& pcau) : CCAULoad(pcau)
{
u4SourceDataSize = 0;
pu1SourceData = NULL;
}
//******************************************************************************************
//
// Construct a PCM loader from a file or from an offset from within a file
//
CAudioPCM
(
CAudioDatabase* padat, // database holding the CAU file or NULL for a Win32 file
HANDLE h_file, // file handle
uint32 u4_fpos, // offset of the header in the specified file
SCAUHeader& cau // the header at the above offset
)
: CCAULoad(padat, h_file, u4_fpos, cau)
{
u4SourceDataSize = 0;
pu1SourceData = NULL;
}
protected:
//******************************************************************************************
// PCM Data members
//
uint8* pu1SourceData;
uint32 u4SourceDataSize;
//******************************************************************************************
//
// Decompression definitions, All audio compression classes must implement these functions
//
// Output Mono 8 Bit data, the u4_byte count will be a multiple of 1
//
virtual uint32 u4DecompressMono8bit(uint8* pu1_dst, uint32 u4_byte_count)
{
uint32 u4_bytes;
// if we have enough data in the buffer, copy it otherwise copy what is left.
u4_bytes = (u4SourceDataSize>=u4_byte_count)?u4_byte_count:u4SourceDataSize;
memcpy(pu1_dst, pu1SourceData, u4_bytes);
pu1SourceData+=u4_bytes;
u4SourceDataSize-=u4_bytes;
return u4_bytes;
}
//******************************************************************************************
// Output Mono 16 Bit data, the u4_byte count will be a multiple of 2
// Returns the number of bytes put into the output buffer
//
virtual uint32 u4DecompressMono16bit(uint8* pu1_dst, uint32 u4_byte_count)
{
uint32 u4_bytes;
// if we have enough data in the buffer, copy it otherwise copy what is left.
u4_bytes = (u4SourceDataSize>=u4_byte_count)?u4_byte_count:u4SourceDataSize;
memcpy(pu1_dst, pu1SourceData, u4_bytes);
pu1SourceData+=u4_bytes;
u4SourceDataSize-=u4_bytes;
return u4_bytes;
}
//******************************************************************************************
// Output Stereo 8 Bit data, the u4_byte count will be a multiple of 2
// Returns the number of bytes put into the output buffer
//
virtual uint32 u4DecompressStereo8bit(uint8* pu1_dst, uint32 u4_byte_count)
{
uint32 u4_bytes;
// if we have enough data in the buffer, copy it otherwise copy what is left.
u4_bytes = (u4SourceDataSize>=u4_byte_count)?u4_byte_count:u4SourceDataSize;
memcpy(pu1_dst, pu1SourceData, u4_bytes);
pu1SourceData+=u4_bytes;
u4SourceDataSize-=u4_bytes;
return u4_bytes;
}
//******************************************************************************************
// Output Stereo 16 Bit data, the u4_byte count will be a multiple of 4
// Returns the number of bytes put into the output buffer
//
virtual uint32 u4DecompressStereo16bit(uint8* pu1_dst, uint32 u4_byte_count)
{
uint32 u4_bytes;
// if we have enough data in the buffer, copy it otherwise copy what is left.
u4_bytes = (u4SourceDataSize>=u4_byte_count)?u4_byte_count:u4SourceDataSize;
memcpy(pu1_dst, pu1SourceData, u4_bytes);
pu1SourceData+=u4_bytes;
u4SourceDataSize-=u4_bytes;
return u4_bytes;
}
//******************************************************************************************
// Set the base address and size of the current block that is avaliable for decompressing
// Returns the number of bytes put into the output buffer
//
virtual void SetSampleSource(uint8* pu1_src, uint32 u4_src_len)
{
pu1SourceData = pu1_src;
u4SourceDataSize = u4_src_len;
}
//******************************************************************************************
// get the number of bytes remaining in the current block, or 0 if none.
//
virtual uint32 u4GetRemainingData()
{
return u4SourceDataSize;
}
};
#endif