Files
Work/sample/FmtChnk.cpp
2024-08-07 09:16:27 -04:00

85 lines
3.3 KiB
C++

#include <sample/fmtchnk.hpp>
#include <common/mmreg.hpp>
FormatChunk &FormatChunk::operator=(const FormatChunk &someFormatChunk)
{
formatTag(someFormatChunk.formatTag());
channels(someFormatChunk.channels());
samplesPerSecond(someFormatChunk.samplesPerSecond());
averageBytesPerSecond(someFormatChunk.averageBytesPerSecond());
blockAlign(someFormatChunk.blockAlign());
bitsPerSample(someFormatChunk.bitsPerSample());
return *this;
}
bool FormatChunk::write(MemFile &memFile)
{
if(!mChunkID.write(memFile))return false;
if(!memFile.write((char*)&mSize,sizeof(mSize)))return false;
if(!memFile.write((char*)&mFormatTag,sizeof(mFormatTag)))return false;
if(!memFile.write((char*)&mChannels,sizeof(mChannels)))return false;
if(!memFile.write((char*)&mSamplesPerSecond,sizeof(mSamplesPerSecond)))return false;
if(!memFile.write((char*)&mAvgBytesPerSecond,sizeof(mAvgBytesPerSecond)))return false;
if(!memFile.write((char*)&mBlockAlign,sizeof(mBlockAlign)))return false;
if(!memFile.write((char*)&mBitsPerSample,sizeof(mBitsPerSample)))return false;
if(WAVE_FORMAT_ADPCM==formatTag())
{
mFormatChunkADPCM->write(memFile);
}
else
{
if(mExtraInfo.size()>0)
{
memFile.write((char*)(BYTE*)&mExtraInfo[0],mExtraInfo.size());
}
}
return true;
}
bool FormatChunk::read(FileHandle &handle)
{
int extraBytes;
if(!mChunkID.read(handle))return false;
if(!handle.read((BYTE*)&mSize,sizeof(mSize)))return false;
if(!handle.read((BYTE*)&mFormatTag,sizeof(mFormatTag)))return false;
if(!handle.read((BYTE*)&mChannels,sizeof(mChannels)))return false;
if(!handle.read((BYTE*)&mSamplesPerSecond,sizeof(mSamplesPerSecond)))return false;
if(!handle.read((BYTE*)&mAvgBytesPerSecond,sizeof(mAvgBytesPerSecond)))return false;
if(!handle.read((BYTE*)&mBlockAlign,sizeof(mBlockAlign)))return false;
if(!handle.read((BYTE*)&mBitsPerSample,sizeof(mBitsPerSample)))return false;
if(WAVE_FORMAT_ADPCM==formatTag())
{
mFormatChunkADPCM=new FormatChunkADPCM();
mFormatChunkADPCM.disposition(PointerDisposition::Delete);
if(!mFormatChunkADPCM->read(handle))return false;
}
else
{
extraBytes=mSize-(sizeof(mFormatTag)+sizeof(mChannels)+sizeof(mSamplesPerSecond)+sizeof(mAvgBytesPerSecond)+sizeof(mBlockAlign)+sizeof(mBitsPerSample));
if(extraBytes<0)extraBytes=0;
if(extraBytes)
{
mExtraInfo.size(extraBytes);
handle.read((BYTE*)&mExtraInfo[0],mExtraInfo.size());
}
}
return true;
}
String FormatChunk::toString(void)const
{
String strChunk;
strChunk+=String("<FORMATCHUNK>");
strChunk+=mChunkID.toString();
strChunk+=String(" Size=")+String().fromInt(mSize).quotes();
strChunk+=String(" FormatTag=")+String().fromInt(mFormatTag).quotes();
strChunk+=String(" Channels=")+String().fromInt(mChannels).quotes();
strChunk+=String(" SamplesPerSecond=")+String().fromInt(mSamplesPerSecond).quotes();
strChunk+=String(" AvgBytesPerSecond=")+String().fromInt(mAvgBytesPerSecond).quotes();
strChunk+=String(" BlockAlign=")+String().fromInt(mBlockAlign).quotes();
strChunk+=String(" BitsPerSample=")+String().fromInt(mBitsPerSample).quotes();
strChunk+=String(" ExtraInfo=")+String().fromInt(mExtraInfo.size()).quotes()+String("</FORMATCHUNK>");
if(WAVE_FORMAT_ADPCM==formatTag())strChunk+=((SmartPointer<FormatChunkADPCM>&)mFormatChunkADPCM)->toString();
return strChunk;
}