blob: cc1545985688b22f00ba55e1330c3ac0af08f981 [file] [log] [blame]
/*************************************************************************/
/* */
/* Language Technologies Institute */
/* Carnegie Mellon University */
/* Copyright (c) 1999 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author: Alan W Black (awb@cs.cmu.edu) */
/* Date: August 2000 */
/*************************************************************************/
/* */
/* Track i/o */
/* */
/*************************************************************************/
#include "cst_string.h"
#include "cst_endian.h"
#include "cst_tokenstream.h"
#include "cst_track.h"
int cst_track_save_est(cst_track *t, const char *filename)
{
cst_file fd;
int i,j;
if ((fd = cst_fopen(filename,CST_OPEN_WRITE|CST_OPEN_BINARY)) == NULL)
{
cst_errmsg("cst_track_save_est: can't open file \"%s\"\n",
filename);
return -1;
}
cst_fprintf(fd,"EST_File Track\n");
cst_fprintf(fd,"DataType ascii\n");
cst_fprintf(fd,"NumFrames %d\n",t->num_frames);
cst_fprintf(fd,"NumChannels %d\n",t->num_channels);
cst_fprintf(fd,"BreaksPresent true\n");
cst_fprintf(fd,"EST_Header_End\n");
for (i=0; i < t->num_frames; i++)
{
cst_fprintf(fd,"%f\t1 \t",t->times[i]);
for (j=0; j < t->num_channels; j++)
cst_fprintf(fd,"%f ",t->frames[i][j]);
cst_fprintf(fd,"\n");
}
cst_fclose(fd);
return 0;
}
int cst_track_save_est_binary(cst_track *t, const char *filename)
{
cst_file fd;
float foo;
int i,j;
if ((fd = cst_fopen(filename,CST_OPEN_WRITE|CST_OPEN_BINARY)) == NULL)
{
cst_errmsg("cst_track_save_est_binary: can't open file \"%s\"\n",
filename);
return -1;
}
cst_fprintf(fd,"EST_File Track\n");
cst_fprintf(fd,"DataType binary\n");
cst_fprintf(fd,"ByteOrder %s\n",
CST_LITTLE_ENDIAN ? BYTE_ORDER_LITTLE : BYTE_ORDER_BIG);
cst_fprintf(fd,"NumFrames %d\n",t->num_frames);
cst_fprintf(fd,"NumChannels %d\n",t->num_channels);
cst_fprintf(fd,"BreaksPresent true\n");
cst_fprintf(fd,"EST_Header_End\n");
foo = 1.0; /* put a bogus 'breaks' value in for now */
for (i=0; i < t->num_frames; i++)
{
cst_fwrite(fd, t->times + i, sizeof(float), 1);
cst_fwrite(fd, &foo, sizeof(float), 1);
for (j=0; j < t->num_channels; j++)
cst_fwrite(fd, &(t->frames[i][j]), sizeof(float), 1);
}
cst_fclose(fd);
return 0;
}
static int load_frame_ascii(cst_track *t, int i, cst_tokenstream *ts)
{
int j;
t->times[i] = cst_atof(ts_get(ts));
ts_get(ts); /* the can be only 1 */
for (j=0; j < t->num_channels; j++)
t->frames[i][j] = cst_atof(ts_get(ts));
if ((i+1 < t->num_frames) && (ts_eof(ts)))
{
return -1;
}
return 0;
}
static int load_frame_binary(cst_track *t, int i, cst_tokenstream *ts, int swap)
{
float val;
int j;
if (cst_fread(ts->fd, &val, sizeof(float), 1) != 1)
return -1;
if (swap)
swapfloat(&val);
t->times[i] = val;
/* Ignore the 'breaks' field */
if (cst_fread(ts->fd, &val, sizeof(float), 1) != 1)
return -1;
for (j=0; j < t->num_channels; j++)
{
if (cst_fread(ts->fd, &val, sizeof(float), 1) != 1)
return -1;
if (swap)
swapfloat(&val);
t->frames[i][j] = val;
}
return 0;
}
int cst_track_load_est(cst_track *t, const char *filename)
{
cst_tokenstream *ts;
const char *tok;
int num_frames,num_channels;
int i,ascii = 1,swap = 0,rv;
num_frames=0;
num_channels=0;
ts = ts_open(filename,NULL,NULL,NULL,NULL);
if (ts == NULL)
{
cst_errmsg("cst_track_load: can't open file \"%s\"\n",
filename);
return -1;
}
if (!cst_streq(ts_get(ts),"EST_File"))
{
cst_errmsg("cst_track_load: not an EST file \"%s\"\n",
filename);
ts_close(ts); return -1;
}
if (!cst_streq(ts_get(ts),"Track"))
{
cst_errmsg("cst_track_load: not an track file \"%s\"\n",
filename);
ts_close(ts); return -1;
}
while (!cst_streq("EST_Header_End",(tok=ts_get(ts))))
{
if (cst_streq("DataType",tok))
{
tok = ts_get(ts);
if (cst_streq("ascii",tok))
{
ascii = 1;
}
else if (cst_streq("binary",tok))
{
ascii = 0;
}
else
{
cst_errmsg("cst_track_load: don't know how to deal "
"with type \"%s\"\n", tok);
ts_close(ts);
return -1;
}
}
else if (cst_streq("ByteOrder",tok))
{
tok = ts_get(ts);
swap = (cst_streq(tok, BYTE_ORDER_BIG) && CST_LITTLE_ENDIAN)
|| (cst_streq(tok, BYTE_ORDER_LITTLE) && CST_BIG_ENDIAN);
}
else if (cst_streq("NumFrames",tok))
num_frames = atoi(ts_get(ts));
else if (cst_streq("NumChannels",tok))
num_channels = atoi(ts_get(ts));
else
ts_get(ts);
if (ts_eof(ts))
{
cst_errmsg("cst_track_load: EOF in header \"%s\"\n",
filename);
ts_close(ts); return -1;
}
}
cst_track_resize(t,num_frames,num_channels);
for (i=0; i < t->num_frames; i++)
{
if (ascii)
rv = load_frame_ascii(t, i, ts);
else
rv = load_frame_binary(t, i, ts, swap);
if (rv < 0)
{
ts_close(ts);
cst_errmsg("cst_track_load: EOF in data \"%s\"\n",
filename);
return rv;
}
}
ts_get(ts);
if (!ts_eof(ts))
{
cst_errmsg("cst_track_load: not EOF when expected \"%s\"\n",
filename);
ts_close(ts); return -1;
}
ts_close(ts);
return 0;
}