blob: c73b5f267106e1571ef15263a167794adc169bda [file] [log] [blame]
/*---------------------------------------------------------------------------*
* nisthdr.h *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#ifndef DO_CLEANUP_20070723
#ifndef _NISTHDR_H_
#define _NISTHDR_H_
/**
* @todo document
*/
class Nist1AHeader
{
public:
Nist1AHeader(void);
~Nist1AHeader(void);
int read(PFile* pF); /* returns number of chars read, errno is set
// Bug: Reading a header does not mean that you can write it, the read
// information does not automatically transfer to the writing data.*/
int write(PFile* pF); /* returns number of chars written, errno is set*/
/*
// The fields are not constrained to contain values from these lists,
// but the existence of these lists makes it easy to use uniform naming.
// Use the enum to index into the matching array of strings.
*/
enum SampleFormatEnum {LINEAR_8BITS, LINEAR_16BITS};
static char *mSampleFormatNames[];
enum SexEnum
{
FEMALE, MALE
};
static char *mSexNames[];
enum SpeakerAccentEnum
{
AE
};
static char *mSpeakerAccentNames[];
enum MicrophoneEnum
{
SM10, PRIMO, TELEX_STICK, AKG_Q_400
};
static char *mMicrophoneNames[];
/*
// The procedure for adding a field to the header is:
// 1. add a name in FieldId, make it uppercase version of header entry
// 2. add a set function by adding declaration and definition using
// macro Nist1AHeaderSetDef
// 3. add a FieldDescription in mFieldsInit in .cpp file
// If you need a new data type (something besides d, l, f, or s) then
// you will also have to alter the union in field description and code
// in write() to size and print the type. Please provide predefined
// names with matching enums wherever possible as is done for
// MicrophoneNames, etc.
*/
enum FieldId
{
/* CAUTION: this order must match listing order in NistFields in cpp*/
WAVE_SIZE,
SAMPLE_RATE,
SAMPLE_FORMAT,
COEF_EMPHASIS,
SPEAKER_NAME,
SPEAKER_AGE,
SPEAKER_SEX,
SPEAKER_ACCENT,
SPEAKING_MODE,
CHANNEL_COUNT,
SAMPLE_COUNT,
SAMPLE_MIN,
SAMPLE_MAX,
SAMPLE_N_BYTES,
SAMPLE_BYTE_FORMAT,
RECORD_DATE,
MICROPHONE,
MICROPHONE_POSITION,
RECORD_SITE,
DOS_PROGRAM,
DSP_PROGRAM,
LANGUAGE,
RECORD_TIME,
UTTERANCE_ID,
CHECK_SUM,
ALL_BYTE_CHECK_SUM,
JIN0_FRAME0,
AVERAGE_BACKGROUND,
AVERAGE_SPEECH,
SIGNAL_TO_NOISE,
PROMPT_TEXT,
PRONUNCIATION_TEXT,
RECORDING_MODE,
FEP_BEGSIL,
FEP_ENDSIL,
FEP_XBADJ,
END_HEAD /* needed to mark the end of this list*/
};
/* remove a particular field from the header (for writing only)*/
void reset(FieldId id);
/* empties the header (for both reading and writing)*/
void reset(void);
/* CAUTION: strings are not copied, only the pointer is saved*/
void setWaveSize(long n);
void setSampleRate(int r);/* shouldn't it be double?*/
void setSampleFormat(char *format);
void setCoefEmphasis(double c);
void setSpeakerName(char *name);
void setSpeakerAge(char *age);/*shouln't it be int?*/
void setSpeakerSex(char *sex);
void setSpeakerAccent(char *accent);
void setSpeakingMode(char *mode);
void setChannelCount(int c);
void setSampleCount(long c);
void setSampleMin(int m);
void setSampleMax(int m);
void setSampleNBytes(int n);
void setSampleByteFormat(char *format);
void setRecordDate(char *date);
void setMicrophone(char *mic);
void setMicrophonePosition(char *micPos);
void setRecordSite(char *site);
void setDosProgram(char *name);
void setDspProgram(char *name);
void setLanguage(char *lang);
void setRecordTime(char *time);
void setUtteranceId(int n);
void setCheckSum(long sum);
void setAllByteCheckSum(long sum);
void setJin0Frame0(int n);
void setAverageBackground(int n);
void setAverageSpeech(int n);
void setSignalToNoiseRatio(int n);
void setPromptText(char *text);
void setPronunciationText(char *text);
void setRecordingMode(char *text);
void setFepBegSil(int n);
void setFepEndSil(int n);
void setFepXbadj(int n);
protected:
char mpCurrentTime[32];
class FieldDescription
{
public:
char *mFormat;
char mType;
union
{
int d;
unsigned u;
long l;
double f;
char *s;
} mValue;
BOOL mbInUse;
};
static FieldDescription mFieldsInit[];
FieldDescription *mpFields; /* each instance gets a copy of mFieldsInit*/
};
inline void
Nist1AHeader::reset(FieldId id)
{
mpFields[id].mbInUse = FALSE;
}
#define Nist1AHeaderSetDef(fname, argType, unionKey, fieldId)\
inline void Nist1AHeader::##fname(argType x) {\
mpFields[fieldId].mbInUse = TRUE;\
mpFields[fieldId].mValue.##unionKey = x;}
Nist1AHeaderSetDef(setWaveSize, long, l, WAVE_SIZE)
Nist1AHeaderSetDef(setSampleRate, int, d, SAMPLE_RATE)
Nist1AHeaderSetDef(setSampleFormat, char*, s, SAMPLE_FORMAT)
Nist1AHeaderSetDef(setCoefEmphasis, double, f, COEF_EMPHASIS)
Nist1AHeaderSetDef(setSpeakerName, char*, s, SPEAKER_NAME)
Nist1AHeaderSetDef(setSpeakerAge, char*, s, SPEAKER_AGE)
Nist1AHeaderSetDef(setSpeakerSex, char*, s, SPEAKER_SEX)
Nist1AHeaderSetDef(setSpeakerAccent, char*, s, SPEAKER_ACCENT)
Nist1AHeaderSetDef(setSpeakingMode, char*, s, SPEAKING_MODE)
Nist1AHeaderSetDef(setChannelCount, int, d, CHANNEL_COUNT)
Nist1AHeaderSetDef(setSampleCount, long, l, SAMPLE_COUNT)
Nist1AHeaderSetDef(setSampleMin, int, d, SAMPLE_MIN)
Nist1AHeaderSetDef(setSampleMax, int, d, SAMPLE_MAX)
Nist1AHeaderSetDef(setSampleNBytes, int, d, SAMPLE_N_BYTES)
Nist1AHeaderSetDef(setSampleByteFormat, char*, s, SAMPLE_BYTE_FORMAT)
Nist1AHeaderSetDef(setRecordDate, char*, s, RECORD_DATE)
Nist1AHeaderSetDef(setMicrophone, char*, s, MICROPHONE)
Nist1AHeaderSetDef(setMicrophonePosition, char*, s, MICROPHONE_POSITION)
Nist1AHeaderSetDef(setRecordSite, char*, s, RECORD_SITE)
Nist1AHeaderSetDef(setDosProgram, char*, s, DOS_PROGRAM)
Nist1AHeaderSetDef(setDspProgram, char*, s, DSP_PROGRAM)
Nist1AHeaderSetDef(setLanguage, char*, s, LANGUAGE)
Nist1AHeaderSetDef(setRecordTime, char*, s, RECORD_TIME)
Nist1AHeaderSetDef(setUtteranceId, int, d, UTTERANCE_ID)
Nist1AHeaderSetDef(setCheckSum, long, l, CHECK_SUM)
Nist1AHeaderSetDef(setAllByteCheckSum, long, l, ALL_BYTE_CHECK_SUM)
Nist1AHeaderSetDef(setJin0Frame0, int, d, JIN0_FRAME0)
Nist1AHeaderSetDef(setAverageBackground, int, d, AVERAGE_BACKGROUND)
Nist1AHeaderSetDef(setAverageSpeech, int, d, AVERAGE_SPEECH)
Nist1AHeaderSetDef(setSignalToNoiseRatio, int, d, SIGNAL_TO_NOISE)
Nist1AHeaderSetDef(setPromptText, char*, s, PROMPT_TEXT)
Nist1AHeaderSetDef(setPronunciationText, char*, s, PRONUNCIATION_TEXT)
Nist1AHeaderSetDef(setRecordingMode, char*, s, RECORDING_MODE)
Nist1AHeaderSetDef(setFepBegSil, int, d, FEP_BEGSIL)
Nist1AHeaderSetDef(setFepEndSil, int, d, FEP_ENDSIL)
Nist1AHeaderSetDef(setFepXbadj, int, d, FEP_XBADJ)
#undef Nist1AHeaderSetDef
#endif
#endif // DO_CLEANUP_20070723