1 /* 2 format: routines to deal with audio (output) format 3 4 copyright 2008-20 by the mpg123 project - free software under the terms of the LGPL 2.1 5 see COPYING and AUTHORS files in distribution or http://mpg123.org 6 initially written by Thomas Orgis, starting with parts of the old audio.c, with only faintly manage to show now 7 8 A Major change from mpg123 <= 1.18 is that all encodings are only really 9 disabled when done so via specific build configuration. Otherwise, the 10 missing support of decoders to produce a certain format is augmented by 11 postprocessing that converts the samples. This means happily creating 12 data with higher resolution from less accurate decoder output. 13 14 The main point is to still offer float encoding when the decoding core uses 15 a fixed point representation that has only 16 bit output. Actually, that's 16 the only point: A fixed-point build needs to create float from 16 bit, also 17 32 or 24 bit from the same source. That's all there is to it: Everything else 18 is covered by fallback synth functions. It may be a further step to check if 19 there are cases where conversion in postprocessing works well enough to omit 20 a certain specialized decoder ... but usually, they are justified by some 21 special way to get from float to integer to begin with. 22 23 I won't cover the case of faking double output with float/s16 decoders here. 24 Double precision output is a thing for experimental builds anyway. Mostly 25 theoretical and without a point. 26 */ 27 28 #include "mpg123lib_intern.h" 29 #include "sample.h" 30 #include "debug.h" 31 32 /* static int chans[NUM_CHANNELS] = { 1 , 2 }; */ 33 static const long my_rates[MPG123_RATES] = /* only the standard rates */ 34 { 35 8000, 11025, 12000, 36 16000, 22050, 24000, 37 32000, 44100, 48000, 38 }; 39 40 static const int my_encodings[MPG123_ENCODINGS] = 41 { 42 MPG123_ENC_SIGNED_16, 43 MPG123_ENC_UNSIGNED_16, 44 MPG123_ENC_SIGNED_32, 45 MPG123_ENC_UNSIGNED_32, 46 MPG123_ENC_SIGNED_24, 47 MPG123_ENC_UNSIGNED_24, 48 /* Floating point range, see below. */ 49 MPG123_ENC_FLOAT_32, 50 MPG123_ENC_FLOAT_64, 51 /* 8 bit range, see below. */ 52 MPG123_ENC_SIGNED_8, 53 MPG123_ENC_UNSIGNED_8, 54 MPG123_ENC_ULAW_8, 55 MPG123_ENC_ALAW_8 56 }; 57 58 /* Make that match the above table. 59 And yes, I still don't like this kludgy stuff. */ 60 /* range[0] <= i < range[1] for forced floating point */ 61 static const int enc_float_range[2] = { 6, 8 }; 62 /* same for 8 bit encodings */ 63 static const int enc_8bit_range[2] = { 8, 12 }; 64 // for 24 bit quality (24 and 32 bit integers) 65 static const int enc_24bit_range[2] = { 2, 6 }; 66 // for completeness, the 16 bits 67 static const int enc_16bit_range[2] = { 0, 2}; 68 69 /* 70 Only one type of float is supported. 71 Actually, double is a very special experimental case not occuring in normal 72 builds. Might actually get rid of it. 73 74 Remember here: Also with REAL_IS_FIXED, I want to be able to produce float 75 output (f32) via post-processing. 76 */ 77 # ifdef REAL_IS_DOUBLE 78 # define MPG123_FLOAT_ENC MPG123_ENC_FLOAT_64 79 # else 80 # define MPG123_FLOAT_ENC MPG123_ENC_FLOAT_32 81 # endif 82 83 /* The list of actually possible encodings. */ 84 static const int good_encodings[] = 85 { 86 #ifndef NO_16BIT 87 MPG123_ENC_SIGNED_16, 88 MPG123_ENC_UNSIGNED_16, 89 #endif 90 #ifndef NO_32BIT 91 MPG123_ENC_SIGNED_32, 92 MPG123_ENC_UNSIGNED_32, 93 MPG123_ENC_SIGNED_24, 94 MPG123_ENC_UNSIGNED_24, 95 #endif 96 #ifndef NO_REAL 97 MPG123_FLOAT_ENC, 98 #endif 99 #ifndef NO_8BIT 100 MPG123_ENC_SIGNED_8, 101 MPG123_ENC_UNSIGNED_8, 102 MPG123_ENC_ULAW_8, 103 MPG123_ENC_ALAW_8 104 #endif 105 }; 106 107 /* Check if encoding is a valid one in this build. 108 ...lazy programming: linear search. */ 109 static int good_enc(const int enc) 110 { 111 size_t i; 112 for(i=0; i<sizeof(good_encodings)/sizeof(int); ++i) 113 if(enc == good_encodings[i]) return TRUE; 114 115 return FALSE; 116 } 117 118 void attribute_align_arg mpg123_rates(const long **list, size_t *number) 119 { 120 if(list != NULL) *list = my_rates; 121 if(number != NULL) *number = sizeof(my_rates)/sizeof(long); 122 } 123 124 /* Now that's a bit tricky... One build of the library knows only a subset of the encodings. */ 125 void attribute_align_arg mpg123_encodings(const int **list, size_t *number) 126 { 127 if(list != NULL) *list = good_encodings; 128 if(number != NULL) *number = sizeof(good_encodings)/sizeof(int); 129 } 130 131 int attribute_align_arg mpg123_encsize(int encoding) 132 { 133 return MPG123_SAMPLESIZE(encoding); 134 } 135 136 /* char audio_caps[NUM_CHANNELS][MPG123_RATES+1][MPG123_ENCODINGS]; */ 137 138 static int rate2num(mpg123_pars *mp, long r) 139 { 140 int i; 141 for(i=0;i<MPG123_RATES;i++) if(my_rates[i] == r) return i; 142 #ifndef NO_NTOM 143 if(mp && mp->force_rate != 0 && mp->force_rate == r) return MPG123_RATES; 144 #endif 145 146 return -1; 147 } 148 149 static int enc2num(int encoding) 150 { 151 int i; 152 for(i=0;i<MPG123_ENCODINGS;++i) 153 if(my_encodings[i] == encoding) return i; 154 155 return -1; 156 } 157 158 static int cap_fit(mpg123_pars *p, struct audioformat *nf, int f0, int f2) 159 { 160 int i; 161 int c = nf->channels-1; 162 int rn = rate2num(p, nf->rate); 163 if(rn >= 0) for(i=f0;i<f2;i++) 164 { 165 if(p->audio_caps[c][rn][i]) 166 { 167 nf->encoding = my_encodings[i]; 168 return 1; 169 } 170 } 171 return 0; 172 } 173 174 static int imin(int a, int b) 175 { 176 return a < b ? a : b; 177 } 178 179 static int imax(int a, int b) 180 { 181 return a > b ? a : b; 182 } 183 184 // Find a possible encoding with given rate and channel count, 185 // try differing channel count, too. 186 // This updates the given format and returns TRUE if an encoding 187 // was found. 188 static int enc_chan_fit( mpg123_pars *p, long rate, struct audioformat *nnf 189 , int f0, int f2, int try_float ) 190 { 191 #define ENCRANGE(range) imax(f0, range[0]), imin(f2, range[1]) 192 struct audioformat nf = *nnf; 193 nf.rate = rate; 194 if(cap_fit(p, &nf, ENCRANGE(enc_16bit_range))) 195 goto eend; 196 if(cap_fit(p, &nf, ENCRANGE(enc_24bit_range))) 197 goto eend; 198 if(try_float && 199 cap_fit(p, &nf, ENCRANGE(enc_float_range))) 200 goto eend; 201 if(cap_fit(p, &nf, ENCRANGE(enc_8bit_range))) 202 goto eend; 203 204 /* try again with different stereoness */ 205 if(nf.channels == 2 && !(p->flags & MPG123_FORCE_STEREO)) nf.channels = 1; 206 else if(nf.channels == 1 && !(p->flags & MPG123_FORCE_MONO)) nf.channels = 2; 207 208 if(cap_fit(p, &nf, ENCRANGE(enc_16bit_range))) 209 goto eend; 210 if(cap_fit(p, &nf, ENCRANGE(enc_24bit_range))) 211 goto eend; 212 if(try_float && 213 cap_fit(p, &nf, ENCRANGE(enc_float_range))) 214 goto eend; 215 if(cap_fit(p, &nf, ENCRANGE(enc_8bit_range))) 216 goto eend; 217 return FALSE; 218 eend: 219 *nnf = nf; 220 return TRUE; 221 #undef ENCRANGE 222 } 223 224 /* match constraints against supported audio formats, store possible setup in frame 225 return: -1: error; 0: no format change; 1: format change */ 226 int frame_output_format(mpg123_handle *fr) 227 { 228 struct audioformat nf; 229 int f0=0; 230 int f2=MPG123_ENCODINGS+1; // Include all encodings by default. 231 mpg123_pars *p = &fr->p; 232 int try_float = (p->flags & MPG123_FLOAT_FALLBACK) ? 0 : 1; 233 /* initialize new format, encoding comes later */ 234 nf.channels = fr->stereo; 235 236 // I intended the forcing stuff to be weaved into the format support table, 237 // but this probably will never happen, as this would change library behaviour. 238 // One could introduce an additional effective format table that takes for 239 // forcings into account, but that would have to be updated on any flag 240 // change. Tedious. 241 if(p->flags & MPG123_FORCE_8BIT) 242 { 243 f0 = enc_8bit_range[0]; 244 f2 = enc_8bit_range[1]; 245 } 246 if(p->flags & MPG123_FORCE_FLOAT) 247 { 248 try_float = 1; 249 f0 = enc_float_range[0]; 250 f2 = enc_float_range[1]; 251 } 252 253 /* force stereo is stronger */ 254 if(p->flags & MPG123_FORCE_MONO) nf.channels = 1; 255 if(p->flags & MPG123_FORCE_STEREO) nf.channels = 2; 256 257 // Strategy update: Avoid too early triggering of the NtoM decoder. 258 // Main target is the native rate, with any encoding. 259 // Then, native rate with any channel count and any encoding. 260 // Then, it's down_sample from native rate. 261 // As last resort: NtoM rate. 262 // So the priority is 1. rate 2. channels 3. encoding. 263 // As encodings go, 16 bit is tranditionally preferred as efficient choice. 264 // Next in line are wider float and integer encodings, then 8 bit as 265 // last resort. 266 267 #ifndef NO_NTOM 268 if(p->force_rate) 269 { 270 if(enc_chan_fit(p, p->force_rate, &nf, f0, f2, try_float)) 271 goto end; 272 // Keep the order consistent if float is considered fallback only. 273 if(!try_float && 274 enc_chan_fit(p, p->force_rate, &nf, f0, f2, TRUE)) 275 goto end; 276 277 merror( "Unable to set up output format! Constraints: %s%s%liHz." 278 , ( p->flags & MPG123_FORCE_STEREO ? "stereo, " : 279 (p->flags & MPG123_FORCE_MONO ? "mono, " : "") ) 280 , ( p->flags & MPG123_FORCE_FLOAT ? "float, " : 281 (p->flags & MPG123_FORCE_8BIT ? "8bit, " : "") ) 282 , p->force_rate ); 283 /* if(NOQUIET && p->verbose <= 1) print_capabilities(fr); */ 284 285 fr->err = MPG123_BAD_OUTFORMAT; 286 return -1; 287 } 288 #endif 289 // Native decoder rate first. 290 if(enc_chan_fit(p, frame_freq(fr)>>p->down_sample, &nf, f0, f2, try_float)) 291 goto end; 292 // Then downsamplings. 293 if(p->flags & MPG123_AUTO_RESAMPLE && p->down_sample < 2) 294 { 295 if(enc_chan_fit( p, frame_freq(fr)>>(p->down_sample+1), &nf 296 , f0, f2, try_float )) 297 goto end; 298 if(p->down_sample < 1 && enc_chan_fit( p, frame_freq(fr)>>2, &nf 299 , f0, f2, try_float )) 300 goto end; 301 } 302 // And again the whole deal with float fallback. 303 if(!try_float) 304 { 305 if(enc_chan_fit(p, frame_freq(fr)>>p->down_sample, &nf, f0, f2, TRUE)) 306 goto end; 307 // Then downsamplings. 308 if(p->flags & MPG123_AUTO_RESAMPLE && p->down_sample < 2) 309 { 310 if(enc_chan_fit( p, frame_freq(fr)>>(p->down_sample+1), &nf 311 , f0, f2, TRUE )) 312 goto end; 313 if(p->down_sample < 1 && enc_chan_fit( p, frame_freq(fr)>>2, &nf 314 , f0, f2, TRUE )) 315 goto end; 316 } 317 } 318 #ifndef NO_NTOM 319 // Try to find any rate that works and resample using NtoM hackery. 320 if( p->flags & MPG123_AUTO_RESAMPLE && fr->p.down_sample == 0) 321 { 322 int i; 323 int rn = rate2num(p, frame_freq(fr)); 324 int rrn; 325 if(rn < 0) return 0; 326 /* Try higher rates first. */ 327 for(rrn=rn+1; rrn<MPG123_RATES; ++rrn) 328 if(enc_chan_fit(p, my_rates[rrn], &nf, f0, f2, try_float)) 329 goto end; 330 /* Then lower rates. */ 331 for(i=f0;i<f2;i++) for(rrn=rn-1; rrn>=0; --rrn) 332 if(enc_chan_fit(p, my_rates[rrn], &nf, f0, f2, try_float)) 333 goto end; 334 // And again for float fallback. 335 if(!try_float) 336 { 337 /* Try higher rates first. */ 338 for(rrn=rn+1; rrn<MPG123_RATES; ++rrn) 339 if(enc_chan_fit(p, my_rates[rrn], &nf, f0, f2, TRUE)) 340 goto end; 341 /* Then lower rates. */ 342 for(i=f0;i<f2;i++) for(rrn=rn-1; rrn>=0; --rrn) 343 if(enc_chan_fit(p, my_rates[rrn], &nf, f0, f2, TRUE)) 344 goto end; 345 } 346 } 347 #endif 348 349 /* Here is the _bad_ end. */ 350 merror( "Unable to set up output format! Constraints: %s%s%li, %li or %liHz." 351 , ( p->flags & MPG123_FORCE_STEREO ? "stereo, " : 352 (p->flags & MPG123_FORCE_MONO ? "mono, " : "") ) 353 , ( p->flags & MPG123_FORCE_FLOAT ? "float, " : 354 (p->flags & MPG123_FORCE_8BIT ? "8bit, " : "") ) 355 , frame_freq(fr), frame_freq(fr)>>1, frame_freq(fr)>>2 ); 356 /* if(NOQUIET && p->verbose <= 1) print_capabilities(fr); */ 357 358 fr->err = MPG123_BAD_OUTFORMAT; 359 return -1; 360 361 end: /* Here is the _good_ end. */ 362 /* we had a successful match, now see if there's a change */ 363 if(nf.rate == fr->af.rate && nf.channels == fr->af.channels && nf.encoding == fr->af.encoding) 364 { 365 debug2("Old format with %i channels, and FORCE_MONO=%li", nf.channels, p->flags & MPG123_FORCE_MONO); 366 return 0; /* the same format as before */ 367 } 368 else /* a new format */ 369 { 370 debug1("New format with %i channels!", nf.channels); 371 fr->af.rate = nf.rate; 372 fr->af.channels = nf.channels; 373 fr->af.encoding = nf.encoding; 374 /* Cache the size of one sample in bytes, for ease of use. */ 375 fr->af.encsize = mpg123_encsize(fr->af.encoding); 376 if(fr->af.encsize < 1) 377 { 378 error1("Some unknown encoding??? (%i)", fr->af.encoding); 379 380 fr->err = MPG123_BAD_OUTFORMAT; 381 return -1; 382 } 383 /* Set up the decoder synth format. Might differ. */ 384 #ifdef NO_SYNTH32 385 /* Without high-precision synths, 16 bit signed is the basis for 386 everything higher than 8 bit. */ 387 if(fr->af.encsize > 2) 388 fr->af.dec_enc = MPG123_ENC_SIGNED_16; 389 else 390 { 391 #endif 392 switch(fr->af.encoding) 393 { 394 #ifndef NO_32BIT 395 case MPG123_ENC_SIGNED_24: 396 case MPG123_ENC_UNSIGNED_24: 397 case MPG123_ENC_UNSIGNED_32: 398 fr->af.dec_enc = MPG123_ENC_SIGNED_32; 399 break; 400 #endif 401 #ifndef NO_16BIT 402 case MPG123_ENC_UNSIGNED_16: 403 fr->af.dec_enc = MPG123_ENC_SIGNED_16; 404 break; 405 #endif 406 default: 407 fr->af.dec_enc = fr->af.encoding; 408 } 409 #ifdef NO_SYNTH32 410 } 411 #endif 412 fr->af.dec_encsize = mpg123_encsize(fr->af.dec_enc); 413 return 1; 414 } 415 } 416 417 int attribute_align_arg mpg123_format_none(mpg123_handle *mh) 418 { 419 int r; 420 if(mh == NULL) return MPG123_BAD_HANDLE; 421 422 r = mpg123_fmt_none(&mh->p); 423 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 424 425 return r; 426 } 427 428 int attribute_align_arg mpg123_fmt_none(mpg123_pars *mp) 429 { 430 if(mp == NULL) return MPG123_BAD_PARS; 431 432 if(PVERB(mp,3)) fprintf(stderr, "Note: Disabling all formats.\n"); 433 434 memset(mp->audio_caps,0,sizeof(mp->audio_caps)); 435 return MPG123_OK; 436 } 437 438 int attribute_align_arg mpg123_format_all(mpg123_handle *mh) 439 { 440 int r; 441 if(mh == NULL) return MPG123_BAD_HANDLE; 442 443 r = mpg123_fmt_all(&mh->p); 444 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 445 446 return r; 447 } 448 449 int attribute_align_arg mpg123_fmt_all(mpg123_pars *mp) 450 { 451 size_t rate, ch, enc; 452 if(mp == NULL) return MPG123_BAD_PARS; 453 454 if(PVERB(mp,3)) fprintf(stderr, "Note: Enabling all formats.\n"); 455 456 for(ch=0; ch < NUM_CHANNELS; ++ch) 457 for(rate=0; rate < MPG123_RATES+1; ++rate) 458 for(enc=0; enc < MPG123_ENCODINGS; ++enc) 459 mp->audio_caps[ch][rate][enc] = good_enc(my_encodings[enc]) ? 1 : 0; 460 461 return MPG123_OK; 462 } 463 464 int attribute_align_arg mpg123_format2(mpg123_handle *mh, long rate, int channels, int encodings) 465 { 466 int r; 467 if(mh == NULL) return MPG123_BAD_HANDLE; 468 r = mpg123_fmt2(&mh->p, rate, channels, encodings); 469 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 470 471 return r; 472 } 473 474 // Keep old behaviour. 475 int attribute_align_arg mpg123_format(mpg123_handle *mh, long rate, int channels, int encodings) 476 { 477 int r; 478 if(mh == NULL) return MPG123_BAD_HANDLE; 479 r = mpg123_fmt(&mh->p, rate, channels, encodings); 480 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 481 482 return r; 483 } 484 485 int attribute_align_arg mpg123_fmt2(mpg123_pars *mp, long rate, int channels, int encodings) 486 { 487 int ie, ic, ratei, r1, r2; 488 int ch[2] = {0, 1}; 489 if(mp == NULL) return MPG123_BAD_PARS; 490 if(!(channels & (MPG123_MONO|MPG123_STEREO))) return MPG123_BAD_CHANNEL; 491 492 if(PVERB(mp,3)) fprintf(stderr, "Note: Want to enable format %li/%i for encodings 0x%x.\n", rate, channels, encodings); 493 494 if(!(channels & MPG123_STEREO)) ch[1] = 0; /* {0,0} */ 495 else if(!(channels & MPG123_MONO)) ch[0] = 1; /* {1,1} */ 496 if(rate) 497 { 498 r1 = rate2num(mp, rate); 499 r2 = r1+1; 500 } 501 else 502 { 503 r1 = 0; 504 r2 = MPG123_RATES+1; /* including forced rate */ 505 } 506 507 if(r1 < 0) return MPG123_BAD_RATE; 508 509 /* now match the encodings */ 510 for(ratei = r1; ratei < r2; ++ratei) 511 for(ic = 0; ic < 2; ++ic) 512 { 513 for(ie = 0; ie < MPG123_ENCODINGS; ++ie) 514 if(good_enc(my_encodings[ie]) && ((my_encodings[ie] & encodings) == my_encodings[ie])) 515 mp->audio_caps[ch[ic]][ratei][ie] = 1; 516 517 if(ch[0] == ch[1]) break; /* no need to do it again */ 518 } 519 520 return MPG123_OK; 521 } 522 523 // Keep old behaviour, error on rate=0. 524 int attribute_align_arg mpg123_fmt(mpg123_pars *mp, long rate, int channels, int encodings) 525 { 526 return (rate == 0) 527 ? MPG123_BAD_RATE 528 : mpg123_fmt2(mp, rate, channels, encodings); 529 } 530 531 int attribute_align_arg mpg123_format_support(mpg123_handle *mh, long rate, int encoding) 532 { 533 if(mh == NULL) return 0; 534 else return mpg123_fmt_support(&mh->p, rate, encoding); 535 } 536 537 int attribute_align_arg mpg123_fmt_support(mpg123_pars *mp, long rate, int encoding) 538 { 539 int ch = 0; 540 int ratei, enci; 541 ratei = rate2num(mp, rate); 542 enci = enc2num(encoding); 543 if(mp == NULL || ratei < 0 || enci < 0) return 0; 544 if(mp->audio_caps[0][ratei][enci]) ch |= MPG123_MONO; 545 if(mp->audio_caps[1][ratei][enci]) ch |= MPG123_STEREO; 546 return ch; 547 } 548 549 /* Call this one to ensure that any valid format will be something different than this. */ 550 void invalidate_format(struct audioformat *af) 551 { 552 af->encoding = 0; 553 af->rate = 0; 554 af->channels = 0; 555 } 556 557 /* Number of bytes the decoder produces. */ 558 off_t decoder_synth_bytes(mpg123_handle *fr, off_t s) 559 { 560 return s * fr->af.dec_encsize * fr->af.channels; 561 } 562 563 /* Samples/bytes for output buffer after post-processing. */ 564 /* take into account: channels, bytes per sample -- NOT resampling!*/ 565 off_t samples_to_bytes(mpg123_handle *fr , off_t s) 566 { 567 return s * fr->af.encsize * fr->af.channels; 568 } 569 570 off_t bytes_to_samples(mpg123_handle *fr , off_t b) 571 { 572 return b / fr->af.encsize / fr->af.channels; 573 } 574 575 /* Number of bytes needed for decoding _and_ post-processing. */ 576 off_t outblock_bytes(mpg123_handle *fr, off_t s) 577 { 578 int encsize = (fr->af.encoding & MPG123_ENC_24) 579 ? 4 /* Intermediate 32 bit. */ 580 : (fr->af.encsize > fr->af.dec_encsize 581 ? fr->af.encsize 582 : fr->af.dec_encsize); 583 return s * encsize * fr->af.channels; 584 } 585 586 #ifndef NO_32BIT 587 588 /* Remove every fourth byte, facilitating conversion from 32 bit to 24 bit integers. 589 This has to be aware of endianness, of course. */ 590 static void chop_fourth_byte(struct outbuffer *buf) 591 { 592 unsigned char *wpos = buf->data; 593 unsigned char *rpos = buf->data; 594 size_t blocks = buf->fill/4; 595 size_t i; 596 for(i=0; i<blocks; ++i,wpos+=3,rpos+=4) 597 DROP4BYTE(wpos, rpos) 598 buf->fill = wpos-buf->data; 599 } 600 601 static void conv_s32_to_u32(struct outbuffer *buf) 602 { 603 size_t i; 604 int32_t *ssamples = (int32_t*) buf->data; 605 uint32_t *usamples = (uint32_t*) buf->data; 606 size_t count = buf->fill/sizeof(int32_t); 607 608 for(i=0; i<count; ++i) 609 usamples[i] = CONV_SU32(ssamples[i]); 610 } 611 612 #endif 613 614 615 /* We always assume that whole numbers are written! 616 partials will be cut out. */ 617 618 static const char *bufsizeerr = "Fatal: Buffer too small for postprocessing!"; 619 620 621 #ifndef NO_16BIT 622 623 static void conv_s16_to_u16(struct outbuffer *buf) 624 { 625 size_t i; 626 int16_t *ssamples = (int16_t*) buf->data; 627 uint16_t *usamples = (uint16_t*)buf->data; 628 size_t count = buf->fill/sizeof(int16_t); 629 630 for(i=0; i<count; ++i) 631 usamples[i] = CONV_SU16(ssamples[i]); 632 } 633 634 #ifndef NO_REAL 635 static void conv_s16_to_f32(struct outbuffer *buf) 636 { 637 ssize_t i; 638 int16_t *in = (int16_t*) buf->data; 639 float *out = (float*) buf->data; 640 size_t count = buf->fill/sizeof(int16_t); 641 /* Does that make any sense? In x86, there is an actual instruction to divide 642 float by integer ... but then, if we have that FPU, we don't really need 643 fixed point decoder hacks ...? */ 644 float scale = 1./SHORT_SCALE; 645 646 if(buf->size < count*sizeof(float)) 647 { 648 error1("%s", bufsizeerr); 649 return; 650 } 651 652 /* Work from the back since output is bigger. */ 653 for(i=count-1; i>=0; --i) 654 out[i] = (float)in[i] * scale; 655 656 buf->fill = count*sizeof(float); 657 } 658 #endif 659 660 #ifndef NO_32BIT 661 static void conv_s16_to_s32(struct outbuffer *buf) 662 { 663 ssize_t i; 664 int16_t *in = (int16_t*) buf->data; 665 int32_t *out = (int32_t*) buf->data; 666 size_t count = buf->fill/sizeof(int16_t); 667 668 if(buf->size < count*sizeof(int32_t)) 669 { 670 error1("%s", bufsizeerr); 671 return; 672 } 673 674 /* Work from the back since output is bigger. */ 675 for(i=count-1; i>=0; --i) 676 { 677 out[i] = in[i]; 678 /* Could just shift bytes, but would have to mess with sign bit. */ 679 out[i] *= S32_RESCALE; 680 } 681 682 buf->fill = count*sizeof(int32_t); 683 } 684 #endif 685 #endif 686 687 #include "swap_bytes_impl.h" 688 689 void swap_endian(struct outbuffer *buf, int block) 690 { 691 size_t count; 692 693 if(block >= 2) 694 { 695 count = buf->fill/(unsigned int)block; 696 swap_bytes(buf->data, (size_t)block, count); 697 } 698 } 699 700 void postprocess_buffer(mpg123_handle *fr) 701 { 702 /* 703 This caters for the final output formats that are never produced by 704 decoder synth directly (wide unsigned and 24 bit formats) or that are 705 missing because of limited decoder precision (16 bit synth but 32 or 706 24 bit output). 707 */ 708 switch(fr->af.dec_enc) 709 { 710 #ifndef NO_32BIT 711 case MPG123_ENC_SIGNED_32: 712 switch(fr->af.encoding) 713 { 714 case MPG123_ENC_UNSIGNED_32: 715 conv_s32_to_u32(&fr->buffer); 716 break; 717 case MPG123_ENC_UNSIGNED_24: 718 conv_s32_to_u32(&fr->buffer); 719 chop_fourth_byte(&fr->buffer); 720 break; 721 case MPG123_ENC_SIGNED_24: 722 chop_fourth_byte(&fr->buffer); 723 break; 724 } 725 break; 726 #endif 727 #ifndef NO_16BIT 728 case MPG123_ENC_SIGNED_16: 729 switch(fr->af.encoding) 730 { 731 case MPG123_ENC_UNSIGNED_16: 732 conv_s16_to_u16(&fr->buffer); 733 break; 734 #ifndef NO_REAL 735 case MPG123_ENC_FLOAT_32: 736 conv_s16_to_f32(&fr->buffer); 737 break; 738 #endif 739 #ifndef NO_32BIT 740 case MPG123_ENC_SIGNED_32: 741 conv_s16_to_s32(&fr->buffer); 742 break; 743 case MPG123_ENC_UNSIGNED_32: 744 conv_s16_to_s32(&fr->buffer); 745 conv_s32_to_u32(&fr->buffer); 746 break; 747 case MPG123_ENC_UNSIGNED_24: 748 conv_s16_to_s32(&fr->buffer); 749 conv_s32_to_u32(&fr->buffer); 750 chop_fourth_byte(&fr->buffer); 751 break; 752 case MPG123_ENC_SIGNED_24: 753 conv_s16_to_s32(&fr->buffer); 754 chop_fourth_byte(&fr->buffer); 755 break; 756 #endif 757 } 758 break; 759 #endif 760 } 761 if(fr->p.flags & MPG123_FORCE_ENDIAN) 762 { 763 if( 764 #ifdef WORDS_BIGENDIAN 765 !( 766 #endif 767 fr->p.flags & MPG123_BIG_ENDIAN 768 #ifdef WORDS_BIGENDIAN 769 ) 770 #endif 771 ) 772 swap_endian(&fr->buffer, mpg123_encsize(fr->af.encoding)); 773 } 774 } 775