sm64pc/tools/audiofile-0.3.6/libaudiofile/Raw.cpp

183 lines
4.2 KiB
C++
Raw Normal View History

2020-05-05 12:15:53 +00:00
/*
Audio File Library
Copyright (C) 2000, Silicon Graphics, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA
*/
/*
Raw.cpp
This file contains code for reading and writing raw audio
data files.
*/
#include "config.h"
#include "Raw.h"
#include "File.h"
#include "Setup.h"
#include "Track.h"
#include "util.h"
static const _AFfilesetup rawDefaultFileSetup =
{
_AF_VALID_FILESETUP, // valid
AF_FILE_RAWDATA, // fileFormat
true, // trackSet
true, // instrumentSet
true, // miscellaneousSet
1, // trackCount
NULL, // tracks
0, // instrumentCount
NULL, // instruments
0, // miscellaneousCount
NULL // miscellaneous
};
const int _af_raw_compression_types[_AF_RAW_NUM_COMPTYPES] =
{
AF_COMPRESSION_G711_ULAW,
AF_COMPRESSION_G711_ALAW
};
bool RawFile::recognize(File *fh)
{
return false;
}
status RawFile::readInit(AFfilesetup filesetup)
{
if (!filesetup)
{
_af_error(AF_BAD_FILESETUP, "a valid AFfilesetup is required for reading raw data");
return AF_FAIL;
}
if (initFromSetup(filesetup) == AF_FAIL)
return AF_FAIL;
Track *track = getTrack();
/* Set the track's data offset. */
if (filesetup->tracks[0].dataOffsetSet)
track->fpos_first_frame = filesetup->tracks[0].dataOffset;
else
track->fpos_first_frame = 0;
/* Set the track's frame count. */
if (filesetup->tracks[0].frameCountSet)
{
track->totalfframes = filesetup->tracks[0].frameCount;
}
else
{
AFfileoffset filesize = m_fh->length();
if (filesize == -1)
track->totalfframes = -1;
else
{
/* Ensure that the data offset is valid. */
if (track->fpos_first_frame > filesize)
{
_af_error(AF_BAD_FILESETUP, "data offset is larger than file size");
return AF_FAIL;
}
filesize -= track->fpos_first_frame;
track->totalfframes = filesize / (int) _af_format_frame_size(&track->f, false);
}
track->data_size = filesize;
}
return AF_SUCCEED;
}
status RawFile::writeInit(AFfilesetup filesetup)
{
if (initFromSetup(filesetup) == AF_FAIL)
return AF_FAIL;
Track *track = getTrack();
track->totalfframes = 0;
if (filesetup->tracks[0].dataOffsetSet)
track->fpos_first_frame = filesetup->tracks[0].dataOffset;
else
track->fpos_first_frame = 0;
return AF_SUCCEED;
}
status RawFile::update()
{
return AF_SUCCEED;
}
AFfilesetup RawFile::completeSetup(AFfilesetup setup)
{
AFfilesetup newSetup;
if (setup->trackSet && setup->trackCount != 1)
{
_af_error(AF_BAD_FILESETUP, "raw file must have exactly one track");
return AF_NULL_FILESETUP;
}
TrackSetup *track = setup->getTrack();
if (!track)
{
_af_error(AF_BAD_FILESETUP, "could not access track in file setup");
return AF_NULL_FILESETUP;
}
if (track->aesDataSet)
{
_af_error(AF_BAD_FILESETUP, "raw file cannot have AES data");
return AF_NULL_FILESETUP;
}
if (track->markersSet && track->markerCount != 0)
{
_af_error(AF_BAD_NUMMARKS, "raw file cannot have markers");
return AF_NULL_FILESETUP;
}
if (setup->instrumentSet && setup->instrumentCount != 0)
{
_af_error(AF_BAD_NUMINSTS, "raw file cannot have instruments");
return AF_NULL_FILESETUP;
}
if (setup->miscellaneousSet && setup->miscellaneousCount != 0)
{
_af_error(AF_BAD_NUMMISC, "raw file cannot have miscellaneous data");
return AF_NULL_FILESETUP;
}
newSetup = (_AFfilesetup *) _af_malloc(sizeof (_AFfilesetup));
*newSetup = rawDefaultFileSetup;
newSetup->tracks = (TrackSetup *) _af_malloc(sizeof (TrackSetup));
newSetup->tracks[0] = setup->tracks[0];
newSetup->tracks[0].f.compressionParams = NULL;
newSetup->tracks[0].markerCount = 0;
newSetup->tracks[0].markers = NULL;
return newSetup;
}