/*
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 Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307 USA.
*/
/*
raw.c
This file contains code for reading and writing raw audio
data files.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "afinternal.h"
#include "audiofile.h"
#include "raw.h"
#include "util.h"
#include "setup.h"
_AFfilesetup _af_raw_default_filesetup =
{
_AF_VALID_FILESETUP, /* valid */
AF_FILE_RAWDATA, /* fileFormat */
AF_TRUE, /* trackSet */
AF_TRUE, /* instrumentSet */
AF_TRUE, /* miscellaneousSet */
1, /* trackCount */
NULL, /* tracks */
0, /* instrumentCount */
NULL, /* instruments */
0, /* miscellaneousCount */
NULL /* miscellaneous */
};
int _af_raw_compression_types[_AF_RAW_NUM_COMPTYPES] =
{
AF_COMPRESSION_G711_ULAW,
AF_COMPRESSION_G711_ALAW
};
bool _af_raw_recognize (AFvirtualfile *fh)
{
return AF_FALSE;
}
status _af_raw_read_init (AFfilesetup filesetup, AFfilehandle filehandle)
{
_Track *track;
if (filesetup == NULL)
{
_af_error(AF_BAD_FILEHANDLE, "a valid AFfilesetup is required for reading raw data");
return AF_FAIL;
}
if (_af_filesetup_make_handle(filesetup, filehandle) == AF_FAIL)
return AF_FAIL;
track = &filehandle->tracks[0];
/* 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;
filesize = af_flength(filehandle->fh);
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 / _af_format_frame_size(&track->f, AF_FALSE);
}
track->data_size = filesize;
}
return AF_SUCCEED;
}
status _af_raw_write_init (AFfilesetup filesetup, AFfilehandle filehandle)
{
_Track *track;
if (_af_filesetup_make_handle(filesetup, filehandle) == AF_FAIL)
return AF_FAIL;
track = &filehandle->tracks[0];
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 _af_raw_update (AFfilehandle filehandle)
{
return AF_SUCCEED;
}
AFfilesetup _af_raw_complete_setup (AFfilesetup setup)
{
AFfilesetup newSetup;
_TrackSetup *track;
if (setup->trackSet && setup->trackCount != 1)
{
_af_error(AF_BAD_FILESETUP, "raw file must have exactly one track");
return AF_NULL_FILESETUP;
}
if ((track = _af_filesetup_get_tracksetup(setup, AF_DEFAULT_TRACK)) == NULL)
{
_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 = _af_raw_default_filesetup;
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;
}
syntax highlighted by Code2HTML, v. 0.9.1