183 lines
4.2 KiB
C++
183 lines
4.2 KiB
C++
/*
|
|
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;
|
|
}
|