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