107 lines
2.8 KiB
C++
107 lines
2.8 KiB
C++
|
|
|
|
#include "tsio_raw.h"
|
|
#include "tsound_t.h"
|
|
#include "tsystem.h"
|
|
#include "tfilepath_io.h"
|
|
using namespace std;
|
|
|
|
//==============================================================================
|
|
|
|
TSoundTrackReaderRaw::TSoundTrackReaderRaw(const TFilePath &fp)
|
|
: TSoundTrackReader(fp) {}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
TSoundTrackP TSoundTrackReaderRaw::load() {
|
|
Tifstream is(m_path);
|
|
|
|
if (!is)
|
|
throw TException(L"Unable to load the RAW file " + m_path.getWideString() +
|
|
L" : doesn't exist");
|
|
|
|
is.seekg(0, ios_base::end);
|
|
long sampleCount = is.tellg() / 2;
|
|
is.seekg(0, ios_base::beg);
|
|
|
|
TSoundTrack *track = new TSoundTrackMono16(22050, 1, sampleCount);
|
|
is.read((char *)track->getRawData(), sampleCount * 2);
|
|
return track;
|
|
}
|
|
|
|
//==============================================================================
|
|
|
|
TSoundTrackWriterRaw::TSoundTrackWriterRaw(const TFilePath &fp)
|
|
: TSoundTrackWriter(fp) {}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
bool TSoundTrackWriterRaw::save(const TSoundTrackP &track) {
|
|
TFileStatus fs(m_path);
|
|
if (fs.doesExist() && !fs.isWritable())
|
|
throw TException(L"Unable to save the soundtrack: " +
|
|
m_path.getWideString() + L" is read-only");
|
|
|
|
Tofstream os(m_path);
|
|
|
|
// inserisco i dati nell'output stream
|
|
|
|
// os << (ULONG) (track->getSampleCount()) << " ";
|
|
|
|
int sampleCount = track->getSampleCount();
|
|
int i;
|
|
|
|
switch (track->getChannelCount()) {
|
|
case 1: // mono
|
|
switch (track->getSampleSize()) {
|
|
case 1: // un byte per campione
|
|
{
|
|
const char *srcCharSamples = (char *)track->getRawData();
|
|
for (i = 0; i < sampleCount; i++) {
|
|
short sample = *(srcCharSamples + i);
|
|
os.write((char *)&sample, sizeof(short));
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 2: // due byte per campione
|
|
{
|
|
const short *srcShortSamples = (short *)track->getRawData();
|
|
for (i = 0; i < sampleCount; i++)
|
|
os.write((char *)(srcShortSamples + i), sizeof(short));
|
|
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2: // stereo
|
|
switch (track->getSampleSize()) {
|
|
case 2: // due byte per campione, un byte per canale
|
|
{
|
|
// considera solo il canale sinistro
|
|
const char *srcCharSamples = (char *)track->getRawData();
|
|
for (i = 0; i < sampleCount; i += 2) {
|
|
short sample = *(srcCharSamples + i);
|
|
os.write((char *)&sample, sizeof(short));
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 4: // quattro byte per campione, due byte per canale
|
|
{
|
|
// considera solo il canale sinistro
|
|
const short *srcShortSamples = (short *)track->getRawData();
|
|
for (i = 0; i < sampleCount; i += 2)
|
|
os.write((char *)(srcShortSamples + i), sizeof(short));
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|