1 /*---------------------------------------------------------------------------* 2 * sample.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 _h_sample_ 21 #define _h_sample_ 22 23 24 #include "all_defs.h" 25 #ifndef _RTT 26 #include "duk_io.h" 27 #endif 28 #include "front.h" 29 30 #ifdef _WIN32 31 #include "windows.h" 32 #endif 33 34 /* The known wave types here 35 */ 36 /* #define DEVICE_RAW_PCM 1 */ 37 /* #define DEVICE_MULAW 2 */ 38 #define FILE_FORMATTED 3 39 40 /* The known device (op) types here 41 */ 42 43 #define WAVE_DEVICE_INPUT 1 44 #define WAVE_DEVICE_OUTPUT 2 45 #define WAVE_FILE_INPUT 3 46 #define WAVE_FILE_OUTPUT 4 47 48 /* The known wave-file types are 49 ** RIFF (R), NIST (N), RAW-PCM (P), RAW-MU-LAW (M) 50 */ 51 52 #if !defined(_WIN32) /* TODO: do we want to support RIFF header files? */ 53 /* Add definition for use in RIFF header r/w */ 54 #if defined unix || defined PSOS || defined POSIX 55 /* VxWorks simulator defines DWORD and WORD already */ 56 #if !(defined(__vxworks) && (CPU & SIMNT)) 57 typedef asr_uint32_t DWORD; 58 #endif 59 typedef unsigned char BYTE; 60 /* following two lines does not help. It only works when WORD is defined by MACRO: #define WORD unsigned short */ 61 #ifdef WORD 62 #undef WORD 63 #endif 64 #if !(defined(__vxworks) && (CPU & SIMNT)) 65 typedef asr_uint16_t WORD; 66 #endif 67 #define WAVE_FORMAT_PCM 0x01 68 #endif 69 70 //typedef DWORD FOURCC; /* a four character code */ 71 #define MAKEFOURCC(ch0, ch1, ch2, ch3) ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) 72 #define mmioFOURCC MAKEFOURCC 73 74 /** 75 * @todo document 76 */ 77 typedef struct 78 { 79 WORD wFormatTag; 80 WORD nChannels; 81 DWORD nSamplesPerSec; 82 DWORD nAvgBytesPerSec; 83 WORD nBlockAlign; 84 } 85 WAVEFORMAT; 86 87 /** 88 * @todo document 89 */ 90 typedef struct 91 { 92 WAVEFORMAT wf; 93 WORD wBitsPerSample; 94 } 95 PCMWAVEFORMAT; 96 #else 97 /* disable nameless union/struct warning in mmsytem.h but restore them to 98 disallow such code of our own. 99 */ 100 #pragma warning (push) 101 #pragma warning (disable: 4201) 102 #include <mmsystem.h> 103 #pragma warning (pop) 104 #endif 105 106 107 #ifndef _RTT 108 109 /** 110 * @todo document 111 */ 112 typedef struct 113 { 114 char typ; /* R (RIFF), N (NIST), P (RAW PCM) M (MU-LAW) */ 115 int op; /* read or write */ 116 int endian; /* 0 is little 1 is big */ 117 unsigned long len; /* length of file */ 118 PFile* file; /* pointer to file */ 119 char name[MAX_FILE_NAME]; /* file name */ 120 } 121 wav_file_info; 122 123 #endif 124 125 /** 126 * @todo document 127 */ 128 typedef struct 129 { 130 char typ; /* -Undefined as yet- */ 131 int op; /* read (i/p) or write (o/p) */ 132 } 133 wav_device_info; 134 135 /** 136 * @todo document 137 */ 138 typedef union { 139 #ifndef _RTT 140 wav_file_info file; 141 #endif 142 wav_device_info ext; 143 } gen_device_info; 144 145 #define MAXHISTBITS 33 /* one more than bitrange for signed */ 146 /* int bit usage - this could be 17 if */ 147 /* we assume shorts */ 148 149 /** 150 * @todo document 151 */ 152 typedef struct 153 { 154 int nsam; 155 int sum; 156 int sum2; 157 int sumsqu; 158 int sumsqu2; 159 int sumabs; 160 int sumabs2; 161 int highclip; 162 int lowclip; 163 int bithist[MAXHISTBITS]; 164 samdata highclip_level; 165 samdata lowclip_level; 166 int max_per10000_clip; 167 int max_dc_offset; 168 int high_noise_level_bit; 169 int low_speech_level_bit; 170 int min_samples; 171 } 172 wave_stats; 173 174 /** 175 * @todo document 176 */ 177 typedef struct 178 { 179 int wave_type; 180 int device_type; 181 int samplerate; 182 int frame_size; 183 int window_size; 184 int num_samples; 185 samdata *income; 186 samdata *outgo; 187 booldata initialised; 188 float scale; 189 int offset; 190 /* The channel object here is the set of data streams used in making frames. 191 IN CA, it is convenient to store channel as part of CA_Wave (wave_info). 192 It could have a many-to-one relationship with wave_info. */ 193 front_channel *channel; 194 gen_device_info device; 195 wave_stats stats; 196 booldata do_stats; 197 } 198 wave_info; 199 200 201 void reset_sig_check(wave_stats *ws); 202 void get_sig_check(wave_stats *ws, int *nsam, int *pclowclip, int *pchighclip, 203 int *dc_offset, int *amp, int *pc5, int *pc95, int* overflow); 204 void acc_wave_stats(wave_info* wave); 205 206 void create_sample_buffer(wave_info *wave, int frame_size, int window_size); 207 void free_sample_buffer(wave_info *wave); 208 #ifndef _RTT 209 int init_wavfile_stream(wave_info *wave, char *filename, int type); 210 int close_wavfile_stream(wave_info *wave); 211 int load_wavfile_data(wave_info* wave); 212 int save_wavfile_data(wave_info* wave); 213 int seek_wavfile_data(wave_info* wave, long offset, int origin); 214 int read_riff_header(PFile* waveFile, PCMWAVEFORMAT *pcmWaveFormat, unsigned long *datalen); 215 void add_riff_header(PFile* waveFile, int samplerate, int bitspersample); 216 void fix_riff_header(PFile* waveFile, int samplerate, int bitspersample); 217 #endif 218 void copy_wave_data(wave_info* dest, wave_info* src); 219 220 221 222 #endif 223