1/*---------------------------------------------------------------------------* 2 * riff.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 RIFF_H 21#define RIFF_H 22 23#include "ESR_ReturnCode.h" 24#include "plog.h" 25#include "passert.h" 26#include "pmemory.h" 27#include "SR_EventLogPrefix.h" 28 29#define AURORA_BYTES_SEC 5600 30 31/* standard codec IDs */ 32#define WAVEFORMAT_PCM 0x01 33#define WAVEFORMAT_ALAW 0x06 34#define WAVEFORMAT_MULAW 0x07 35 36/* swi-specific codec ID */ 37#define WAVEFORMAT_AURORA 0x99 38#define WAVEFORMAT_ES_202_050 0x9A 39 40/** 41 * WAV file format. 42 */ 43typedef struct 44{ 45 /** 46 * Codec ID. 47 */ 48 unsigned short nFormatTag; 49 /** 50 * The number of channels. 51 */ 52 unsigned short nChannels; 53 /** 54 * sampling rate: sample frames per sec. 55 */ 56 unsigned int nSamplesPerSec; 57 /** 58 * sampling rate * block alignment 59 */ 60 unsigned int nAvgBytesPerSec; 61 /** 62 * number of channels * bytes_per_sample 63 */ 64 unsigned short nBlockAlign; 65 /** 66 * bytes_per_sample * 8 (PCM-specific field) 67 */ 68 unsigned short wBitsPerSample; 69} 70WaveFormat; 71 72/** 73 * Generic start of every RIFF chunk. 74 */ 75typedef struct 76{ 77 /** 78 * 4-byte signature 79 */ 80 char ckString[4]; 81 /** 82 * Chunk length. 83 */ 84 int ckLength; 85} 86ChunkInfoStruct; 87 88/** 89 * RIFF Header. 90 */ 91typedef struct 92{ 93 /** 94 * "RIFF" 95 */ 96 char riffString[4]; 97 /** 98 * The length of the RIFF chunk. 99 */ 100 unsigned int riffChunkLength; 101 /** 102 * "WAVE" 103 */ 104 char waveString[4]; 105 /** 106 * "fmt " 107 */ 108 char fmtString[4]; 109 /** 110 * The length of the format chunk. 111 */ 112 unsigned int fmtChunkLength; 113 /** 114 * The audio format. 115 */ 116 WaveFormat waveinfo; 117 /** 118 * "data" 119 */ 120 char dataString[4]; 121 /** 122 * The length of the audio data section. 123 */ 124 unsigned int dataLength; 125} 126RiffHeaderStruct; 127 128/** 129 * An audio segment. 130 */ 131typedef struct 132{ 133 /** 134 * Position (byte #) where audio segment begins. 135 */ 136 int pos; 137 /** 138 * Length of audio segment. 139 */ 140 int len; 141 /** 142 * SWIrec_PACKET_SUPPRESSED or SWIrec_PACKET_LOST. 143 */ 144 int type; 145} 146RiffAudioTuple; 147 148/** 149 * For "supp" or "lost" chunk. 150 */ 151typedef struct 152{ 153 /** 154 * The number of audio tuples. 155 */ 156 int num_tuples; 157 /** 158 * The audio tuples. 159 */ 160 RiffAudioTuple *tuples; 161} 162SwiRiffAudio; 163 164/** 165 * Key-value pair. 166 */ 167typedef struct 168{ 169 /** 170 * e.g. "encoding" 171 */ 172 char *key; 173 /** 174 * e.g. "g723" 175 */ 176 char *value; 177} 178RiffKVPair; 179 180/** 181 * For "kval" chunk. 182 */ 183typedef struct 184{ 185 /** 186 * The number of key-value pairs. 187 */ 188 int num_pairs; 189 /** 190 * The key-value pairs. 191 */ 192 RiffKVPair *kvpairs; 193} 194SwiRiffKeyVals; 195 196/** 197 * A RIFF audio segment. 198 */ 199typedef struct 200{ 201 /** 202 * Special audio segments, lost or suppressed 203 */ 204 SwiRiffAudio segs; 205 /** 206 * Key-value pairs. 207 */ 208 SwiRiffKeyVals kvals; 209} 210SwiRiffStruct; 211 212 213SREC_EVENTLOG_API int isLittleEndian(void); 214 215SREC_EVENTLOG_API ESR_ReturnCode riffReadWave2L16( 216 FILE *f, 217 double from, 218 double to, 219 short **samples, 220 int *rate, 221 int *length, 222 SwiRiffStruct *swichunk); 223 224SREC_EVENTLOG_API ESR_ReturnCode convertBuf2Riff( 225 unsigned char *waveform, 226 unsigned int num_bytes, 227 wchar_t *audio_type, 228 int rate, 229 int bytes_per_sample, 230 SwiRiffStruct *swichunk, 231 unsigned char **buf, 232 unsigned int *buflen); 233 234SREC_EVENTLOG_API ESR_ReturnCode readRiff2Buf( 235 FILE *f, 236 void **waveform, 237 unsigned int *num_bytes, 238 const wchar_t **audio_type, 239 SwiRiffStruct *swichunk); 240 241SREC_EVENTLOG_API int isRiffFile(FILE *fp); 242SREC_EVENTLOG_API void free_swiRiff(SwiRiffStruct *swichunk); 243SREC_EVENTLOG_API char *getSwiRiffKVal(SwiRiffStruct *swichunk, char *key); 244#endif 245 246 247 248 249 250 251 252 253 254 255