1/*---------------------------------------------------------------------------* 2 * nisthdr.h * 3 * * 4 * Copyright 2007, 2008 Nuance Communciations, Inc. * 5 * * 6 * Licensed under the Apache License, Version 2.0 (the 'License'); * 7 * you may not use this file except in compliance with the License. * 8 * * 9 * You may obtain a copy of the License at * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, software * 13 * distributed under the License is distributed on an 'AS IS' BASIS, * 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 15 * See the License for the specific language governing permissions and * 16 * limitations under the License. * 17 * * 18 *---------------------------------------------------------------------------*/ 19 20#ifndef DO_CLEANUP_20070723 21#ifndef _NISTHDR_H_ 22#define _NISTHDR_H_ 23 24 25 26 27/** 28 * @todo document 29 */ 30class Nist1AHeader 31{ 32 public: 33 Nist1AHeader(void); 34 ~Nist1AHeader(void); 35 36 int read(PFile* pF); /* returns number of chars read, errno is set 37 // Bug: Reading a header does not mean that you can write it, the read 38 // information does not automatically transfer to the writing data.*/ 39 40 int write(PFile* pF); /* returns number of chars written, errno is set*/ 41 /* 42 // The fields are not constrained to contain values from these lists, 43 // but the existence of these lists makes it easy to use uniform naming. 44 // Use the enum to index into the matching array of strings. 45 */ 46 enum SampleFormatEnum {LINEAR_8BITS, LINEAR_16BITS}; 47 static char *mSampleFormatNames[]; 48 49 enum SexEnum 50 { 51 FEMALE, MALE 52 }; 53 static char *mSexNames[]; 54 55 enum SpeakerAccentEnum 56 { 57 AE 58 }; 59 static char *mSpeakerAccentNames[]; 60 61 enum MicrophoneEnum 62 { 63 SM10, PRIMO, TELEX_STICK, AKG_Q_400 64 }; 65 static char *mMicrophoneNames[]; 66 /* 67 // The procedure for adding a field to the header is: 68 // 1. add a name in FieldId, make it uppercase version of header entry 69 // 2. add a set function by adding declaration and definition using 70 // macro Nist1AHeaderSetDef 71 // 3. add a FieldDescription in mFieldsInit in .cpp file 72 // If you need a new data type (something besides d, l, f, or s) then 73 // you will also have to alter the union in field description and code 74 // in write() to size and print the type. Please provide predefined 75 // names with matching enums wherever possible as is done for 76 // MicrophoneNames, etc. 77 */ 78 enum FieldId 79 { 80 /* CAUTION: this order must match listing order in NistFields in cpp*/ 81 WAVE_SIZE, 82 SAMPLE_RATE, 83 SAMPLE_FORMAT, 84 COEF_EMPHASIS, 85 SPEAKER_NAME, 86 SPEAKER_AGE, 87 SPEAKER_SEX, 88 SPEAKER_ACCENT, 89 90 SPEAKING_MODE, 91 CHANNEL_COUNT, 92 SAMPLE_COUNT, 93 SAMPLE_MIN, 94 SAMPLE_MAX, 95 SAMPLE_N_BYTES, 96 SAMPLE_BYTE_FORMAT, 97 RECORD_DATE, 98 99 MICROPHONE, 100 MICROPHONE_POSITION, 101 RECORD_SITE, 102 DOS_PROGRAM, 103 DSP_PROGRAM, 104 LANGUAGE, 105 RECORD_TIME, 106 UTTERANCE_ID, 107 CHECK_SUM, 108 ALL_BYTE_CHECK_SUM, 109 JIN0_FRAME0, 110 AVERAGE_BACKGROUND, 111 AVERAGE_SPEECH, 112 SIGNAL_TO_NOISE, 113 PROMPT_TEXT, 114 PRONUNCIATION_TEXT, 115 RECORDING_MODE, 116 FEP_BEGSIL, 117 FEP_ENDSIL, 118 FEP_XBADJ, 119 END_HEAD /* needed to mark the end of this list*/ 120 }; 121 122 /* remove a particular field from the header (for writing only)*/ 123 void reset(FieldId id); 124 125 /* empties the header (for both reading and writing)*/ 126 void reset(void); 127 128 /* CAUTION: strings are not copied, only the pointer is saved*/ 129 void setWaveSize(long n); 130 void setSampleRate(int r);/* shouldn't it be double?*/ 131 void setSampleFormat(char *format); 132 void setCoefEmphasis(double c); 133 void setSpeakerName(char *name); 134 void setSpeakerAge(char *age);/*shouln't it be int?*/ 135 void setSpeakerSex(char *sex); 136 void setSpeakerAccent(char *accent); 137 138 void setSpeakingMode(char *mode); 139 void setChannelCount(int c); 140 void setSampleCount(long c); 141 void setSampleMin(int m); 142 void setSampleMax(int m); 143 void setSampleNBytes(int n); 144 void setSampleByteFormat(char *format); 145 void setRecordDate(char *date); 146 147 void setMicrophone(char *mic); 148 void setMicrophonePosition(char *micPos); 149 void setRecordSite(char *site); 150 void setDosProgram(char *name); 151 void setDspProgram(char *name); 152 void setLanguage(char *lang); 153 void setRecordTime(char *time); 154 void setUtteranceId(int n); 155 void setCheckSum(long sum); 156 void setAllByteCheckSum(long sum); 157 void setJin0Frame0(int n); 158 void setAverageBackground(int n); 159 void setAverageSpeech(int n); 160 void setSignalToNoiseRatio(int n); 161 void setPromptText(char *text); 162 void setPronunciationText(char *text); 163 void setRecordingMode(char *text); 164 void setFepBegSil(int n); 165 void setFepEndSil(int n); 166 void setFepXbadj(int n); 167 168 protected: 169 char mpCurrentTime[32]; 170 171 class FieldDescription 172 { 173 public: 174 char *mFormat; 175 char mType; 176 union 177 { 178 int d; 179 unsigned u; 180 long l; 181 double f; 182 char *s; 183 } mValue; 184 BOOL mbInUse; 185 }; 186 187 static FieldDescription mFieldsInit[]; 188 189 FieldDescription *mpFields; /* each instance gets a copy of mFieldsInit*/ 190}; 191 192inline void 193Nist1AHeader::reset(FieldId id) 194{ 195 mpFields[id].mbInUse = FALSE; 196} 197 198#define Nist1AHeaderSetDef(fname, argType, unionKey, fieldId)\ 199 inline void Nist1AHeader::##fname(argType x) {\ 200 mpFields[fieldId].mbInUse = TRUE;\ 201 mpFields[fieldId].mValue.##unionKey = x;} 202 203Nist1AHeaderSetDef(setWaveSize, long, l, WAVE_SIZE) 204Nist1AHeaderSetDef(setSampleRate, int, d, SAMPLE_RATE) 205Nist1AHeaderSetDef(setSampleFormat, char*, s, SAMPLE_FORMAT) 206Nist1AHeaderSetDef(setCoefEmphasis, double, f, COEF_EMPHASIS) 207Nist1AHeaderSetDef(setSpeakerName, char*, s, SPEAKER_NAME) 208Nist1AHeaderSetDef(setSpeakerAge, char*, s, SPEAKER_AGE) 209Nist1AHeaderSetDef(setSpeakerSex, char*, s, SPEAKER_SEX) 210Nist1AHeaderSetDef(setSpeakerAccent, char*, s, SPEAKER_ACCENT) 211 212Nist1AHeaderSetDef(setSpeakingMode, char*, s, SPEAKING_MODE) 213Nist1AHeaderSetDef(setChannelCount, int, d, CHANNEL_COUNT) 214Nist1AHeaderSetDef(setSampleCount, long, l, SAMPLE_COUNT) 215Nist1AHeaderSetDef(setSampleMin, int, d, SAMPLE_MIN) 216Nist1AHeaderSetDef(setSampleMax, int, d, SAMPLE_MAX) 217Nist1AHeaderSetDef(setSampleNBytes, int, d, SAMPLE_N_BYTES) 218Nist1AHeaderSetDef(setSampleByteFormat, char*, s, SAMPLE_BYTE_FORMAT) 219Nist1AHeaderSetDef(setRecordDate, char*, s, RECORD_DATE) 220 221Nist1AHeaderSetDef(setMicrophone, char*, s, MICROPHONE) 222Nist1AHeaderSetDef(setMicrophonePosition, char*, s, MICROPHONE_POSITION) 223Nist1AHeaderSetDef(setRecordSite, char*, s, RECORD_SITE) 224Nist1AHeaderSetDef(setDosProgram, char*, s, DOS_PROGRAM) 225Nist1AHeaderSetDef(setDspProgram, char*, s, DSP_PROGRAM) 226Nist1AHeaderSetDef(setLanguage, char*, s, LANGUAGE) 227Nist1AHeaderSetDef(setRecordTime, char*, s, RECORD_TIME) 228Nist1AHeaderSetDef(setUtteranceId, int, d, UTTERANCE_ID) 229Nist1AHeaderSetDef(setCheckSum, long, l, CHECK_SUM) 230Nist1AHeaderSetDef(setAllByteCheckSum, long, l, ALL_BYTE_CHECK_SUM) 231Nist1AHeaderSetDef(setJin0Frame0, int, d, JIN0_FRAME0) 232Nist1AHeaderSetDef(setAverageBackground, int, d, AVERAGE_BACKGROUND) 233Nist1AHeaderSetDef(setAverageSpeech, int, d, AVERAGE_SPEECH) 234Nist1AHeaderSetDef(setSignalToNoiseRatio, int, d, SIGNAL_TO_NOISE) 235Nist1AHeaderSetDef(setPromptText, char*, s, PROMPT_TEXT) 236Nist1AHeaderSetDef(setPronunciationText, char*, s, PRONUNCIATION_TEXT) 237Nist1AHeaderSetDef(setRecordingMode, char*, s, RECORDING_MODE) 238Nist1AHeaderSetDef(setFepBegSil, int, d, FEP_BEGSIL) 239Nist1AHeaderSetDef(setFepEndSil, int, d, FEP_ENDSIL) 240Nist1AHeaderSetDef(setFepXbadj, int, d, FEP_XBADJ) 241 242#undef Nist1AHeaderSetDef 243 244#endif 245#endif // DO_CLEANUP_20070723 246