1 /* 2 libmpg123: MPEG Audio Decoder library 3 4 copyright 1995-2020 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 7 */ 8 9 #include "mpg123lib_intern.h" 10 #include "icy2utf8.h" 11 #include "debug.h" 12 13 #include "gapless.h" 14 /* Want accurate rounding function regardless of decoder setup. */ 15 #define FORCE_ACCURATE 16 #include "sample.h" 17 #include "parse.h" 18 19 #define SEEKFRAME(mh) ((mh)->ignoreframe < 0 ? 0 : (mh)->ignoreframe) 20 21 static int initialized = 0; 22 23 int attribute_align_arg mpg123_init(void) 24 { 25 if((sizeof(short) != 2) || (sizeof(long) < 4)) return MPG123_BAD_TYPES; 26 27 if(initialized) return MPG123_OK; /* no need to initialize twice */ 28 29 #ifndef NO_LAYER12 30 init_layer12(); /* inits also shared tables with layer1 */ 31 #endif 32 #ifndef NO_LAYER3 33 init_layer3(); 34 #endif 35 prepare_decode_tables(); 36 check_decoders(); 37 initialized = 1; 38 #if (defined REAL_IS_FLOAT) && (defined IEEE_FLOAT) 39 /* This is rather pointless but it eases my mind to check that we did 40 not enable the special rounding on a VAX or something. */ 41 if(12346 != REAL_TO_SHORT_ACCURATE(12345.67f)) 42 { 43 error("Bad IEEE 754 rounding. Re-build libmpg123 properly."); 44 return MPG123_ERR; 45 } 46 #endif 47 return MPG123_OK; 48 } 49 50 void attribute_align_arg mpg123_exit(void) 51 { 52 /* nothing yet, but something later perhaps */ 53 /* Nope. This is dead space. */ 54 } 55 56 /* create a new handle with specified decoder, decoder can be "", "auto" or NULL for auto-detection */ 57 mpg123_handle attribute_align_arg *mpg123_new(const char* decoder, int *error) 58 { 59 return mpg123_parnew(NULL, decoder, error); 60 } 61 62 /* ...the full routine with optional initial parameters to override defaults. */ 63 mpg123_handle attribute_align_arg *mpg123_parnew(mpg123_pars *mp, const char* decoder, int *error) 64 { 65 mpg123_handle *fr = NULL; 66 int err = MPG123_OK; 67 68 if(initialized) fr = (mpg123_handle*) malloc(sizeof(mpg123_handle)); 69 else err = MPG123_NOT_INITIALIZED; 70 if(fr != NULL) 71 { 72 frame_init_par(fr, mp); 73 debug("cpu opt setting"); 74 if(frame_cpu_opt(fr, decoder) != 1) 75 { 76 err = MPG123_BAD_DECODER; 77 frame_exit(fr); 78 free(fr); 79 fr = NULL; 80 } 81 } 82 if(fr != NULL) 83 { 84 fr->decoder_change = 1; 85 } 86 else if(err == MPG123_OK) err = MPG123_OUT_OF_MEM; 87 88 if(error != NULL) *error = err; 89 return fr; 90 } 91 92 int attribute_align_arg mpg123_decoder(mpg123_handle *mh, const char* decoder) 93 { 94 enum optdec dt = dectype(decoder); 95 96 if(mh == NULL) return MPG123_BAD_HANDLE; 97 98 if(dt == nodec) 99 { 100 mh->err = MPG123_BAD_DECODER; 101 return MPG123_ERR; 102 } 103 if(dt == mh->cpu_opts.type) return MPG123_OK; 104 105 /* Now really change. */ 106 /* frame_exit(mh); 107 frame_init(mh); */ 108 debug("cpu opt setting"); 109 if(frame_cpu_opt(mh, decoder) != 1) 110 { 111 mh->err = MPG123_BAD_DECODER; 112 frame_exit(mh); 113 return MPG123_ERR; 114 } 115 /* New buffers for decoder are created in frame_buffers() */ 116 if((frame_outbuffer(mh) != 0)) 117 { 118 mh->err = MPG123_NO_BUFFERS; 119 frame_exit(mh); 120 return MPG123_ERR; 121 } 122 /* Do _not_ call decode_update here! That is only allowed after a first MPEG frame has been met. */ 123 mh->decoder_change = 1; 124 return MPG123_OK; 125 } 126 127 int attribute_align_arg mpg123_param(mpg123_handle *mh, enum mpg123_parms key, long val, double fval) 128 { 129 int r; 130 131 if(mh == NULL) return MPG123_BAD_HANDLE; 132 r = mpg123_par(&mh->p, key, val, fval); 133 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 134 else 135 { /* Special treatment for some settings. */ 136 #ifdef FRAME_INDEX 137 if(key == MPG123_INDEX_SIZE) 138 { /* Apply frame index size and grow property on the fly. */ 139 r = frame_index_setup(mh); 140 if(r != MPG123_OK) mh->err = MPG123_INDEX_FAIL; 141 } 142 #endif 143 #ifndef NO_FEEDER 144 /* Feeder pool size is applied right away, reader will react to that. */ 145 if(key == MPG123_FEEDPOOL || key == MPG123_FEEDBUFFER) 146 bc_poolsize(&mh->rdat.buffer, mh->p.feedpool, mh->p.feedbuffer); 147 #endif 148 } 149 return r; 150 } 151 152 int attribute_align_arg mpg123_par(mpg123_pars *mp, enum mpg123_parms key, long val, double fval) 153 { 154 int ret = MPG123_OK; 155 156 if(mp == NULL) return MPG123_BAD_PARS; 157 switch(key) 158 { 159 case MPG123_VERBOSE: 160 mp->verbose = val; 161 break; 162 case MPG123_FLAGS: 163 #ifndef GAPLESS 164 if(val & MPG123_GAPLESS) ret = MPG123_NO_GAPLESS; 165 #endif 166 if(ret == MPG123_OK) mp->flags = val; 167 debug1("set flags to 0x%lx", (unsigned long) mp->flags); 168 break; 169 case MPG123_ADD_FLAGS: 170 #ifndef GAPLESS 171 /* Enabling of gapless mode doesn't work when it's not there, but disabling (below) is no problem. */ 172 if(val & MPG123_GAPLESS) ret = MPG123_NO_GAPLESS; 173 else 174 #endif 175 mp->flags |= val; 176 debug1("set flags to 0x%lx", (unsigned long) mp->flags); 177 break; 178 case MPG123_REMOVE_FLAGS: 179 mp->flags &= ~val; 180 debug1("set flags to 0x%lx", (unsigned long) mp->flags); 181 break; 182 case MPG123_FORCE_RATE: /* should this trigger something? */ 183 #ifdef NO_NTOM 184 if(val > 0) 185 ret = MPG123_BAD_RATE; 186 #else 187 if(val > 96000) ret = MPG123_BAD_RATE; 188 else mp->force_rate = val < 0 ? 0 : val; /* >0 means enable, 0 disable */ 189 #endif 190 break; 191 case MPG123_DOWN_SAMPLE: 192 #ifdef NO_DOWNSAMPLE 193 if(val != 0) ret = MPG123_BAD_RATE; 194 #else 195 if(val < 0 || val > 2) ret = MPG123_BAD_RATE; 196 else mp->down_sample = (int)val; 197 #endif 198 break; 199 case MPG123_RVA: 200 if(val < 0 || val > MPG123_RVA_MAX) ret = MPG123_BAD_RVA; 201 else mp->rva = (int)val; 202 break; 203 case MPG123_DOWNSPEED: 204 mp->halfspeed = val < 0 ? 0 : val; 205 break; 206 case MPG123_UPSPEED: 207 mp->doublespeed = val < 0 ? 0 : val; 208 break; 209 case MPG123_ICY_INTERVAL: 210 #ifndef NO_ICY 211 mp->icy_interval = val > 0 ? val : 0; 212 #else 213 if(val > 0) ret = MPG123_BAD_PARAM; 214 #endif 215 break; 216 case MPG123_OUTSCALE: 217 /* Choose the value that is non-zero, if any. 218 Downscaling integers to 1.0 . */ 219 mp->outscale = val == 0 ? fval : (double)val/SHORT_SCALE; 220 break; 221 case MPG123_TIMEOUT: 222 #ifdef TIMEOUT_READ 223 mp->timeout = val >= 0 ? val : 0; 224 #else 225 if(val > 0) ret = MPG123_NO_TIMEOUT; 226 #endif 227 break; 228 case MPG123_RESYNC_LIMIT: 229 mp->resync_limit = val; 230 break; 231 case MPG123_INDEX_SIZE: 232 #ifdef FRAME_INDEX 233 mp->index_size = val; 234 #else 235 if(val) // It is only an eror if you want to enable the index. 236 ret = MPG123_NO_INDEX; 237 #endif 238 break; 239 case MPG123_PREFRAMES: 240 if(val >= 0) mp->preframes = val; 241 else ret = MPG123_BAD_VALUE; 242 break; 243 case MPG123_FEEDPOOL: 244 #ifndef NO_FEEDER 245 if(val >= 0) mp->feedpool = val; 246 else ret = MPG123_BAD_VALUE; 247 #else 248 ret = MPG123_MISSING_FEATURE; 249 #endif 250 break; 251 case MPG123_FEEDBUFFER: 252 #ifndef NO_FEEDER 253 if(val > 0) mp->feedbuffer = val; 254 else ret = MPG123_BAD_VALUE; 255 #else 256 ret = MPG123_MISSING_FEATURE; 257 #endif 258 break; 259 case MPG123_FREEFORMAT_SIZE: 260 mp->freeformat_framesize = val; 261 break; 262 default: 263 ret = MPG123_BAD_PARAM; 264 } 265 return ret; 266 } 267 268 int attribute_align_arg mpg123_getparam(mpg123_handle *mh, enum mpg123_parms key, long *val, double *fval) 269 { 270 int r; 271 272 if(mh == NULL) return MPG123_BAD_HANDLE; 273 r = mpg123_getpar(&mh->p, key, val, fval); 274 if(r != MPG123_OK){ mh->err = r; r = MPG123_ERR; } 275 return r; 276 } 277 278 int attribute_align_arg mpg123_getpar(mpg123_pars *mp, enum mpg123_parms key, long *val, double *fval) 279 { 280 int ret = 0; 281 282 if(mp == NULL) return MPG123_BAD_PARS; 283 switch(key) 284 { 285 case MPG123_VERBOSE: 286 if(val) *val = mp->verbose; 287 break; 288 case MPG123_FLAGS: 289 case MPG123_ADD_FLAGS: 290 if(val) *val = mp->flags; 291 break; 292 case MPG123_FORCE_RATE: 293 if(val) 294 #ifdef NO_NTOM 295 *val = 0; 296 #else 297 *val = mp->force_rate; 298 #endif 299 break; 300 case MPG123_DOWN_SAMPLE: 301 if(val) *val = mp->down_sample; 302 break; 303 case MPG123_RVA: 304 if(val) *val = mp->rva; 305 break; 306 case MPG123_DOWNSPEED: 307 if(val) *val = mp->halfspeed; 308 break; 309 case MPG123_UPSPEED: 310 if(val) *val = mp->doublespeed; 311 break; 312 case MPG123_ICY_INTERVAL: 313 #ifndef NO_ICY 314 if(val) *val = (long)mp->icy_interval; 315 #else 316 if(val) *val = 0; 317 #endif 318 break; 319 case MPG123_OUTSCALE: 320 if(fval) *fval = mp->outscale; 321 if(val) *val = (long)(mp->outscale*SHORT_SCALE); 322 break; 323 case MPG123_RESYNC_LIMIT: 324 if(val) *val = mp->resync_limit; 325 break; 326 case MPG123_INDEX_SIZE: 327 if(val) 328 #ifdef FRAME_INDEX 329 *val = mp->index_size; 330 #else 331 *val = 0; /* graceful fallback: no index is index of zero size */ 332 #endif 333 break; 334 case MPG123_PREFRAMES: 335 *val = mp->preframes; 336 break; 337 case MPG123_FEEDPOOL: 338 #ifndef NO_FEEDER 339 *val = mp->feedpool; 340 #else 341 ret = MPG123_MISSING_FEATURE; 342 #endif 343 break; 344 case MPG123_FEEDBUFFER: 345 #ifndef NO_FEEDER 346 *val = mp->feedbuffer; 347 #else 348 ret = MPG123_MISSING_FEATURE; 349 #endif 350 break; 351 case MPG123_FREEFORMAT_SIZE: 352 *val = mp->freeformat_framesize; 353 break; 354 default: 355 ret = MPG123_BAD_PARAM; 356 } 357 return ret; 358 } 359 360 int attribute_align_arg mpg123_getstate(mpg123_handle *mh, enum mpg123_state key, long *val, double *fval) 361 { 362 int ret = MPG123_OK; 363 long theval = 0; 364 double thefval = 0.; 365 366 if(mh == NULL) return MPG123_BAD_HANDLE; 367 368 switch(key) 369 { 370 case MPG123_ACCURATE: 371 theval = mh->state_flags & FRAME_ACCURATE; 372 break; 373 case MPG123_FRANKENSTEIN: 374 theval = mh->state_flags & FRAME_FRANKENSTEIN; 375 break; 376 case MPG123_BUFFERFILL: 377 #ifndef NO_FEEDER 378 { 379 size_t sval = bc_fill(&mh->rdat.buffer); 380 theval = (long)sval; 381 if(theval < 0 || (size_t)theval != sval) 382 { 383 mh->err = MPG123_INT_OVERFLOW; 384 ret = MPG123_ERR; 385 } 386 } 387 #else 388 mh->err = MPG123_MISSING_FEATURE; 389 ret = MPG123_ERR; 390 #endif 391 break; 392 case MPG123_FRESH_DECODER: 393 theval = mh->state_flags & FRAME_FRESH_DECODER; 394 mh->state_flags &= ~FRAME_FRESH_DECODER; 395 break; 396 case MPG123_ENC_DELAY: 397 theval = mh->enc_delay; 398 break; 399 case MPG123_ENC_PADDING: 400 theval = mh->enc_padding; 401 break; 402 case MPG123_DEC_DELAY: 403 theval = mh->lay == 3 ? GAPLESS_DELAY : -1; 404 break; 405 default: 406 mh->err = MPG123_BAD_KEY; 407 ret = MPG123_ERR; 408 } 409 410 if(val != NULL) *val = theval; 411 if(fval != NULL) *fval = thefval; 412 413 return ret; 414 } 415 416 int attribute_align_arg mpg123_eq(mpg123_handle *mh, enum mpg123_channels channel, int band, double val) 417 { 418 #ifndef NO_EQUALIZER 419 if(mh == NULL) return MPG123_BAD_HANDLE; 420 if(band < 0 || band > 31){ mh->err = MPG123_BAD_BAND; return MPG123_ERR; } 421 switch(channel) 422 { 423 case MPG123_LEFT|MPG123_RIGHT: 424 mh->equalizer[0][band] = mh->equalizer[1][band] = DOUBLE_TO_REAL(val); 425 break; 426 case MPG123_LEFT: mh->equalizer[0][band] = DOUBLE_TO_REAL(val); break; 427 case MPG123_RIGHT: mh->equalizer[1][band] = DOUBLE_TO_REAL(val); break; 428 default: 429 mh->err=MPG123_BAD_CHANNEL; 430 return MPG123_ERR; 431 } 432 mh->have_eq_settings = TRUE; 433 #endif 434 return MPG123_OK; 435 } 436 437 double attribute_align_arg mpg123_geteq(mpg123_handle *mh, enum mpg123_channels channel, int band) 438 { 439 double ret = 0.; 440 #ifndef NO_EQUALIZER 441 442 /* Handle this gracefully. When there is no band, it has no volume. */ 443 if(mh != NULL && band > -1 && band < 32) 444 switch(channel) 445 { 446 case MPG123_LEFT|MPG123_RIGHT: 447 ret = 0.5*(REAL_TO_DOUBLE(mh->equalizer[0][band])+REAL_TO_DOUBLE(mh->equalizer[1][band])); 448 break; 449 case MPG123_LEFT: ret = REAL_TO_DOUBLE(mh->equalizer[0][band]); break; 450 case MPG123_RIGHT: ret = REAL_TO_DOUBLE(mh->equalizer[1][band]); break; 451 /* Default case is already handled: ret = 0 */ 452 } 453 #endif 454 return ret; 455 } 456 457 /* plain file access, no http! */ 458 int attribute_align_arg mpg123_open(mpg123_handle *mh, const char *path) 459 { 460 if(mh == NULL) return MPG123_BAD_HANDLE; 461 462 mpg123_close(mh); 463 return open_stream(mh, path, -1); 464 } 465 466 // The convenience function mpg123_open_fixed() wraps over acual mpg123_open 467 // and hence needs to have the exact same code in lfs_wrap.c. The flesh is 468 // in open_fixed_pre() and open_fixed_post(), wich are only defined here. 469 int open_fixed_pre(mpg123_handle *mh, int channels, int encoding) 470 { 471 if(!mh) 472 return MPG123_BAD_HANDLE; 473 mh->p.flags |= MPG123_NO_FRANKENSTEIN; 474 int err = mpg123_format_none(mh); 475 if(err == MPG123_OK) 476 err = mpg123_format2(mh, 0, channels, encoding); 477 return err; 478 } 479 480 int open_fixed_post(mpg123_handle *mh, int channels, int encoding) 481 { 482 if(!mh) 483 return MPG123_BAD_HANDLE; 484 long rate; 485 int err = mpg123_getformat(mh, &rate, &channels, &encoding); 486 if(err == MPG123_OK) 487 err = mpg123_format_none(mh); 488 if(err == MPG123_OK) 489 err = mpg123_format(mh, rate, channels, encoding); 490 if(err == MPG123_OK) 491 { 492 if(mh->track_frames < 1 && (mh->rdat.flags & READER_SEEKABLE)) 493 { 494 debug("open_fixed_post: scan because we can seek and do not know track_frames"); 495 err = mpg123_scan(mh); 496 } 497 } 498 if(err != MPG123_OK) 499 mpg123_close(mh); 500 return err; 501 } 502 503 int attribute_align_arg mpg123_open_fixed( mpg123_handle *mh, const char *path 504 , int channels, int encoding ) 505 { 506 int err = open_fixed_pre(mh, channels, encoding); 507 if(err == MPG123_OK) 508 err = mpg123_open(mh, path); 509 if(err == MPG123_OK) 510 err = open_fixed_post(mh, channels, encoding); 511 return err; 512 } 513 514 int attribute_align_arg mpg123_open_fd(mpg123_handle *mh, int fd) 515 { 516 if(mh == NULL) return MPG123_BAD_HANDLE; 517 518 mpg123_close(mh); 519 return open_stream(mh, NULL, fd); 520 } 521 522 int attribute_align_arg mpg123_open_handle(mpg123_handle *mh, void *iohandle) 523 { 524 if(mh == NULL) return MPG123_BAD_HANDLE; 525 526 mpg123_close(mh); 527 if(mh->rdat.r_read_handle == NULL) 528 { 529 mh->err = MPG123_BAD_CUSTOM_IO; 530 return MPG123_ERR; 531 } 532 return open_stream_handle(mh, iohandle); 533 } 534 535 int attribute_align_arg mpg123_open_feed(mpg123_handle *mh) 536 { 537 if(mh == NULL) return MPG123_BAD_HANDLE; 538 539 mpg123_close(mh); 540 return open_feed(mh); 541 } 542 543 int attribute_align_arg mpg123_replace_reader( mpg123_handle *mh, 544 ssize_t (*r_read) (int, void *, size_t), 545 off_t (*r_lseek)(int, off_t, int) ) 546 { 547 if(mh == NULL) return MPG123_BAD_HANDLE; 548 549 mpg123_close(mh); 550 mh->rdat.r_read = r_read; 551 mh->rdat.r_lseek = r_lseek; 552 return MPG123_OK; 553 } 554 555 int attribute_align_arg mpg123_replace_reader_handle( mpg123_handle *mh, 556 ssize_t (*r_read) (void*, void *, size_t), 557 off_t (*r_lseek)(void*, off_t, int), 558 void (*cleanup)(void*) ) 559 { 560 if(mh == NULL) return MPG123_BAD_HANDLE; 561 562 mpg123_close(mh); 563 mh->rdat.r_read_handle = r_read; 564 mh->rdat.r_lseek_handle = r_lseek; 565 mh->rdat.cleanup_handle = cleanup; 566 return MPG123_OK; 567 } 568 569 /* Update decoding engine for 570 a) a new choice of decoder 571 b) a changed native format of the MPEG stream 572 ... calls are only valid after parsing some MPEG frame! */ 573 int decode_update(mpg123_handle *mh) 574 { 575 long native_rate; 576 int b; 577 578 if(mh->num < 0) 579 { 580 if(!(mh->p.flags & MPG123_QUIET)) error("decode_update() has been called before reading the first MPEG frame! Internal programming error."); 581 582 mh->err = MPG123_BAD_DECODER_SETUP; 583 return MPG123_ERR; 584 } 585 586 mh->state_flags |= FRAME_FRESH_DECODER; 587 native_rate = frame_freq(mh); 588 589 b = frame_output_format(mh); /* Select the new output format based on given constraints. */ 590 if(b < 0) return MPG123_ERR; 591 592 if(b == 1) mh->new_format = 1; /* Store for later... */ 593 594 debug3("updating decoder structure with native rate %li and af.rate %li (new format: %i)", native_rate, mh->af.rate, mh->new_format); 595 if(mh->af.rate == native_rate) mh->down_sample = 0; 596 else if(mh->af.rate == native_rate>>1) mh->down_sample = 1; 597 else if(mh->af.rate == native_rate>>2) mh->down_sample = 2; 598 else mh->down_sample = 3; /* flexible (fixed) rate */ 599 switch(mh->down_sample) 600 { 601 case 0: 602 case 1: 603 case 2: 604 mh->down_sample_sblimit = SBLIMIT>>(mh->down_sample); 605 /* With downsampling I get less samples per frame */ 606 mh->outblock = outblock_bytes(mh, (mh->spf>>mh->down_sample)); 607 break; 608 #ifndef NO_NTOM 609 case 3: 610 { 611 if(synth_ntom_set_step(mh) != 0) return -1; 612 if(frame_freq(mh) > mh->af.rate) 613 { 614 mh->down_sample_sblimit = SBLIMIT * mh->af.rate; 615 mh->down_sample_sblimit /= frame_freq(mh); 616 if(mh->down_sample_sblimit < 1) 617 mh->down_sample_sblimit = 1; 618 } 619 else mh->down_sample_sblimit = SBLIMIT; 620 mh->outblock = outblock_bytes(mh, 621 ( ( NTOM_MUL-1+mh->spf 622 * (((size_t)NTOM_MUL*mh->af.rate)/frame_freq(mh)) 623 )/NTOM_MUL )); 624 } 625 break; 626 #endif 627 } 628 629 if(!(mh->p.flags & MPG123_FORCE_MONO)) 630 { 631 if(mh->af.channels == 1) mh->single = SINGLE_MIX; 632 else mh->single = SINGLE_STEREO; 633 } 634 else mh->single = (mh->p.flags & MPG123_FORCE_MONO)-1; 635 if(set_synth_functions(mh) != 0) return -1;; 636 637 /* The needed size of output buffer may have changed. */ 638 if(frame_outbuffer(mh) != MPG123_OK) return -1; 639 640 do_rva(mh); 641 debug3("done updating decoder structure with native rate %li and af.rate %li and down_sample %i", frame_freq(mh), mh->af.rate, mh->down_sample); 642 643 mh->decoder_change = 0; 644 return 0; 645 } 646 647 size_t attribute_align_arg mpg123_safe_buffer(void) 648 { 649 /* real is the largest possible output (it's 32bit float, 32bit int or 64bit double). */ 650 return sizeof(real)*2*1152*NTOM_MAX; 651 } 652 653 size_t attribute_align_arg mpg123_outblock(mpg123_handle *mh) 654 { 655 /* Try to be helpful and never return zero output block size. */ 656 if(mh != NULL && mh->outblock > 0) return mh->outblock; 657 else return mpg123_safe_buffer(); 658 } 659 660 /* Read in the next frame we actually want for decoding. 661 This includes skipping/ignoring frames, in additon to skipping junk in the parser. */ 662 static int get_next_frame(mpg123_handle *mh) 663 { 664 int change = mh->decoder_change; 665 /* Ensure we got proper decoder for ignoring frames. 666 Header can be changed from seeking around. But be careful: Only after at 667 least one frame got read, decoder update makes sense. */ 668 if(mh->header_change > 1 && mh->num >= 0) 669 { 670 change = 1; 671 mh->header_change = 0; 672 debug("starting with big header change"); 673 if(decode_update(mh) < 0) 674 return MPG123_ERR; 675 } 676 677 do 678 { 679 int b; 680 /* Decode & discard some frame(s) before beginning. */ 681 if(mh->to_ignore && mh->num < mh->firstframe && mh->num >= mh->ignoreframe) 682 { 683 debug1("ignoring frame %li", (long)mh->num); 684 /* Decoder structure must be current! decode_update has been called before... */ 685 (mh->do_layer)(mh); mh->buffer.fill = 0; 686 #ifndef NO_NTOM 687 /* The ignored decoding may have failed. Make sure ntom stays consistent. */ 688 if(mh->down_sample == 3) ntom_set_ntom(mh, mh->num+1); 689 #endif 690 mh->to_ignore = mh->to_decode = FALSE; 691 } 692 /* Read new frame data; possibly breaking out here for MPG123_NEED_MORE. */ 693 debug("read frame"); 694 mh->to_decode = FALSE; 695 b = read_frame(mh); /* That sets to_decode only if a full frame was read. */ 696 debug4("read of frame %li returned %i (to_decode=%i) at sample %li", (long)mh->num, b, mh->to_decode, (long)mpg123_tell(mh)); 697 if(b == MPG123_NEED_MORE) return MPG123_NEED_MORE; /* need another call with data */ 698 else if(b <= 0) 699 { 700 /* More sophisticated error control? */ 701 if(b==0 || (mh->rdat.filelen >= 0 && mh->rdat.filepos == mh->rdat.filelen)) 702 { /* We simply reached the end. */ 703 mh->track_frames = mh->num + 1; 704 debug("What about updating/checking gapless sample count here?"); 705 return MPG123_DONE; 706 } 707 else return MPG123_ERR; /* Some real error. */ 708 } 709 /* Now, there should be new data to decode ... and also possibly new stream properties */ 710 if(mh->header_change > 1 || mh->decoder_change) 711 { 712 debug("big header or decoder change"); 713 change = 1; 714 mh->header_change = 0; 715 /* Need to update decoder structure right away since frame might need to 716 be decoded on next loop iteration for properly ignoring its output. */ 717 if(decode_update(mh) < 0) 718 return MPG123_ERR; 719 } 720 /* Now some accounting: Look at the numbers and decide if we want this frame. */ 721 ++mh->playnum; 722 /* Plain skipping without decoding, only when frame is not ignored on next cycle. */ 723 if(mh->num < mh->firstframe || (mh->p.doublespeed && (mh->playnum % mh->p.doublespeed))) 724 { 725 if(!(mh->to_ignore && mh->num < mh->firstframe && mh->num >= mh->ignoreframe)) 726 { 727 frame_skip(mh); 728 /* Should one fix NtoM here or not? 729 It is not work the trouble for doublespeed, but what with leading frames? */ 730 } 731 } 732 /* Or, we are finally done and have a new frame. */ 733 else break; 734 } while(1); 735 736 /* If we reach this point, we got a new frame ready to be decoded. 737 All other situations resulted in returns from the loop. */ 738 if(change) 739 { 740 if(mh->fresh) 741 { 742 #ifdef GAPLESS 743 int b=0; 744 /* Prepare offsets for gapless decoding. */ 745 debug1("preparing gapless stuff with native rate %li", frame_freq(mh)); 746 frame_gapless_realinit(mh); 747 frame_set_frameseek(mh, mh->num); 748 #endif 749 mh->fresh = 0; 750 #ifdef GAPLESS 751 /* Could this possibly happen? With a real big gapless offset... */ 752 if(mh->num < mh->firstframe) b = get_next_frame(mh); 753 if(b < 0) return b; /* Could be error, need for more, new format... */ 754 #endif 755 } 756 } 757 return MPG123_OK; 758 } 759 760 /* Assumption: A buffer full of zero samples can be constructed by repetition of this byte. 761 Oh, and it handles some format conversion. 762 Only to be used by decode_the_frame() ... */ 763 static int zero_byte(mpg123_handle *fr) 764 { 765 #ifndef NO_8BIT 766 return fr->af.encoding & MPG123_ENC_8 ? fr->conv16to8[0] : 0; 767 #else 768 return 0; /* All normal signed formats have the zero here (even in byte form -- that may be an assumption for your funny machine...). */ 769 #endif 770 } 771 772 /* 773 Not part of the api. This just decodes the frame and fills missing bits with zeroes. 774 There can be frames that are broken and thus make do_layer() fail. 775 */ 776 static void decode_the_frame(mpg123_handle *fr) 777 { 778 size_t needed_bytes = decoder_synth_bytes(fr, frame_expect_outsamples(fr)); 779 fr->clip += (fr->do_layer)(fr); 780 /*fprintf(stderr, "frame %"OFF_P": got %"SIZE_P" / %"SIZE_P"\n", fr->num,(size_p)fr->buffer.fill, (size_p)needed_bytes);*/ 781 /* There could be less data than promised. 782 Also, then debugging, we look out for coding errors that could result in _more_ data than expected. */ 783 #ifdef DEBUG 784 if(fr->buffer.fill != needed_bytes) 785 { 786 #endif 787 if(fr->buffer.fill < needed_bytes) 788 { 789 if(VERBOSE2) 790 fprintf(stderr, "Note: broken frame %li, filling up with %"SIZE_P" zeroes, from %"SIZE_P"\n", (long)fr->num, (size_p)(needed_bytes-fr->buffer.fill), (size_p)fr->buffer.fill); 791 792 /* 793 One could do a loop with individual samples instead... but zero is zero 794 Actually, that is wrong: zero is mostly a series of null bytes, 795 but we have funny 8bit formats that have a different opinion on zero... 796 Unsigned 16 or 32 bit formats are handled later. 797 */ 798 memset( fr->buffer.data + fr->buffer.fill, zero_byte(fr), needed_bytes - fr->buffer.fill ); 799 800 fr->buffer.fill = needed_bytes; 801 #ifndef NO_NTOM 802 /* ntom_val will be wrong when the decoding wasn't carried out completely */ 803 ntom_set_ntom(fr, fr->num+1); 804 #endif 805 } 806 #ifdef DEBUG 807 else 808 { 809 if(NOQUIET) 810 error2("I got _more_ bytes than expected (%"SIZE_P" / %"SIZE_P"), that should not be possible!", (size_p)fr->buffer.fill, (size_p)needed_bytes); 811 } 812 } 813 #endif 814 postprocess_buffer(fr); 815 } 816 817 /* 818 Decode the current frame into the frame structure's buffer, accessible at the location stored in <audio>, with <bytes> bytes available. 819 <num> will contain the last decoded frame number. This function should be called after mpg123_framebyframe_next positioned the stream at a 820 valid mp3 frame. The buffer contents will get lost on the next call to mpg123_framebyframe_next or mpg123_framebyframe_decode. 821 returns 822 MPG123_OK -- successfully decoded or ignored the frame, you get your output data or in case of ignored frames 0 bytes 823 MPG123_DONE -- decoding finished, should not happen 824 MPG123_ERR -- some error occured. 825 MPG123_ERR_NULL -- audio or bytes are not pointing to valid storage addresses 826 MPG123_BAD_HANDLE -- mh has not been initialized 827 MPG123_NO_SPACE -- not enough space in buffer for safe decoding, should not happen 828 */ 829 int attribute_align_arg mpg123_framebyframe_decode(mpg123_handle *mh, off_t *num, unsigned char **audio, size_t *bytes) 830 { 831 if(bytes == NULL) return MPG123_ERR_NULL; 832 if(audio == NULL) return MPG123_ERR_NULL; 833 if(mh == NULL) return MPG123_BAD_HANDLE; 834 if(mh->buffer.size < mh->outblock) return MPG123_NO_SPACE; 835 836 *bytes = 0; 837 mh->buffer.fill = 0; /* always start fresh */ 838 if(!mh->to_decode) return MPG123_OK; 839 840 if(num != NULL) *num = mh->num; 841 debug("decoding"); 842 decode_the_frame(mh); 843 mh->to_decode = mh->to_ignore = FALSE; 844 mh->buffer.p = mh->buffer.data; 845 FRAME_BUFFERCHECK(mh); 846 *audio = mh->buffer.p; 847 *bytes = mh->buffer.fill; 848 return MPG123_OK; 849 } 850 851 /* 852 Find, read and parse the next mp3 frame while skipping junk and parsing id3 tags, lame headers, etc. 853 Prepares everything for decoding using mpg123_framebyframe_decode. 854 returns 855 MPG123_OK -- new frame was read and parsed, call mpg123_framebyframe_decode to actually decode 856 MPG123_NEW_FORMAT -- new frame was read, it results in changed output format, call mpg123_framebyframe_decode to actually decode 857 MPG123_BAD_HANDLE -- mh has not been initialized 858 MPG123_NEED_MORE -- more input data is needed to advance to the next frame. supply more input data using mpg123_feed 859 */ 860 int attribute_align_arg mpg123_framebyframe_next(mpg123_handle *mh) 861 { 862 int b; 863 if(mh == NULL) return MPG123_BAD_HANDLE; 864 865 mh->to_decode = mh->to_ignore = FALSE; 866 mh->buffer.fill = 0; 867 868 b = get_next_frame(mh); 869 if(b < 0) return b; 870 debug1("got next frame, %i", mh->to_decode); 871 872 /* mpg123_framebyframe_decode will return MPG123_OK with 0 bytes decoded if mh->to_decode is 0 */ 873 if(!mh->to_decode) 874 return MPG123_OK; 875 876 if(mh->new_format) 877 { 878 debug("notifiying new format"); 879 mh->new_format = 0; 880 return MPG123_NEW_FORMAT; 881 } 882 883 return MPG123_OK; 884 } 885 886 /* 887 Put _one_ decoded frame into the frame structure's buffer, accessible at the location stored in <audio>, with <bytes> bytes available. 888 The buffer contents will be lost on next call to mpg123_decode_frame. 889 MPG123_OK -- successfully decoded the frame, you get your output data 890 MPg123_DONE -- This is it. End. 891 MPG123_ERR -- some error occured... 892 MPG123_NEW_FORMAT -- new frame was read, it results in changed output format -> will be decoded on next call 893 MPG123_NEED_MORE -- that should not happen as this function is intended for in-library stream reader but if you force it... 894 MPG123_NO_SPACE -- not enough space in buffer for safe decoding, also should not happen 895 896 num will be updated to the last decoded frame number (may possibly _not_ increase, p.ex. when format changed). 897 */ 898 int attribute_align_arg mpg123_decode_frame(mpg123_handle *mh, off_t *num, unsigned char **audio, size_t *bytes) 899 { 900 if(bytes != NULL) *bytes = 0; 901 if(mh == NULL) return MPG123_BAD_HANDLE; 902 if(mh->buffer.size < mh->outblock) return MPG123_NO_SPACE; 903 mh->buffer.fill = 0; /* always start fresh */ 904 /* Be nice: Set these also for sensible values in case of error. */ 905 if(audio) *audio = NULL; 906 if(bytes) *bytes = 0; 907 while(TRUE) 908 { 909 /* decode if possible */ 910 if(mh->to_decode) 911 { 912 if(num != NULL) *num = mh->num; 913 if(mh->new_format) 914 { 915 debug("notifiying new format"); 916 mh->new_format = 0; 917 return MPG123_NEW_FORMAT; 918 } 919 debug("decoding"); 920 921 if(mh->decoder_change && decode_update(mh) < 0) 922 return MPG123_ERR; 923 decode_the_frame(mh); 924 925 mh->to_decode = mh->to_ignore = FALSE; 926 mh->buffer.p = mh->buffer.data; 927 FRAME_BUFFERCHECK(mh); 928 if(audio != NULL) *audio = mh->buffer.p; 929 if(bytes != NULL) *bytes = mh->buffer.fill; 930 931 return MPG123_OK; 932 } 933 else 934 { 935 int b = get_next_frame(mh); 936 if(b < 0) return b; 937 debug1("got next frame, %i", mh->to_decode); 938 } 939 } 940 } 941 942 int attribute_align_arg mpg123_read(mpg123_handle *mh, void *out, size_t size, size_t *done) 943 { 944 return mpg123_decode(mh, NULL, 0, out, size, done); 945 } 946 947 int attribute_align_arg mpg123_feed(mpg123_handle *mh, const unsigned char *in, size_t size) 948 { 949 if(mh == NULL) return MPG123_BAD_HANDLE; 950 #ifndef NO_FEEDER 951 if(size > 0) 952 { 953 if(in != NULL) 954 { 955 if(feed_more(mh, in, size) != 0) return MPG123_ERR; 956 else 957 { 958 /* The need for more data might have triggered an error. 959 This one is outdated now with the new data. */ 960 if(mh->err == MPG123_ERR_READER) mh->err = MPG123_OK; 961 962 return MPG123_OK; 963 } 964 } 965 else 966 { 967 mh->err = MPG123_NULL_BUFFER; 968 return MPG123_ERR; 969 } 970 } 971 return MPG123_OK; 972 #else 973 mh->err = MPG123_MISSING_FEATURE; 974 return MPG123_ERR; 975 #endif 976 } 977 978 /* 979 The old picture: 980 while(1) { 981 len = read(0,buf,16384); 982 if(len <= 0) 983 break; 984 ret = decodeMP3(&mp,buf,len,out,8192,&size); 985 while(ret == MP3_OK) { 986 write(1,out,size); 987 ret = decodeMP3(&mp,NULL,0,out,8192,&size); 988 } 989 } 990 */ 991 992 int attribute_align_arg mpg123_decode(mpg123_handle *mh, const unsigned char *inmemory, size_t inmemsize, void *outmem, size_t outmemsize, size_t *done) 993 { 994 int ret = MPG123_OK; 995 size_t mdone = 0; 996 unsigned char *outmemory = outmem; 997 998 if(done != NULL) *done = 0; 999 if(mh == NULL) return MPG123_BAD_HANDLE; 1000 if(inmemsize > 0 && mpg123_feed(mh, inmemory, inmemsize) != MPG123_OK) 1001 { 1002 ret = MPG123_ERR; 1003 goto decodeend; 1004 } 1005 if(outmemory == NULL) outmemsize = 0; /* Not just give error, give chance to get a status message. */ 1006 1007 while(ret == MPG123_OK) 1008 { 1009 debug4("decode loop, fill %i (%li vs. %li); to_decode: %i", (int)mh->buffer.fill, (long)mh->num, (long)mh->firstframe, mh->to_decode); 1010 /* Decode a frame that has been read before. 1011 This only happens when buffer is empty! */ 1012 if(mh->to_decode) 1013 { 1014 if(mh->new_format) 1015 { 1016 debug("notifiying new format"); 1017 mh->new_format = 0; 1018 ret = MPG123_NEW_FORMAT; 1019 goto decodeend; 1020 } 1021 if(mh->buffer.size - mh->buffer.fill < mh->outblock) 1022 { 1023 ret = MPG123_NO_SPACE; 1024 goto decodeend; 1025 } 1026 if(mh->decoder_change && decode_update(mh) < 0) 1027 { 1028 ret = MPG123_ERR; 1029 goto decodeend; 1030 } 1031 decode_the_frame(mh); 1032 mh->to_decode = mh->to_ignore = FALSE; 1033 mh->buffer.p = mh->buffer.data; 1034 debug2("decoded frame %li, got %li samples in buffer", (long)mh->num, (long)(mh->buffer.fill / (samples_to_bytes(mh, 1)))); 1035 FRAME_BUFFERCHECK(mh); 1036 } 1037 if(mh->buffer.fill) /* Copy (part of) the decoded data to the caller's buffer. */ 1038 { 1039 /* get what is needed - or just what is there */ 1040 int a = mh->buffer.fill > (outmemsize - mdone) ? outmemsize - mdone : mh->buffer.fill; 1041 debug4("buffer fill: %i; copying %i (%i - %li)", (int)mh->buffer.fill, a, (int)outmemsize, (long)mdone); 1042 memcpy(outmemory, mh->buffer.p, a); 1043 /* less data in frame buffer, less needed, output pointer increase, more data given... */ 1044 mh->buffer.fill -= a; 1045 outmemory += a; 1046 mdone += a; 1047 mh->buffer.p += a; 1048 if(!(outmemsize > mdone)) goto decodeend; 1049 } 1050 else /* If we didn't have data, get a new frame. */ 1051 { 1052 int b = get_next_frame(mh); 1053 if(b < 0){ ret = b; goto decodeend; } 1054 } 1055 } 1056 decodeend: 1057 if(done != NULL) *done = mdone; 1058 return ret; 1059 } 1060 1061 long attribute_align_arg mpg123_clip(mpg123_handle *mh) 1062 { 1063 long ret = 0; 1064 1065 if(mh != NULL) 1066 { 1067 ret = mh->clip; 1068 mh->clip = 0; 1069 } 1070 return ret; 1071 } 1072 1073 /* Simples: Track needs initializtion if no initial frame has been read yet. */ 1074 #define track_need_init(mh) ((mh)->num < 0) 1075 1076 static int init_track(mpg123_handle *mh) 1077 { 1078 if(track_need_init(mh)) 1079 { 1080 /* Fresh track, need first frame for basic info. */ 1081 int b = get_next_frame(mh); 1082 if(b < 0) return b; 1083 } 1084 return 0; 1085 } 1086 1087 int attribute_align_arg mpg123_info(mpg123_handle *mh, struct mpg123_frameinfo *mi) 1088 { 1089 int b; 1090 1091 if(mh == NULL) return MPG123_BAD_HANDLE; 1092 if(mi == NULL) 1093 { 1094 mh->err = MPG123_ERR_NULL; 1095 return MPG123_ERR; 1096 } 1097 b = init_track(mh); 1098 if(b < 0) return b; 1099 1100 mi->version = mh->mpeg25 ? MPG123_2_5 : (mh->lsf ? MPG123_2_0 : MPG123_1_0); 1101 mi->layer = mh->lay; 1102 mi->rate = frame_freq(mh); 1103 switch(mh->mode) 1104 { 1105 case 0: mi->mode = MPG123_M_STEREO; break; 1106 case 1: mi->mode = MPG123_M_JOINT; break; 1107 case 2: mi->mode = MPG123_M_DUAL; break; 1108 case 3: mi->mode = MPG123_M_MONO; break; 1109 default: mi->mode = 0; // Nothing good to do here. 1110 } 1111 mi->mode_ext = mh->mode_ext; 1112 mi->framesize = mh->framesize+4; /* Include header. */ 1113 mi->flags = 0; 1114 if(mh->error_protection) mi->flags |= MPG123_CRC; 1115 if(mh->copyright) mi->flags |= MPG123_COPYRIGHT; 1116 if(mh->extension) mi->flags |= MPG123_PRIVATE; 1117 if(mh->original) mi->flags |= MPG123_ORIGINAL; 1118 mi->emphasis = mh->emphasis; 1119 mi->bitrate = frame_bitrate(mh); 1120 mi->abr_rate = mh->abr_rate; 1121 mi->vbr = mh->vbr; 1122 return MPG123_OK; 1123 } 1124 1125 int attribute_align_arg mpg123_getformat2( mpg123_handle *mh 1126 , long *rate, int *channels, int *encoding, int clear_flag ) 1127 { 1128 int b; 1129 1130 if(mh == NULL) return MPG123_BAD_HANDLE; 1131 b = init_track(mh); 1132 if(b < 0) return b; 1133 1134 if(rate != NULL) *rate = mh->af.rate; 1135 if(channels != NULL) *channels = mh->af.channels; 1136 if(encoding != NULL) *encoding = mh->af.encoding; 1137 if(clear_flag) mh->new_format = 0; 1138 return MPG123_OK; 1139 } 1140 1141 int attribute_align_arg mpg123_getformat(mpg123_handle *mh, long *rate, int *channels, int *encoding) 1142 { 1143 return mpg123_getformat2(mh, rate, channels, encoding, 1); 1144 } 1145 1146 off_t attribute_align_arg mpg123_timeframe(mpg123_handle *mh, double seconds) 1147 { 1148 off_t b; 1149 1150 if(mh == NULL) return MPG123_ERR; 1151 b = init_track(mh); 1152 if(b<0) return b; 1153 return (off_t)(seconds/mpg123_tpf(mh)); 1154 } 1155 1156 /* 1157 Now, where are we? We need to know the last decoded frame... and what's left of it in buffer. 1158 The current frame number can mean the last decoded frame or the to-be-decoded frame. 1159 If mh->to_decode, then mh->num frames have been decoded, the frame mh->num now coming next. 1160 If not, we have the possibility of mh->num+1 frames being decoded or nothing at all. 1161 Then, there is firstframe...when we didn't reach it yet, then the next data will come from there. 1162 mh->num starts with -1 1163 */ 1164 off_t attribute_align_arg mpg123_tell(mpg123_handle *mh) 1165 { 1166 if(mh == NULL) return MPG123_ERR; 1167 if(track_need_init(mh)) return 0; 1168 /* Now we have all the info at hand. */ 1169 debug5("tell: %li/%i first %li buffer %lu; frame_outs=%li", (long)mh->num, mh->to_decode, (long)mh->firstframe, (unsigned long)mh->buffer.fill, (long)frame_outs(mh, mh->num)); 1170 1171 { /* Funny block to keep C89 happy. */ 1172 off_t pos = 0; 1173 if((mh->num < mh->firstframe) || (mh->num == mh->firstframe && mh->to_decode)) 1174 { /* We are at the beginning, expect output from firstframe on. */ 1175 pos = frame_outs(mh, mh->firstframe); 1176 #ifdef GAPLESS 1177 pos += mh->firstoff; 1178 #endif 1179 } 1180 else if(mh->to_decode) 1181 { /* We start fresh with this frame. Buffer should be empty, but we make sure to count it in. */ 1182 pos = frame_outs(mh, mh->num) - bytes_to_samples(mh, mh->buffer.fill); 1183 } 1184 else 1185 { /* We serve what we have in buffer and then the beginning of next frame... */ 1186 pos = frame_outs(mh, mh->num+1) - bytes_to_samples(mh, mh->buffer.fill); 1187 } 1188 /* Substract padding and delay from the beginning. */ 1189 pos = SAMPLE_ADJUST(mh,pos); 1190 /* Negative sample offsets are not right, less than nothing is still nothing. */ 1191 return pos>0 ? pos : 0; 1192 } 1193 } 1194 1195 off_t attribute_align_arg mpg123_tellframe(mpg123_handle *mh) 1196 { 1197 if(mh == NULL) return MPG123_ERR; 1198 if(mh->num < mh->firstframe) return mh->firstframe; 1199 if(mh->to_decode) return mh->num; 1200 /* Consider firstoff? */ 1201 return mh->buffer.fill ? mh->num : mh->num + 1; 1202 } 1203 1204 off_t attribute_align_arg mpg123_tell_stream(mpg123_handle *mh) 1205 { 1206 if(mh == NULL) return MPG123_ERR; 1207 /* mh->rd is at least a bad_reader, so no worry. */ 1208 return mh->rd->tell(mh); 1209 } 1210 1211 static int do_the_seek(mpg123_handle *mh) 1212 { 1213 int b; 1214 off_t fnum = SEEKFRAME(mh); 1215 mh->buffer.fill = 0; 1216 1217 /* If we are inside the ignoreframe - firstframe window, we may get away without actual seeking. */ 1218 if(mh->num < mh->firstframe) 1219 { 1220 mh->to_decode = FALSE; /* In any case, don't decode the current frame, perhaps ignore instead. */ 1221 if(mh->num > fnum) return MPG123_OK; 1222 } 1223 1224 /* If we are already there, we are fine either for decoding or for ignoring. */ 1225 if(mh->num == fnum && (mh->to_decode || fnum < mh->firstframe)) return MPG123_OK; 1226 /* We have the frame before... just go ahead as normal. */ 1227 if(mh->num == fnum-1) 1228 { 1229 mh->to_decode = FALSE; 1230 return MPG123_OK; 1231 } 1232 1233 /* OK, real seeking follows... clear buffers and go for it. */ 1234 frame_buffers_reset(mh); 1235 #ifndef NO_NTOM 1236 if(mh->down_sample == 3) 1237 { 1238 ntom_set_ntom(mh, fnum); 1239 debug3("fixed ntom for frame %"OFF_P" to %lu, num=%"OFF_P, (off_p)fnum, mh->ntom_val[0], (off_p)mh->num); 1240 } 1241 #endif 1242 b = mh->rd->seek_frame(mh, fnum); 1243 if(mh->header_change > 1) 1244 { 1245 if(decode_update(mh) < 0) return MPG123_ERR; 1246 mh->header_change = 0; 1247 } 1248 debug1("seek_frame returned: %i", b); 1249 if(b<0) return b; 1250 /* Only mh->to_ignore is TRUE. */ 1251 if(mh->num < mh->firstframe) mh->to_decode = FALSE; 1252 1253 mh->playnum = mh->num; 1254 return 0; 1255 } 1256 1257 off_t attribute_align_arg mpg123_seek(mpg123_handle *mh, off_t sampleoff, int whence) 1258 { 1259 int b; 1260 off_t pos; 1261 1262 pos = mpg123_tell(mh); /* adjusted samples */ 1263 /* pos < 0 also can mean that simply a former seek failed at the lower levels. 1264 In that case, we only allow absolute seeks. */ 1265 if(pos < 0 && whence != SEEK_SET) 1266 { /* Unless we got the obvious error of NULL handle, this is a special seek failure. */ 1267 if(mh != NULL) mh->err = MPG123_NO_RELSEEK; 1268 return MPG123_ERR; 1269 } 1270 if((b=init_track(mh)) < 0) return b; 1271 switch(whence) 1272 { 1273 case SEEK_CUR: pos += sampleoff; break; 1274 case SEEK_SET: pos = sampleoff; break; 1275 case SEEK_END: 1276 /* When we do not know the end already, we can try to find it. */ 1277 if(mh->track_frames < 1 && (mh->rdat.flags & READER_SEEKABLE)) 1278 mpg123_scan(mh); 1279 if(mh->track_frames > 0) pos = SAMPLE_ADJUST(mh,frame_outs(mh, mh->track_frames)) - sampleoff; 1280 #ifdef GAPLESS 1281 else if(mh->end_os > 0) pos = SAMPLE_ADJUST(mh,mh->end_os) - sampleoff; 1282 #endif 1283 else 1284 { 1285 mh->err = MPG123_NO_SEEK_FROM_END; 1286 return MPG123_ERR; 1287 } 1288 break; 1289 default: mh->err = MPG123_BAD_WHENCE; return MPG123_ERR; 1290 } 1291 if(pos < 0) pos = 0; 1292 /* pos now holds the wanted sample offset in adjusted samples */ 1293 frame_set_seek(mh, SAMPLE_UNADJUST(mh,pos)); 1294 pos = do_the_seek(mh); 1295 if(pos < 0) return pos; 1296 1297 return mpg123_tell(mh); 1298 } 1299 1300 /* 1301 A bit more tricky... libmpg123 does not do the seeking itself. 1302 All it can do is to ignore frames until the wanted one is there. 1303 The caller doesn't know where a specific frame starts and mpg123 also only knows the general region after it scanned the file. 1304 Well, it is tricky... 1305 */ 1306 off_t attribute_align_arg mpg123_feedseek(mpg123_handle *mh, off_t sampleoff, int whence, off_t *input_offset) 1307 { 1308 int b; 1309 off_t pos; 1310 1311 pos = mpg123_tell(mh); /* adjusted samples */ 1312 debug3("seek from %li to %li (whence=%i)", (long)pos, (long)sampleoff, whence); 1313 /* The special seek error handling does not apply here... there is no lowlevel I/O. */ 1314 if(pos < 0) return pos; /* mh == NULL is covered in mpg123_tell() */ 1315 #ifndef NO_FEEDER 1316 if(input_offset == NULL) 1317 { 1318 mh->err = MPG123_NULL_POINTER; 1319 return MPG123_ERR; 1320 } 1321 1322 if((b=init_track(mh)) < 0) return b; /* May need more to do anything at all. */ 1323 1324 switch(whence) 1325 { 1326 case SEEK_CUR: pos += sampleoff; break; 1327 case SEEK_SET: pos = sampleoff; break; 1328 case SEEK_END: 1329 if(mh->track_frames > 0) pos = SAMPLE_ADJUST(mh,frame_outs(mh, mh->track_frames)) - sampleoff; 1330 #ifdef GAPLESS 1331 else if(mh->end_os >= 0) pos = SAMPLE_ADJUST(mh,mh->end_os) - sampleoff; 1332 #endif 1333 else 1334 { 1335 mh->err = MPG123_NO_SEEK_FROM_END; 1336 return MPG123_ERR; 1337 } 1338 break; 1339 default: mh->err = MPG123_BAD_WHENCE; return MPG123_ERR; 1340 } 1341 if(pos < 0) pos = 0; 1342 frame_set_seek(mh, SAMPLE_UNADJUST(mh,pos)); 1343 pos = SEEKFRAME(mh); 1344 mh->buffer.fill = 0; 1345 1346 /* Shortcuts without modifying input stream. */ 1347 *input_offset = mh->rdat.buffer.fileoff + mh->rdat.buffer.size; 1348 if(mh->num < mh->firstframe) mh->to_decode = FALSE; 1349 if(mh->num == pos && mh->to_decode) goto feedseekend; 1350 if(mh->num == pos-1) goto feedseekend; 1351 /* Whole way. */ 1352 *input_offset = feed_set_pos(mh, frame_index_find(mh, SEEKFRAME(mh), &pos)); 1353 mh->num = pos-1; /* The next read frame will have num = pos. */ 1354 if(*input_offset < 0) return MPG123_ERR; 1355 1356 feedseekend: 1357 return mpg123_tell(mh); 1358 #else 1359 mh->err = MPG123_MISSING_FEATURE; 1360 return MPG123_ERR; 1361 #endif 1362 } 1363 1364 off_t attribute_align_arg mpg123_seek_frame(mpg123_handle *mh, off_t offset, int whence) 1365 { 1366 int b; 1367 off_t pos = 0; 1368 1369 if(mh == NULL) return MPG123_ERR; 1370 if((b=init_track(mh)) < 0) return b; 1371 1372 /* Could play games here with to_decode... */ 1373 pos = mh->num; 1374 switch(whence) 1375 { 1376 case SEEK_CUR: pos += offset; break; 1377 case SEEK_SET: pos = offset; break; 1378 case SEEK_END: 1379 if(mh->track_frames > 0) pos = mh->track_frames - offset; 1380 else 1381 { 1382 mh->err = MPG123_NO_SEEK_FROM_END; 1383 return MPG123_ERR; 1384 } 1385 break; 1386 default: 1387 mh->err = MPG123_BAD_WHENCE; 1388 return MPG123_ERR; 1389 } 1390 if(pos < 0) pos = 0; 1391 /* Not limiting the possible position on end for the chance that there might be more to the stream than announced via track_frames. */ 1392 1393 frame_set_frameseek(mh, pos); 1394 pos = do_the_seek(mh); 1395 if(pos < 0) return pos; 1396 1397 return mpg123_tellframe(mh); 1398 } 1399 1400 int attribute_align_arg mpg123_set_filesize(mpg123_handle *mh, off_t size) 1401 { 1402 if(mh == NULL) return MPG123_BAD_HANDLE; 1403 1404 mh->rdat.filelen = size; 1405 return MPG123_OK; 1406 } 1407 1408 off_t attribute_align_arg mpg123_framelength(mpg123_handle *mh) 1409 { 1410 int b; 1411 if(mh == NULL) 1412 return MPG123_ERR; 1413 b = init_track(mh); 1414 if(b<0) 1415 return b; 1416 if(mh->track_frames > 0) 1417 return mh->track_frames; 1418 if(mh->rdat.filelen > 0) 1419 { /* A bad estimate. Ignoring tags 'n stuff. */ 1420 double bpf = mh->mean_framesize > 0. 1421 ? mh->mean_framesize 1422 : compute_bpf(mh); 1423 return (off_t)((double)(mh->rdat.filelen)/bpf+0.5); 1424 } 1425 /* Last resort: No view of the future, can at least count the frames that 1426 were already parsed. */ 1427 if(mh->num > -1) 1428 return mh->num+1; 1429 /* Giving up. */ 1430 return MPG123_ERR; 1431 } 1432 1433 off_t attribute_align_arg mpg123_length(mpg123_handle *mh) 1434 { 1435 int b; 1436 off_t length; 1437 1438 if(mh == NULL) return MPG123_ERR; 1439 b = init_track(mh); 1440 if(b<0) return b; 1441 if(mh->track_samples > -1) length = mh->track_samples; 1442 else if(mh->track_frames > 0) length = mh->track_frames*mh->spf; 1443 else if(mh->rdat.filelen > 0) /* Let the case of 0 length just fall through. */ 1444 { 1445 /* A bad estimate. Ignoring tags 'n stuff. */ 1446 double bpf = mh->mean_framesize ? mh->mean_framesize : compute_bpf(mh); 1447 length = (off_t)((double)(mh->rdat.filelen)/bpf*mh->spf); 1448 } 1449 else if(mh->rdat.filelen == 0) return mpg123_tell(mh); /* we could be in feeder mode */ 1450 else return MPG123_ERR; /* No length info there! */ 1451 1452 debug1("mpg123_length: internal sample length: %"OFF_P, (off_p)length); 1453 1454 length = frame_ins2outs(mh, length); 1455 debug1("mpg123_length: external sample length: %"OFF_P, (off_p)length); 1456 length = SAMPLE_ADJUST(mh,length); 1457 return length; 1458 } 1459 1460 1461 int attribute_align_arg mpg123_scan(mpg123_handle *mh) 1462 { 1463 int b; 1464 off_t oldpos; 1465 off_t track_frames = 0; 1466 off_t track_samples = 0; 1467 1468 if(mh == NULL) return MPG123_BAD_HANDLE; 1469 if(!(mh->rdat.flags & READER_SEEKABLE)){ mh->err = MPG123_NO_SEEK; return MPG123_ERR; } 1470 /* Scan through the _whole_ file, since the current position is no count but computed assuming constant samples per frame. */ 1471 /* Also, we can just keep the current buffer and seek settings. Just operate on input frames here. */ 1472 debug("issuing scan"); 1473 b = init_track(mh); /* mh->num >= 0 !! */ 1474 if(b<0) 1475 { 1476 if(b == MPG123_DONE) return MPG123_OK; 1477 else return MPG123_ERR; /* Must be error here, NEED_MORE is not for seekable streams. */ 1478 } 1479 oldpos = mpg123_tell(mh); 1480 b = mh->rd->seek_frame(mh, 0); 1481 if(b<0 || mh->num != 0) return MPG123_ERR; 1482 /* One frame must be there now. */ 1483 track_frames = 1; 1484 track_samples = mh->spf; /* Internal samples. */ 1485 debug("TODO: We should disable gapless code when encountering inconsistent mh->spf!"); 1486 debug(" ... at least unset MPG123_ACCURATE."); 1487 /* Do not increment mh->track_frames in the loop as tha would confuse Frankenstein detection. */ 1488 while(read_frame(mh) == 1) 1489 { 1490 ++track_frames; 1491 track_samples += mh->spf; 1492 } 1493 mh->track_frames = track_frames; 1494 mh->track_samples = track_samples; 1495 debug2("Scanning yielded %"OFF_P" track samples, %"OFF_P" frames.", (off_p)mh->track_samples, (off_p)mh->track_frames); 1496 #ifdef GAPLESS 1497 /* Also, think about usefulness of that extra value track_samples ... it could be used for consistency checking. */ 1498 if(mh->p.flags & MPG123_GAPLESS) frame_gapless_update(mh, mh->track_samples); 1499 #endif 1500 return mpg123_seek(mh, oldpos, SEEK_SET) >= 0 ? MPG123_OK : MPG123_ERR; 1501 } 1502 1503 int attribute_align_arg mpg123_meta_check(mpg123_handle *mh) 1504 { 1505 if(mh != NULL) return mh->metaflags; 1506 else return 0; 1507 } 1508 1509 void attribute_align_arg mpg123_meta_free(mpg123_handle *mh) 1510 { 1511 if(mh == NULL) return; 1512 1513 reset_id3(mh); 1514 reset_icy(&mh->icy); 1515 } 1516 1517 int attribute_align_arg mpg123_id3(mpg123_handle *mh, mpg123_id3v1 **v1, mpg123_id3v2 **v2) 1518 { 1519 if(v1 != NULL) *v1 = NULL; 1520 if(v2 != NULL) *v2 = NULL; 1521 if(mh == NULL) return MPG123_BAD_HANDLE; 1522 1523 if(mh->metaflags & MPG123_ID3) 1524 { 1525 id3_link(mh); 1526 if(v1 != NULL && mh->rdat.flags & READER_ID3TAG) *v1 = (mpg123_id3v1*) mh->id3buf; 1527 if(v2 != NULL) 1528 #ifdef NO_ID3V2 1529 *v2 = NULL; 1530 #else 1531 *v2 = &mh->id3v2; 1532 #endif 1533 1534 mh->metaflags |= MPG123_ID3; 1535 mh->metaflags &= ~MPG123_NEW_ID3; 1536 } 1537 return MPG123_OK; 1538 } 1539 1540 int attribute_align_arg mpg123_id3_raw( mpg123_handle *mh 1541 , unsigned char **v1, size_t *v1_size 1542 , unsigned char **v2, size_t *v2_size ) 1543 { 1544 if(!mh) 1545 return MPG123_ERR; 1546 if(v1 != NULL) 1547 *v1 = mh->id3buf[0] ? mh->id3buf : NULL; 1548 if(v1_size != NULL) 1549 *v1_size = mh->id3buf[0] ? 128 : 0; 1550 if(v2 != NULL) 1551 *v2 = mh->id3v2_raw; 1552 if(v2_size != NULL) 1553 *v2_size = mh->id3v2_size; 1554 return MPG123_OK; 1555 } 1556 1557 int attribute_align_arg mpg123_icy(mpg123_handle *mh, char **icy_meta) 1558 { 1559 if(mh == NULL) return MPG123_BAD_HANDLE; 1560 #ifndef NO_ICY 1561 if(icy_meta == NULL) 1562 { 1563 mh->err = MPG123_NULL_POINTER; 1564 return MPG123_ERR; 1565 } 1566 *icy_meta = NULL; 1567 1568 if(mh->metaflags & MPG123_ICY) 1569 { 1570 *icy_meta = mh->icy.data; 1571 mh->metaflags |= MPG123_ICY; 1572 mh->metaflags &= ~MPG123_NEW_ICY; 1573 } 1574 return MPG123_OK; 1575 #else 1576 mh->err = MPG123_MISSING_FEATURE; 1577 return MPG123_ERR; 1578 #endif 1579 } 1580 1581 char* attribute_align_arg mpg123_icy2utf8(const char* icy_text) 1582 { 1583 #ifndef NO_ICY 1584 return icy2utf8(icy_text, 0); 1585 #else 1586 return NULL; 1587 #endif 1588 } 1589 1590 /* That one is always defined... it's not worth it to remove it for NO_ID3V2. */ 1591 enum mpg123_text_encoding attribute_align_arg mpg123_enc_from_id3(unsigned char id3_enc_byte) 1592 { 1593 switch(id3_enc_byte) 1594 { 1595 case mpg123_id3_latin1: return mpg123_text_latin1; 1596 case mpg123_id3_utf16bom: return mpg123_text_utf16bom; /* ID3v2.3 has UCS-2 with BOM here. */ 1597 case mpg123_id3_utf16be: return mpg123_text_utf16be; 1598 case mpg123_id3_utf8: return mpg123_text_utf8; 1599 default: return mpg123_text_unknown; 1600 } 1601 } 1602 1603 #ifndef NO_STRING 1604 int mpg123_store_utf8(mpg123_string *sb, enum mpg123_text_encoding enc, const unsigned char *source, size_t source_size) 1605 { 1606 switch(enc) 1607 { 1608 #ifndef NO_ID3V2 1609 /* The encodings we get from ID3v2 tags. */ 1610 case mpg123_text_utf8: 1611 id3_to_utf8(sb, mpg123_id3_utf8, source, source_size, 0); 1612 break; 1613 case mpg123_text_latin1: 1614 id3_to_utf8(sb, mpg123_id3_latin1, source, source_size, 0); 1615 break; 1616 case mpg123_text_utf16bom: 1617 case mpg123_text_utf16: 1618 id3_to_utf8(sb, mpg123_id3_utf16bom, source, source_size, 0); 1619 break; 1620 /* Special because one cannot skip zero bytes here. */ 1621 case mpg123_text_utf16be: 1622 id3_to_utf8(sb, mpg123_id3_utf16be, source, source_size, 0); 1623 break; 1624 #endif 1625 #ifndef NO_ICY 1626 /* ICY encoding... */ 1627 case mpg123_text_icy: 1628 case mpg123_text_cp1252: 1629 { 1630 mpg123_free_string(sb); 1631 /* Paranoia: Make sure that the string ends inside the buffer... */ 1632 if(source[source_size-1] == 0) 1633 { 1634 /* Convert from ICY encoding... with force applied or not. */ 1635 char *tmpstring = icy2utf8((const char*)source, enc == mpg123_text_cp1252 ? 1 : 0); 1636 if(tmpstring != NULL) 1637 { 1638 mpg123_set_string(sb, tmpstring); 1639 free(tmpstring); 1640 } 1641 } 1642 } 1643 break; 1644 #endif 1645 default: 1646 mpg123_free_string(sb); 1647 } 1648 /* At least a trailing null of some form should be there... */ 1649 return (sb->fill > 0) ? 1 : 0; 1650 } 1651 #endif 1652 1653 int attribute_align_arg mpg123_index(mpg123_handle *mh, off_t **offsets, off_t *step, size_t *fill) 1654 { 1655 if(mh == NULL) return MPG123_BAD_HANDLE; 1656 if(offsets == NULL || step == NULL || fill == NULL) 1657 { 1658 mh->err = MPG123_BAD_INDEX_PAR; 1659 return MPG123_ERR; 1660 } 1661 #ifdef FRAME_INDEX 1662 *offsets = mh->index.data; 1663 *step = mh->index.step; 1664 *fill = mh->index.fill; 1665 #else 1666 *offsets = NULL; 1667 *step = 0; 1668 *fill = 0; 1669 #endif 1670 return MPG123_OK; 1671 } 1672 1673 int attribute_align_arg mpg123_set_index(mpg123_handle *mh, off_t *offsets, off_t step, size_t fill) 1674 { 1675 if(mh == NULL) return MPG123_BAD_HANDLE; 1676 #ifdef FRAME_INDEX 1677 if(step == 0) 1678 { 1679 mh->err = MPG123_BAD_INDEX_PAR; 1680 return MPG123_ERR; 1681 } 1682 if(fi_set(&mh->index, offsets, step, fill) == -1) 1683 { 1684 mh->err = MPG123_OUT_OF_MEM; 1685 return MPG123_ERR; 1686 } 1687 return MPG123_OK; 1688 #else 1689 mh->err = MPG123_MISSING_FEATURE; 1690 return MPG123_ERR; 1691 #endif 1692 } 1693 1694 int attribute_align_arg mpg123_close(mpg123_handle *mh) 1695 { 1696 if(mh == NULL) return MPG123_BAD_HANDLE; 1697 1698 /* mh->rd is never NULL! */ 1699 if(mh->rd->close != NULL) mh->rd->close(mh); 1700 1701 if(mh->new_format) 1702 { 1703 debug("Hey, we are closing a track before the new format has been queried..."); 1704 invalidate_format(&mh->af); 1705 mh->new_format = 0; 1706 } 1707 /* Always reset the frame buffers on close, so we cannot forget it in funky opening routines (wrappers, even). */ 1708 frame_reset(mh); 1709 return MPG123_OK; 1710 } 1711 1712 void attribute_align_arg mpg123_delete(mpg123_handle *mh) 1713 { 1714 if(mh != NULL) 1715 { 1716 mpg123_close(mh); 1717 frame_exit(mh); /* free buffers in frame */ 1718 free(mh); /* free struct; cast? */ 1719 } 1720 } 1721 1722 void attribute_align_arg mpg123_free(void *ptr) 1723 { 1724 free(ptr); 1725 } 1726 1727 static const char *mpg123_error[] = 1728 { 1729 "No error... (code 0)", 1730 "Unable to set up output format! (code 1)", 1731 "Invalid channel number specified. (code 2)", 1732 "Invalid sample rate specified. (code 3)", 1733 "Unable to allocate memory for 16 to 8 converter table! (code 4)", 1734 "Bad parameter id! (code 5)", 1735 "Bad buffer given -- invalid pointer or too small size. (code 6)", 1736 "Out of memory -- some malloc() failed. (code 7)", 1737 "You didn't initialize the library! (code 8)", 1738 "Invalid decoder choice. (code 9)", 1739 "Invalid mpg123 handle. (code 10)", 1740 "Unable to initialize frame buffers (out of memory?)! (code 11)", 1741 "Invalid RVA mode. (code 12)", 1742 "This build doesn't support gapless decoding. (code 13)", 1743 "Not enough buffer space. (code 14)", 1744 "Incompatible numeric data types. (code 15)", 1745 "Bad equalizer band. (code 16)", 1746 "Null pointer given where valid storage address needed. (code 17)", 1747 "Error reading the stream. (code 18)", 1748 "Cannot seek from end (end is not known). (code 19)", 1749 "Invalid 'whence' for seek function. (code 20)", 1750 "Build does not support stream timeouts. (code 21)", 1751 "File access error. (code 22)", 1752 "Seek not supported by stream. (code 23)", 1753 "No stream opened. (code 24)", 1754 "Bad parameter handle. (code 25)", 1755 "Invalid parameter addresses for index retrieval. (code 26)", 1756 "Lost track in the bytestream and did not attempt resync. (code 27)", 1757 "Failed to find valid MPEG data within limit on resync. (code 28)", 1758 "No 8bit encoding possible. (code 29)", 1759 "Stack alignment is not good. (code 30)", 1760 "You gave me a NULL buffer? (code 31)", 1761 "File position is screwed up, please do an absolute seek (code 32)", 1762 "Inappropriate NULL-pointer provided.", 1763 "Bad key value given.", 1764 "There is no frame index (disabled in this build).", 1765 "Frame index operation failed.", 1766 "Decoder setup failed (invalid combination of settings?)", 1767 "Feature not in this build." 1768 ,"Some bad value has been provided." 1769 ,"Low-level seeking has failed (call to lseek(), usually)." 1770 ,"Custom I/O obviously not prepared." 1771 ,"Overflow in LFS (large file support) conversion." 1772 ,"Overflow in integer conversion." 1773 }; 1774 1775 const char* attribute_align_arg mpg123_plain_strerror(int errcode) 1776 { 1777 if(errcode >= 0 && errcode < sizeof(mpg123_error)/sizeof(char*)) 1778 return mpg123_error[errcode]; 1779 else switch(errcode) 1780 { 1781 case MPG123_ERR: 1782 return "A generic mpg123 error."; 1783 case MPG123_DONE: 1784 return "Message: I am done with this track."; 1785 case MPG123_NEED_MORE: 1786 return "Message: Feed me more input data!"; 1787 case MPG123_NEW_FORMAT: 1788 return "Message: Prepare for a changed audio format (query the new one)!"; 1789 default: 1790 return "I have no idea - an unknown error code!"; 1791 } 1792 } 1793 1794 int attribute_align_arg mpg123_errcode(mpg123_handle *mh) 1795 { 1796 if(mh != NULL) return mh->err; 1797 return MPG123_BAD_HANDLE; 1798 } 1799 1800 const char* attribute_align_arg mpg123_strerror(mpg123_handle *mh) 1801 { 1802 return mpg123_plain_strerror(mpg123_errcode(mh)); 1803 } 1804