1 /* 2 Based on timidity/output.c 3 */ 4 5 #ifdef HAVE_CONFIG_H 6 #include "config.h" 7 #endif /* HAVE_CONFIG_H */ 8 #ifdef STDC_HEADERS 9 #include <string.h> 10 #include <ctype.h> 11 #elif HAVE_STRINGS_H 12 #include <strings.h> 13 #endif 14 #include "timidity.h" 15 #include "common.h" 16 #include "output.h" 17 #include "tables.h" 18 #include "controls.h" 19 #include "audio_cnv.h" 20 21 int audio_buffer_bits = DEFAULT_AUDIO_BUFFER_BITS; 22 23 /*****************************************************************/ 24 /* Some functions to convert signed 32-bit data to other formats */ 25 26 void s32tos8(int32 *lp, int32 c) 27 { 28 int8 *cp=(int8 *)(lp); 29 int32 l, i; 30 31 for(i = 0; i < c; i++) 32 { 33 l=(lp[i])>>(32-8-GUARD_BITS); 34 if (l>127) l=127; 35 else if (l<-128) l=-128; 36 cp[i] = (int8)(l); 37 } 38 } 39 40 void s32tou8(int32 *lp, int32 c) 41 { 42 uint8 *cp=(uint8 *)(lp); 43 int32 l, i; 44 45 for(i = 0; i < c; i++) 46 { 47 l=(lp[i])>>(32-8-GUARD_BITS); 48 if (l>127) l=127; 49 else if (l<-128) l=-128; 50 cp[i] = 0x80 ^ ((uint8) l); 51 } 52 } 53 54 void s32tos16(int32 *lp, int32 c) 55 { 56 int16 *sp=(int16 *)(lp); 57 int32 l, i; 58 59 for(i = 0; i < c; i++) 60 { 61 l=(lp[i])>>(32-16-GUARD_BITS); 62 if (l > 32767) l=32767; 63 else if (l<-32768) l=-32768; 64 sp[i] = (int16)(l); 65 } 66 } 67 68 void s32tou16(int32 *lp, int32 c) 69 { 70 uint16 *sp=(uint16 *)(lp); 71 int32 l, i; 72 73 for(i = 0; i < c; i++) 74 { 75 l=(lp[i])>>(32-16-GUARD_BITS); 76 if (l > 32767) l=32767; 77 else if (l<-32768) l=-32768; 78 sp[i] = 0x8000 ^ (uint16)(l); 79 } 80 } 81 82 void s32tos16x(int32 *lp, int32 c) 83 { 84 int16 *sp=(int16 *)(lp); 85 int32 l, i; 86 87 for(i = 0; i < c; i++) 88 { 89 l=(lp[i])>>(32-16-GUARD_BITS); 90 if (l > 32767) l=32767; 91 else if (l<-32768) l=-32768; 92 sp[i] = XCHG_SHORT((int16)(l)); 93 } 94 } 95 96 void s32tou16x(int32 *lp, int32 c) 97 { 98 uint16 *sp=(uint16 *)(lp); 99 int32 l, i; 100 101 for(i = 0; i < c; i++) 102 { 103 l=(lp[i])>>(32-16-GUARD_BITS); 104 if (l > 32767) l=32767; 105 else if (l<-32768) l=-32768; 106 sp[i] = XCHG_SHORT(0x8000 ^ (uint16)(l)); 107 } 108 } 109 110 #define MAX_24BIT_SIGNED (8388607) 111 #define MIN_24BIT_SIGNED (-8388608) 112 113 #define STORE_S24_LE(cp, l) *cp++ = l & 0xFF, *cp++ = l >> 8 & 0xFF, *cp++ = l >> 16 114 #define STORE_S24_BE(cp, l) *cp++ = l >> 16, *cp++ = l >> 8 & 0xFF, *cp++ = l & 0xFF 115 #define STORE_U24_LE(cp, l) *cp++ = l & 0xFF, *cp++ = l >> 8 & 0xFF, *cp++ = l >> 16 ^ 0x80 116 #define STORE_U24_BE(cp, l) *cp++ = l >> 16 ^ 0x80, *cp++ = l >> 8 & 0xFF, *cp++ = l & 0xFF 117 118 #ifdef LITTLE_ENDIAN 119 #define STORE_S24 STORE_S24_LE 120 #define STORE_S24X STORE_S24_BE 121 #define STORE_U24 STORE_U24_LE 122 #define STORE_U24X STORE_U24_BE 123 #else 124 #define STORE_S24 STORE_S24_BE 125 #define STORE_S24X STORE_S24_LE 126 #define STORE_U24 STORE_U24_BE 127 #define STORE_U24X STORE_U24_LE 128 #endif 129 130 void s32tos24(int32 *lp, int32 c) 131 { 132 uint8 *cp = (uint8 *)(lp); 133 int32 l, i; 134 135 for(i = 0; i < c; i++) 136 { 137 l = (lp[i]) >> (32 - 24 - GUARD_BITS); 138 l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED 139 : (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l; 140 STORE_S24(cp, l); 141 } 142 } 143 144 void s32tou24(int32 *lp, int32 c) 145 { 146 uint8 *cp = (uint8 *)(lp); 147 int32 l, i; 148 149 for(i = 0; i < c; i++) 150 { 151 l = (lp[i]) >> (32 - 24 - GUARD_BITS); 152 l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED 153 : (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l; 154 STORE_U24(cp, l); 155 } 156 } 157 158 void s32tos24x(int32 *lp, int32 c) 159 { 160 uint8 *cp = (uint8 *)(lp); 161 int32 l, i; 162 163 for(i = 0; i < c; i++) 164 { 165 l = (lp[i]) >> (32 - 24 - GUARD_BITS); 166 l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED 167 : (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l; 168 STORE_S24X(cp, l); 169 } 170 } 171 172 void s32tou24x(int32 *lp, int32 c) 173 { 174 uint8 *cp = (uint8 *)(lp); 175 int32 l, i; 176 177 for(i = 0; i < c; i++) 178 { 179 l = (lp[i]) >> (32 - 24 - GUARD_BITS); 180 l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED 181 : (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l; 182 STORE_U24X(cp, l); 183 } 184 } 185 186 void s32toulaw(int32 *lp, int32 c) 187 { 188 int8 *up=(int8 *)(lp); 189 int32 l, i; 190 191 for(i = 0; i < c; i++) 192 { 193 l=(lp[i])>>(32-16-GUARD_BITS); 194 if (l > 32767) l=32767; 195 else if (l<-32768) l=-32768; 196 up[i] = AUDIO_S2U(l); 197 } 198 } 199 200 void s32toalaw(int32 *lp, int32 c) 201 { 202 int8 *up=(int8 *)(lp); 203 int32 l, i; 204 205 for(i = 0; i < c; i++) 206 { 207 l=(lp[i])>>(32-16-GUARD_BITS); 208 if (l > 32767) l=32767; 209 else if (l<-32768) l=-32768; 210 up[i] = AUDIO_S2A(l); 211 } 212 } 213 214 /* return: number of bytes */ 215 int32 general_output_convert(int32 *buf, int32 count) 216 { 217 int32 bytes; 218 219 if(!(play_mode->encoding & PE_MONO)) 220 count *= 2; /* Stereo samples */ 221 bytes = count; 222 if(play_mode->encoding & PE_16BIT) 223 { 224 bytes *= 2; 225 if(play_mode->encoding & PE_BYTESWAP) 226 { 227 if(play_mode->encoding & PE_SIGNED) 228 s32tos16x(buf, count); 229 else 230 s32tou16x(buf, count); 231 } 232 else if(play_mode->encoding & PE_SIGNED) 233 s32tos16(buf, count); 234 else 235 s32tou16(buf, count); 236 } 237 else if(play_mode->encoding & PE_24BIT) { 238 bytes *= 3; 239 if(play_mode->encoding & PE_BYTESWAP) 240 { 241 if(play_mode->encoding & PE_SIGNED) 242 s32tos24x(buf, count); 243 else 244 s32tou24x(buf, count); 245 } else if(play_mode->encoding & PE_SIGNED) 246 s32tos24(buf, count); 247 else 248 s32tou24(buf, count); 249 } 250 else if(play_mode->encoding & PE_ULAW) 251 s32toulaw(buf, count); 252 else if(play_mode->encoding & PE_ALAW) 253 s32toalaw(buf, count); 254 else if(play_mode->encoding & PE_SIGNED) 255 s32tos8(buf, count); 256 else 257 s32tou8(buf, count); 258 return bytes; 259 } 260 261 int validate_encoding(int enc, int include_enc, int exclude_enc) 262 { 263 const char *orig_enc_name, *enc_name; 264 265 orig_enc_name = output_encoding_string(enc); 266 enc |= include_enc; 267 enc &= ~exclude_enc; 268 if(enc & (PE_ULAW|PE_ALAW)) 269 enc &= ~(PE_24BIT|PE_16BIT|PE_SIGNED|PE_BYTESWAP); 270 if(!(enc & PE_16BIT || enc & PE_24BIT)) 271 enc &= ~PE_BYTESWAP; 272 if(enc & PE_24BIT) 273 enc &= ~PE_16BIT; /* 24bit overrides 16bit */ 274 enc_name = output_encoding_string(enc); 275 if(strcmp(orig_enc_name, enc_name) != 0) 276 ctl->cmsg(CMSG_WARNING, VERB_NOISY, 277 "Notice: Audio encoding is changed `%s' to `%s'", 278 orig_enc_name, enc_name); 279 return enc; 280 } 281 282 int32 apply_encoding(int32 old_enc, int32 new_enc) 283 { 284 const int32 mutex_flags[] = { 285 PE_16BIT | PE_24BIT | PE_ULAW | PE_ALAW, 286 PE_BYTESWAP | PE_ULAW | PE_ALAW, 287 PE_SIGNED | PE_ULAW | PE_ALAW, 288 }; 289 int i; 290 291 for (i = 0; i < sizeof mutex_flags / sizeof mutex_flags[0]; i++) { 292 if (new_enc & mutex_flags[i]) 293 old_enc &= ~mutex_flags[i]; 294 } 295 return old_enc | new_enc; 296 } 297 298 const char *output_encoding_string(int enc) 299 { 300 if(enc & PE_MONO) 301 { 302 if(enc & PE_16BIT) 303 { 304 if(enc & PE_SIGNED) 305 return "16bit (mono)"; 306 else 307 return "unsigned 16bit (mono)"; 308 } 309 else if(enc & PE_24BIT) 310 { 311 if(enc & PE_SIGNED) 312 return "24bit (mono)"; 313 else 314 return "unsigned 24bit (mono)"; 315 } 316 else 317 { 318 if(enc & PE_ULAW) 319 return "U-law (mono)"; 320 else if(enc & PE_ALAW) 321 return "A-law (mono)"; 322 else if(enc & PE_SIGNED) 323 return "8bit (mono)"; 324 else 325 return "unsigned 8bit (mono)"; 326 } 327 } 328 else if(enc & PE_16BIT) 329 { 330 if(enc & PE_BYTESWAP) 331 { 332 if(enc & PE_SIGNED) 333 return "16bit (swap)"; 334 else 335 return "unsigned 16bit (swap)"; 336 } 337 else if(enc & PE_SIGNED) 338 return "16bit"; 339 else 340 return "unsigned 16bit"; 341 } 342 else if(enc & PE_24BIT) 343 { 344 if(enc & PE_SIGNED) 345 return "24bit"; 346 else 347 return "unsigned 24bit"; 348 } 349 else 350 if(enc & PE_ULAW) 351 return "U-law"; 352 else if(enc & PE_ALAW) 353 return "A-law"; 354 else if(enc & PE_SIGNED) 355 return "8bit"; 356 else 357 return "unsigned 8bit"; 358 /*NOTREACHED*/ 359 } 360 361 int get_encoding_sample_size(int32 enc) 362 { 363 int size = (enc & PE_MONO) ? 1 : 2; 364 365 if (enc & PE_24BIT) 366 size *= 3; 367 else if (enc & PE_16BIT) 368 size *= 2; 369 return size; 370 } 371