Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.         frame: Heap of routines dealing with the core mpg123 data structure.
  3.  
  4.         copyright 2008-9 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
  7. */
  8.  
  9. #include "mpg123lib_intern.h"
  10. #include "getcpuflags.h"
  11. #include "debug.h"
  12.  
  13. static void frame_fixed_reset(mpg123_handle *fr);
  14.  
  15. /* that's doubled in decode_ntom.c */
  16. #define NTOM_MUL (32768)
  17. #define aligned_pointer(p,type,alignment) \
  18.         (((char*)(p)-(char*)NULL) % (alignment)) \
  19.         ? (type*)((char*)(p) + (alignment) - (((char*)(p)-(char*)NULL) % (alignment))) \
  20.         : (type*)(p)
  21. void frame_default_pars(mpg123_pars *mp)
  22. {
  23.         mp->outscale = 1.0;
  24. #ifdef GAPLESS
  25.         mp->flags = MPG123_GAPLESS;
  26. #else
  27.         mp->flags = 0;
  28. #endif
  29. #ifndef NO_NTOM
  30.         mp->force_rate = 0;
  31. #endif
  32.         mp->down_sample = 0;
  33.         mp->rva = 0;
  34.         mp->halfspeed = 0;
  35.         mp->doublespeed = 0;
  36.         mp->verbose = 0;
  37. #ifndef NO_ICY
  38.         mp->icy_interval = 0;
  39. #endif
  40. #ifndef WIN32
  41.         mp->timeout = 0;
  42. #endif
  43.         mp->resync_limit = 1024;
  44. #ifdef FRAME_INDEX
  45.         mp->index_size = INDEX_SIZE;
  46. #endif
  47.         mp->preframes = 4; /* That's good  for layer 3 ISO compliance bitstream. */
  48.         mpg123_fmt_all(mp);
  49. }
  50.  
  51. void frame_init(mpg123_handle *fr)
  52. {
  53.         frame_init_par(fr, NULL);
  54. }
  55.  
  56. void frame_init_par(mpg123_handle *fr, mpg123_pars *mp)
  57. {
  58.         fr->own_buffer = FALSE;
  59.         fr->buffer.data = NULL;
  60.         fr->rawbuffs = NULL;
  61.         fr->rawbuffss = 0;
  62.         fr->rawdecwin = NULL;
  63.         fr->rawdecwins = 0;
  64. #ifndef NO_8BIT
  65.         fr->conv16to8_buf = NULL;
  66. #endif
  67. #ifdef OPT_DITHER
  68.         fr->dithernoise = NULL;
  69. #endif
  70.         fr->xing_toc = NULL;
  71.         fr->cpu_opts.type = defdec();
  72.         fr->cpu_opts.class = decclass(fr->cpu_opts.type);
  73. #ifndef NO_NTOM
  74.         /* these two look unnecessary, check guarantee for synth_ntom_set_step (in control_generic, even)! */
  75.         fr->ntom_val[0] = NTOM_MUL>>1;
  76.         fr->ntom_val[1] = NTOM_MUL>>1;
  77.         fr->ntom_step = NTOM_MUL;
  78. #endif
  79.         /* unnecessary: fr->buffer.size = fr->buffer.fill = 0; */
  80.         mpg123_reset_eq(fr);
  81.         init_icy(&fr->icy);
  82.         init_id3(fr);
  83.         /* frame_outbuffer is missing... */
  84.         /* frame_buffers is missing... that one needs cpu opt setting! */
  85.         /* after these... frame_reset is needed before starting full decode */
  86.         invalidate_format(&fr->af);
  87.         fr->rdat.r_read = NULL;
  88.         fr->rdat.r_lseek = NULL;
  89.         fr->decoder_change = 1;
  90.         fr->err = MPG123_OK;
  91.         if(mp == NULL) frame_default_pars(&fr->p);
  92.         else memcpy(&fr->p, mp, sizeof(struct mpg123_pars_struct));
  93.  
  94.         fr->down_sample = 0; /* Initialize to silence harmless errors when debugging. */
  95.         frame_fixed_reset(fr); /* Reset only the fixed data, dynamic buffers are not there yet! */
  96.         fr->synth = NULL;
  97.         fr->synth_mono = NULL;
  98.         fr->make_decode_tables = NULL;
  99. #ifdef FRAME_INDEX
  100.         fi_init(&fr->index);
  101.         frame_index_setup(fr); /* Apply the size setting. */
  102. #endif
  103. }
  104.  
  105. #ifdef OPT_DITHER
  106. /* Also, only allocate the memory for the table on demand.
  107.    In future, one could create special noise for different sampling frequencies(?). */
  108. int frame_dither_init(mpg123_handle *fr)
  109. {
  110.         /* run-time dither noise table generation */
  111.         if(fr->dithernoise == NULL)
  112.         {
  113.                 fr->dithernoise = malloc(sizeof(float)*DITHERSIZE);
  114.                 if(fr->dithernoise == NULL) return 0;
  115.  
  116.                 dither_table_init(fr->dithernoise);
  117.         }
  118.         return 1;
  119. }
  120. #endif
  121.  
  122. mpg123_pars attribute_align_arg *mpg123_new_pars(int *error)
  123. {
  124.         mpg123_pars *mp = malloc(sizeof(struct mpg123_pars_struct));
  125.         if(mp != NULL){ frame_default_pars(mp); if(error != NULL) *error = MPG123_OK; }
  126.         else if(error != NULL) *error = MPG123_OUT_OF_MEM;
  127.         return mp;
  128. }
  129.  
  130. void attribute_align_arg mpg123_delete_pars(mpg123_pars* mp)
  131. {
  132.         if(mp != NULL) free(mp);
  133. }
  134.  
  135. int attribute_align_arg mpg123_reset_eq(mpg123_handle *mh)
  136. {
  137.         int i;
  138.         mh->have_eq_settings = 0;
  139.         for(i=0; i < 32; ++i) mh->equalizer[0][i] = mh->equalizer[1][i] = DOUBLE_TO_REAL(1.0);
  140.  
  141.         return MPG123_OK;
  142. }
  143.  
  144. int frame_outbuffer(mpg123_handle *fr)
  145. {
  146.         size_t size = mpg123_safe_buffer()*AUDIOBUFSIZE;
  147.         if(!fr->own_buffer) fr->buffer.data = NULL;
  148.         if(fr->buffer.data != NULL && fr->buffer.size != size)
  149.         {
  150.                 free(fr->buffer.data);
  151.                 fr->buffer.data = NULL;
  152.         }
  153.         fr->buffer.size = size;
  154.         if(fr->buffer.data == NULL) fr->buffer.data = (unsigned char*) malloc(fr->buffer.size);
  155.         if(fr->buffer.data == NULL)
  156.         {
  157.                 fr->err = MPG123_OUT_OF_MEM;
  158.                 return -1;
  159.         }
  160.         fr->own_buffer = TRUE;
  161.         fr->buffer.fill = 0;
  162.         return 0;
  163. }
  164.  
  165. int attribute_align_arg mpg123_replace_buffer(mpg123_handle *mh, unsigned char *data, size_t size)
  166. {
  167.         if(data == NULL || size < mpg123_safe_buffer())
  168.         {
  169.                 mh->err = MPG123_BAD_BUFFER;
  170.                 return MPG123_ERR;
  171.         }
  172.         if(mh->own_buffer && mh->buffer.data != NULL) free(mh->buffer.data);
  173.         mh->own_buffer = FALSE;
  174.         mh->buffer.data = data;
  175.         mh->buffer.size = size;
  176.         mh->buffer.fill = 0;
  177.         return MPG123_OK;
  178. }
  179.  
  180. #ifdef FRAME_INDEX
  181. int frame_index_setup(mpg123_handle *fr)
  182. {
  183.         int ret = MPG123_ERR;
  184.         if(fr->p.index_size >= 0)
  185.         { /* Simple fixed index. */
  186.                 fr->index.grow_size = 0;
  187.                 debug1("resizing index to %li", fr->p.index_size);
  188.                 ret = fi_resize(&fr->index, (size_t)fr->p.index_size);
  189.                 debug2("index resized... %lu at %p", (unsigned long)fr->index.size, (void*)fr->index.data);
  190.         }
  191.         else
  192.         { /* A growing index. We give it a start, though. */
  193.                 fr->index.grow_size = (size_t)(- fr->p.index_size);
  194.                 if(fr->index.size < fr->index.grow_size)
  195.                 ret = fi_resize(&fr->index, fr->index.grow_size);
  196.                 else
  197.                 ret = MPG123_OK; /* We have minimal size already... and since growing is OK... */
  198.         }
  199.         debug2("set up frame index of size %lu (ret=%i)", (unsigned long)fr->index.size, ret);
  200.  
  201.         return ret;
  202. }
  203. #endif
  204.  
  205. static void frame_decode_buffers_reset(mpg123_handle *fr)
  206. {
  207.         memset(fr->rawbuffs, 0, fr->rawbuffss);
  208. }
  209.  
  210. int frame_buffers(mpg123_handle *fr)
  211. {
  212.         int buffssize = 0;
  213.         debug1("frame %p buffer", (void*)fr);
  214. /*
  215.         the used-to-be-static buffer of the synth functions, has some subtly different types/sizes
  216.  
  217.         2to1, 4to1, ntom, generic, i386: real[2][2][0x110]
  218.         mmx, sse: short[2][2][0x110]
  219.         i586(_dither): 4352 bytes; int/long[2][2][0x110]
  220.         i486: int[2][2][17*FIR_BUFFER_SIZE]
  221.         altivec: static real __attribute__ ((aligned (16))) buffs[4][4][0x110]
  222.  
  223.         Huh, altivec looks like fun. Well, let it be large... then, the 16 byte alignment seems to be implicit on MacOSX malloc anyway.
  224.         Let's make a reasonable attempt to allocate enough memory...
  225.         Keep in mind: biggest ones are i486 and altivec (mutually exclusive!), then follows i586 and normal real.
  226.         mmx/sse use short but also real for resampling.
  227.         Thus, minimum is 2*2*0x110*sizeof(real).
  228. */
  229.         if(fr->cpu_opts.type == altivec) buffssize = 4*4*0x110*sizeof(real);
  230. #ifdef OPT_I486
  231.         else if(fr->cpu_opts.type == ivier) buffssize = 2*2*17*FIR_BUFFER_SIZE*sizeof(int);
  232. #endif
  233.         else if(fr->cpu_opts.type == ifuenf || fr->cpu_opts.type == ifuenf_dither || fr->cpu_opts.type == dreidnow)
  234.         buffssize = 2*2*0x110*4; /* don't rely on type real, we need 4352 bytes */
  235.  
  236.         if(2*2*0x110*sizeof(real) > buffssize)
  237.         buffssize = 2*2*0x110*sizeof(real);
  238.         buffssize += 15; /* For 16-byte alignment (SSE likes that). */
  239.  
  240.         if(fr->rawbuffs != NULL && fr->rawbuffss != buffssize)
  241.         {
  242.                 free(fr->rawbuffs);
  243.                 fr->rawbuffs = NULL;
  244.         }
  245.  
  246.         if(fr->rawbuffs == NULL) fr->rawbuffs = (unsigned char*) malloc(buffssize);
  247.         if(fr->rawbuffs == NULL) return -1;
  248.         fr->rawbuffss = buffssize;
  249.         fr->short_buffs[0][0] = aligned_pointer(fr->rawbuffs,short,16);
  250.         fr->short_buffs[0][1] = fr->short_buffs[0][0] + 0x110;
  251.         fr->short_buffs[1][0] = fr->short_buffs[0][1] + 0x110;
  252.         fr->short_buffs[1][1] = fr->short_buffs[1][0] + 0x110;
  253.         fr->real_buffs[0][0] = aligned_pointer(fr->rawbuffs,real,16);
  254.         fr->real_buffs[0][1] = fr->real_buffs[0][0] + 0x110;
  255.         fr->real_buffs[1][0] = fr->real_buffs[0][1] + 0x110;
  256.         fr->real_buffs[1][1] = fr->real_buffs[1][0] + 0x110;
  257. #ifdef OPT_I486
  258.         if(fr->cpu_opts.type == ivier)
  259.         {
  260.                 fr->int_buffs[0][0] = (int*) fr->rawbuffs;
  261.                 fr->int_buffs[0][1] = fr->int_buffs[0][0] + 17*FIR_BUFFER_SIZE;
  262.                 fr->int_buffs[1][0] = fr->int_buffs[0][1] + 17*FIR_BUFFER_SIZE;
  263.                 fr->int_buffs[1][1] = fr->int_buffs[1][0] + 17*FIR_BUFFER_SIZE;
  264.         }
  265. #endif
  266. #ifdef OPT_ALTIVEC
  267.         if(fr->cpu_opts.type == altivec)
  268.         {
  269.                 int i,j;
  270.                 fr->areal_buffs[0][0] = (real*) fr->rawbuffs;
  271.                 for(i=0; i<4; ++i) for(j=0; j<4; ++j)
  272.                 fr->areal_buffs[i][j] = fr->areal_buffs[0][0] + (i*4+j)*0x110;
  273.         }
  274. #endif
  275.         /* now the different decwins... all of the same size, actually */
  276.         /* The MMX ones want 32byte alignment, which I'll try to ensure manually */
  277.         {
  278.                 int decwin_size = (512+32)*sizeof(real);
  279. #ifdef OPT_MMXORSSE
  280. #ifdef OPT_MULTI
  281.                 if(fr->cpu_opts.class == mmxsse)
  282.                 {
  283. #endif
  284.                         /* decwin_mmx will share, decwins will be appended ... sizeof(float)==4 */
  285.                         if(decwin_size < (512+32)*4) decwin_size = (512+32)*4;
  286.  
  287.                         /* the second window + alignment zone -- we align for 32 bytes for SSE as
  288.                            requirement, 64 byte for matching cache line size (that matters!) */
  289.                         decwin_size += (512+32)*4 + 63;
  290.                         /* (512+32)*4/32 == 2176/32 == 68, so one decwin block retains alignment for 32 or 64 bytes */
  291. #ifdef OPT_MULTI
  292.                 }
  293. #endif
  294. #endif
  295. #if defined(OPT_ALTIVEC) || defined(OPT_ARM)
  296.                 if(decwin_size < (512+32)*4) decwin_size = (512+32)*4;
  297.                 decwin_size += 512*4;
  298. #endif
  299.                 /* Hm, that's basically realloc() ... */
  300.                 if(fr->rawdecwin != NULL && fr->rawdecwins != decwin_size)
  301.                 {
  302.                         free(fr->rawdecwin);
  303.                         fr->rawdecwin = NULL;
  304.                 }
  305.  
  306.                 if(fr->rawdecwin == NULL)
  307.                 fr->rawdecwin = (unsigned char*) malloc(decwin_size);
  308.  
  309.                 if(fr->rawdecwin == NULL) return -1;
  310.  
  311.                 fr->rawdecwins = decwin_size;
  312.                 fr->decwin = (real*) fr->rawdecwin;
  313. #ifdef OPT_MMXORSSE
  314. #ifdef OPT_MULTI
  315.                 if(fr->cpu_opts.class == mmxsse)
  316.                 {
  317. #endif
  318.                         /* align decwin, assign that to decwin_mmx, append decwins */
  319.                         /* I need to add to decwin what is missing to the next full 64 byte -- also I want to make gcc -pedantic happy... */
  320.                         fr->decwin = aligned_pointer(fr->rawdecwin,real,64);
  321.                         debug1("aligned decwin: %p", (void*)fr->decwin);
  322.                         fr->decwin_mmx = (float*)fr->decwin;
  323.                         fr->decwins = fr->decwin_mmx+512+32;
  324. #ifdef OPT_MULTI
  325.                 }
  326.                 else debug("no decwins/decwin_mmx for that class");
  327. #endif
  328. #endif
  329.         }
  330.         /* Only reset the buffers we created just now. */
  331.         frame_decode_buffers_reset(fr);
  332.  
  333.         debug1("frame %p buffer done", (void*)fr);
  334.         return 0;
  335. }
  336.  
  337. int frame_buffers_reset(mpg123_handle *fr)
  338. {
  339.         fr->buffer.fill = 0; /* hm, reset buffer fill... did we do a flush? */
  340.         fr->bsnum = 0;
  341.         /* Wondering: could it be actually _wanted_ to retain buffer contents over different files? (special gapless / cut stuff) */
  342.         fr->bsbuf = fr->bsspace[1];
  343.         fr->bsbufold = fr->bsbuf;
  344.         fr->bitreservoir = 0; /* Not entirely sure if this is the right place for that counter. */
  345.         frame_decode_buffers_reset(fr);
  346.         memset(fr->bsspace, 0, 2*(MAXFRAMESIZE+512));
  347.         memset(fr->ssave, 0, 34);
  348.         fr->hybrid_blc[0] = fr->hybrid_blc[1] = 0;
  349.         memset(fr->hybrid_block, 0, sizeof(real)*2*2*SBLIMIT*SSLIMIT);
  350.         return 0;
  351. }
  352.  
  353. void frame_icy_reset(mpg123_handle* fr)
  354. {
  355. #ifndef NO_ICY
  356.         if(fr->icy.data != NULL) free(fr->icy.data);
  357.         fr->icy.data = NULL;
  358.         fr->icy.interval = 0;
  359.         fr->icy.next = 0;
  360. #endif
  361. }
  362.  
  363. void frame_free_toc(mpg123_handle *fr)
  364. {
  365.         if(fr->xing_toc != NULL){ free(fr->xing_toc); fr->xing_toc = NULL; }
  366. }
  367.  
  368. /* Just copy the Xing TOC over... */
  369. int frame_fill_toc(mpg123_handle *fr, unsigned char* in)
  370. {
  371.         if(fr->xing_toc == NULL) fr->xing_toc = malloc(100);
  372.         if(fr->xing_toc != NULL)
  373.         {
  374.                 memcpy(fr->xing_toc, in, 100);
  375. #ifdef DEBUG
  376.                 debug("Got a TOC! Showing the values...");
  377.                 {
  378.                         int i;
  379.                         for(i=0; i<100; ++i)
  380.                         debug2("entry %i = %i", i, fr->xing_toc[i]);
  381.                 }
  382. #endif
  383.                 return TRUE;
  384.         }
  385.         return FALSE;
  386. }
  387.  
  388. /* Prepare the handle for a new track.
  389.    Reset variables, buffers... */
  390. int frame_reset(mpg123_handle* fr)
  391. {
  392.         frame_buffers_reset(fr);
  393.         frame_fixed_reset(fr);
  394.         frame_free_toc(fr);
  395. #ifdef FRAME_INDEX
  396.         fi_reset(&fr->index);
  397. #endif
  398.  
  399.         return 0;
  400. }
  401.  
  402. /* Reset everythign except dynamic memory. */
  403. static void frame_fixed_reset(mpg123_handle *fr)
  404. {
  405.         frame_icy_reset(fr);
  406.         open_bad(fr);
  407.         fr->to_decode = FALSE;
  408.         fr->to_ignore = FALSE;
  409.         fr->metaflags = 0;
  410.         fr->outblock = mpg123_safe_buffer();
  411.         fr->num = -1;
  412.         fr->playnum = -1;
  413.         fr->accurate = TRUE;
  414.         fr->silent_resync = 0;
  415.         fr->audio_start = 0;
  416.         fr->clip = 0;
  417.         fr->oldhead = 0;
  418.         fr->firsthead = 0;
  419.         fr->vbr = MPG123_CBR;
  420.         fr->abr_rate = 0;
  421.         fr->track_frames = 0;
  422.         fr->track_samples = -1;
  423.         fr->framesize=0;
  424.         fr->mean_frames = 0;
  425.         fr->mean_framesize = 0;
  426.         fr->freesize = 0;
  427.         fr->lastscale = -1;
  428.         fr->rva.level[0] = -1;
  429.         fr->rva.level[1] = -1;
  430.         fr->rva.gain[0] = 0;
  431.         fr->rva.gain[1] = 0;
  432.         fr->rva.peak[0] = 0;
  433.         fr->rva.peak[1] = 0;
  434.         fr->fsizeold = 0;
  435.         fr->firstframe = 0;
  436.         fr->ignoreframe = fr->firstframe-fr->p.preframes;
  437.         fr->lastframe = -1;
  438.         fr->fresh = 1;
  439.         fr->new_format = 0;
  440. #ifdef GAPLESS
  441.         frame_gapless_init(fr,0,0);
  442.         fr->lastoff = 0;
  443.         fr->firstoff = 0;
  444. #endif
  445. #ifdef OPT_I486
  446.         fr->i486bo[0] = fr->i486bo[1] = FIR_SIZE-1;
  447. #endif
  448.         fr->bo = 1; /* the usual bo */
  449. #ifdef OPT_DITHER
  450.         fr->ditherindex = 0;
  451. #endif
  452.         reset_id3(fr);
  453.         reset_icy(&fr->icy);
  454.         /* ICY stuff should go into icy.c, eh? */
  455. #ifndef NO_ICY
  456.         fr->icy.interval = 0;
  457.         fr->icy.next = 0;
  458. #endif
  459.         fr->halfphase = 0; /* here or indeed only on first-time init? */
  460.         fr->error_protection = 0;
  461.         fr->freeformat_framesize = -1;
  462. }
  463.  
  464. void frame_free_buffers(mpg123_handle *fr)
  465. {
  466.         if(fr->rawbuffs != NULL) free(fr->rawbuffs);
  467.         fr->rawbuffs = NULL;
  468.         fr->rawbuffss = 0;
  469.         if(fr->rawdecwin != NULL) free(fr->rawdecwin);
  470.         fr->rawdecwin = NULL;
  471.         fr->rawdecwins = 0;
  472. #ifndef NO_8BIT
  473.         if(fr->conv16to8_buf != NULL) free(fr->conv16to8_buf);
  474.         fr->conv16to8_buf = NULL;
  475. #endif
  476. }
  477.  
  478. void frame_exit(mpg123_handle *fr)
  479. {
  480.         if(fr->own_buffer && fr->buffer.data != NULL)
  481.         {
  482.                 debug1("freeing buffer at %p", (void*)fr->buffer.data);
  483.                 free(fr->buffer.data);
  484.         }
  485.         fr->buffer.data = NULL;
  486.         frame_free_buffers(fr);
  487.         frame_free_toc(fr);
  488. #ifdef FRAME_INDEX
  489.         fi_exit(&fr->index);
  490. #endif
  491. #ifdef OPT_DITHER
  492.         if(fr->dithernoise != NULL)
  493.         {
  494.                 free(fr->dithernoise);
  495.                 fr->dithernoise = NULL;
  496.         }
  497. #endif
  498.         exit_id3(fr);
  499.         clear_icy(&fr->icy);
  500. }
  501.  
  502. int attribute_align_arg mpg123_info(mpg123_handle *mh, struct mpg123_frameinfo *mi)
  503. {
  504.         if(mh == NULL) return MPG123_ERR;
  505.         if(mi == NULL)
  506.         {
  507.                 mh->err = MPG123_ERR_NULL;
  508.                 return MPG123_ERR;
  509.         }
  510.         mi->version = mh->mpeg25 ? MPG123_2_5 : (mh->lsf ? MPG123_2_0 : MPG123_1_0);
  511.         mi->layer = mh->lay;
  512.         mi->rate = frame_freq(mh);
  513.         switch(mh->mode)
  514.         {
  515.                 case 0: mi->mode = MPG123_M_STEREO; break;
  516.                 case 1: mi->mode = MPG123_M_JOINT;  break;
  517.                 case 2: mi->mode = MPG123_M_DUAL;   break;
  518.                 case 3: mi->mode = MPG123_M_MONO;   break;
  519.                 default: error("That mode cannot be!");
  520.         }
  521.         mi->mode_ext = mh->mode_ext;
  522.         mi->framesize = mh->framesize+4; /* Include header. */
  523.         mi->flags = 0;
  524.         if(mh->error_protection) mi->flags |= MPG123_CRC;
  525.         if(mh->copyright)        mi->flags |= MPG123_COPYRIGHT;
  526.         if(mh->extension)        mi->flags |= MPG123_PRIVATE;
  527.         if(mh->original)         mi->flags |= MPG123_ORIGINAL;
  528.         mi->emphasis = mh->emphasis;
  529.         mi->bitrate  = frame_bitrate(mh);
  530.         mi->abr_rate = mh->abr_rate;
  531.         mi->vbr = mh->vbr;
  532.         return MPG123_OK;
  533. }
  534.  
  535.  
  536. /*
  537.         Fuzzy frame offset searching (guessing).
  538.         When we don't have an accurate position, we may use an inaccurate one.
  539.         Possibilities:
  540.                 - use approximate positions from Xing TOC (not yet parsed)
  541.                 - guess wildly from mean framesize and offset of first frame / beginning of file.
  542. */
  543.  
  544. off_t frame_fuzzy_find(mpg123_handle *fr, off_t want_frame, off_t* get_frame)
  545. {
  546.         /* Default is to go to the beginning. */
  547.         off_t ret = fr->audio_start;
  548.         *get_frame = 0;
  549.  
  550.         /* But we try to find something better. */
  551.         /* Xing VBR TOC works with relative positions, both in terms of audio frames and stream bytes.
  552.            Thus, it only works when whe know the length of things.
  553.            Oh... I assume the offsets are relative to the _total_ file length. */
  554.         if(fr->xing_toc != NULL && fr->track_frames > 0 && fr->rdat.filelen > 0)
  555.         {
  556.                 /* One could round... */
  557.                 int toc_entry = (int) ((double)want_frame*100./fr->track_frames);
  558.                 /* It is an index in the 100-entry table. */
  559.                 if(toc_entry < 0)  toc_entry = 0;
  560.                 if(toc_entry > 99) toc_entry = 99;
  561.  
  562.                 /* Now estimate back what frame we get. */
  563.                 *get_frame = (off_t) ((double)toc_entry/100. * fr->track_frames);
  564.                 fr->accurate = FALSE;
  565.                 fr->silent_resync = 1;
  566.                 /* Question: Is the TOC for whole file size (with/without ID3) or the "real" audio data only?
  567.                    ID3v1 info could also matter. */
  568.                 ret = (off_t) ((double)fr->xing_toc[toc_entry]/256.* fr->rdat.filelen);
  569.         }
  570.         else if(fr->mean_framesize > 0)
  571.         {       /* Just guess with mean framesize (may be exact with CBR files). */
  572.                 /* Query filelen here or not? */
  573.                 fr->accurate = FALSE; /* Fuzzy! */
  574.                 fr->silent_resync = 1;
  575.                 *get_frame = want_frame;
  576.                 ret = (off_t) (fr->audio_start+fr->mean_framesize*want_frame);
  577.         }
  578.         debug5("fuzzy: want %li of %li, get %li at %li B of %li B",
  579.                 (long)want_frame, (long)fr->track_frames, (long)*get_frame, (long)ret, (long)(fr->rdat.filelen-fr->audio_start));
  580.         return ret;
  581. }
  582.  
  583. /*
  584.         find the best frame in index just before the wanted one, seek to there
  585.         then step to just before wanted one with read_frame
  586.         do not care tabout the stuff that was in buffer but not played back
  587.         everything that left the decoder is counted as played
  588.        
  589.         Decide if you want low latency reaction and accurate timing info or stable long-time playback with buffer!
  590. */
  591.  
  592. off_t frame_index_find(mpg123_handle *fr, off_t want_frame, off_t* get_frame)
  593. {
  594.         /* default is file start if no index position */
  595.         off_t gopos = 0;
  596.         *get_frame = 0;
  597. #ifdef FRAME_INDEX
  598.         /* Possibly use VBRI index, too? I'd need an example for this... */
  599.         if(fr->index.fill)
  600.         {
  601.                 /* find in index */
  602.                 size_t fi;
  603.                 /* at index fi there is frame step*fi... */
  604.                 fi = want_frame/fr->index.step;
  605.                 if(fi >= fr->index.fill) /* If we are beyond the end of frame index...*/
  606.                 {
  607.                         /* When fuzzy seek is allowed, we have some limited tolerance for the frames we want to read rather then jump over. */
  608.                         if(fr->p.flags & MPG123_FUZZY && want_frame - (fr->index.fill-1)*fr->index.step > 10)
  609.                         {
  610.                                 gopos = frame_fuzzy_find(fr, want_frame, get_frame);
  611.                                 if(gopos > fr->audio_start) return gopos; /* Only in that case, we have a useful guess. */
  612.                                 /* Else... just continue, fuzzyness didn't help. */
  613.                         }
  614.                         /* Use the last available position, slowly advancing from that one. */
  615.                         fi = fr->index.fill - 1;
  616.                 }
  617.                 /* We have index position, that yields frame and byte offsets. */
  618.                 *get_frame = fi*fr->index.step;
  619.                 gopos = fr->index.data[fi];
  620.                 fr->accurate = TRUE; /* When using the frame index, we are accurate. */
  621.         }
  622.         else
  623.         {
  624. #endif
  625.                 if(fr->p.flags & MPG123_FUZZY)
  626.                 return frame_fuzzy_find(fr, want_frame, get_frame);
  627.                 /* A bit hackish here... but we need to be fresh when looking for the first header again. */
  628.                 fr->firsthead = 0;
  629.                 fr->oldhead = 0;
  630. #ifdef FRAME_INDEX
  631.         }
  632. #endif
  633.         debug2("index: 0x%lx for frame %li", (unsigned long)gopos, (long) *get_frame);
  634.         return gopos;
  635. }
  636.  
  637. off_t frame_ins2outs(mpg123_handle *fr, off_t ins)
  638. {      
  639.         off_t outs = 0;
  640.         switch(fr->down_sample)
  641.         {
  642.                 case 0:
  643. #               ifndef NO_DOWNSAMPLE
  644.                 case 1:
  645.                 case 2:
  646. #               endif
  647.                         outs = ins>>fr->down_sample;
  648.                 break;
  649. #               ifndef NO_NTOM
  650.                 case 3: outs = ntom_ins2outs(fr, ins); break;
  651. #               endif
  652.                 default: error1("Bad down_sample (%i) ... should not be possible!!", fr->down_sample);
  653.         }
  654.         return outs;
  655. }
  656.  
  657. off_t frame_outs(mpg123_handle *fr, off_t num)
  658. {
  659.         off_t outs = 0;
  660.         switch(fr->down_sample)
  661.         {
  662.                 case 0:
  663. #               ifndef NO_DOWNSAMPLE
  664.                 case 1:
  665.                 case 2:
  666. #               endif
  667.                         outs = (spf(fr)>>fr->down_sample)*num;
  668.                 break;
  669. #ifndef NO_NTOM
  670.                 case 3: outs = ntom_frmouts(fr, num); break;
  671. #endif
  672.                 default: error1("Bad down_sample (%i) ... should not be possible!!", fr->down_sample);
  673.         }
  674.         return outs;
  675. }
  676.  
  677. off_t frame_offset(mpg123_handle *fr, off_t outs)
  678. {
  679.         off_t num = 0;
  680.         switch(fr->down_sample)
  681.         {
  682.                 case 0:
  683. #               ifndef NO_DOWNSAMPLE
  684.                 case 1:
  685.                 case 2:
  686. #               endif
  687.                         num = outs/(spf(fr)>>fr->down_sample);
  688.                 break;
  689. #ifndef NO_NTOM
  690.                 case 3: num = ntom_frameoff(fr, outs); break;
  691. #endif
  692.                 default: error("Bad down_sample ... should not be possible!!");
  693.         }
  694.         return num;
  695. }
  696.  
  697. #ifdef GAPLESS
  698. /* input in _input_ samples */
  699. void frame_gapless_init(mpg123_handle *fr, off_t b, off_t e)
  700. {
  701.         fr->begin_s = b;
  702.         fr->end_s = e;
  703.         /* These will get proper values later, from above plus resampling info. */
  704.         fr->begin_os = 0;
  705.         fr->end_os = 0;
  706.         debug2("frame_gapless_init: from %lu to %lu samples", (long unsigned)fr->begin_s, (long unsigned)fr->end_s);
  707. }
  708.  
  709. void frame_gapless_realinit(mpg123_handle *fr)
  710. {
  711.         fr->begin_os = frame_ins2outs(fr, fr->begin_s);
  712.         fr->end_os   = frame_ins2outs(fr, fr->end_s);
  713.         debug2("frame_gapless_realinit: from %lu to %lu samples", (long unsigned)fr->begin_os, (long unsigned)fr->end_os);
  714. }
  715.  
  716. /* When we got a new sample count, update the gaplessness. */
  717. void frame_gapless_update(mpg123_handle *fr, off_t total_samples)
  718. {
  719.         if(fr->end_s < 1)
  720.         {
  721.                 fr->end_s = total_samples;
  722.                 frame_gapless_realinit(fr);
  723.         }
  724.         else if(fr->end_s > total_samples)
  725.         {
  726.                 if(NOQUIET) error2("end sample count smaller than gapless end! (%"OFF_P" < %"OFF_P").", (off_p)total_samples, (off_p)fr->end_s);
  727.                 fr->end_s = total_samples;
  728.         }
  729. }
  730.  
  731. #endif
  732.  
  733. /* Compute the needed frame to ignore from, for getting accurate/consistent output for intended firstframe. */
  734. static off_t ignoreframe(mpg123_handle *fr)
  735. {
  736.         off_t preshift = fr->p.preframes;
  737.         /* Layer 3 _really_ needs at least one frame before. */
  738.         if(fr->lay==3 && preshift < 1) preshift = 1;
  739.         /* Layer 1 & 2 reall do not need more than 2. */
  740.         if(fr->lay!=3 && preshift > 2) preshift = 2;
  741.  
  742.         return fr->firstframe - preshift;
  743. }
  744.  
  745. /* The frame seek... This is not simply the seek to fe*spf(fr) samples in output because we think of _input_ frames here.
  746.    Seek to frame offset 1 may be just seek to 200 samples offset in output since the beginning of first frame is delay/padding.
  747.    Hm, is that right? OK for the padding stuff, but actually, should the decoder delay be better totally hidden or not?
  748.    With gapless, even the whole frame position could be advanced further than requested (since Homey don't play dat). */
  749. void frame_set_frameseek(mpg123_handle *fr, off_t fe)
  750. {
  751.         fr->firstframe = fe;
  752. #ifdef GAPLESS
  753.         if(fr->p.flags & MPG123_GAPLESS)
  754.         {
  755.                 /* Take care of the beginning... */
  756.                 off_t beg_f = frame_offset(fr, fr->begin_os);
  757.                 if(fe <= beg_f)
  758.                 {
  759.                         fr->firstframe = beg_f;
  760.                         fr->firstoff   = fr->begin_os - frame_outs(fr, beg_f);
  761.                 }
  762.                 else fr->firstoff = 0;
  763.                 /* The end is set once for a track at least, on the frame_set_frameseek called in get_next_frame() */
  764.                 if(fr->end_os > 0)
  765.                 {
  766.                         fr->lastframe  = frame_offset(fr,fr->end_os);
  767.                         fr->lastoff    = fr->end_os - frame_outs(fr, fr->lastframe);
  768.                 } else fr->lastoff = 0;
  769.         } else { fr->firstoff = fr->lastoff = 0; fr->lastframe = -1; }
  770. #endif
  771.         fr->ignoreframe = ignoreframe(fr);
  772. #ifdef GAPLESS
  773.         debug5("frame_set_frameseek: begin at %li frames and %li samples, end at %li and %li; ignore from %li",
  774.                (long) fr->firstframe, (long) fr->firstoff,
  775.                (long) fr->lastframe,  (long) fr->lastoff, (long) fr->ignoreframe);
  776. #else
  777.         debug3("frame_set_frameseek: begin at %li frames, end at %li; ignore from %li",
  778.                (long) fr->firstframe, (long) fr->lastframe, (long) fr->ignoreframe);
  779. #endif
  780. }
  781.  
  782. void frame_skip(mpg123_handle *fr)
  783. {
  784. #ifndef NO_LAYER3
  785.         if(fr->lay == 3) set_pointer(fr, 512);
  786. #endif
  787. }
  788.  
  789. /* Sample accurate seek prepare for decoder. */
  790. /* This gets unadjusted output samples and takes resampling into account */
  791. void frame_set_seek(mpg123_handle *fr, off_t sp)
  792. {
  793.         fr->firstframe = frame_offset(fr, sp);
  794. #ifndef NO_NTOM
  795.         if(fr->down_sample == 3) ntom_set_ntom(fr, fr->firstframe);
  796. #endif
  797.         fr->ignoreframe = ignoreframe(fr);
  798. #ifdef GAPLESS /* The sample offset is used for non-gapless mode, too! */
  799.         fr->firstoff = sp - frame_outs(fr, fr->firstframe);
  800.         debug5("frame_set_seek: begin at %li frames and %li samples, end at %li and %li; ignore from %li",
  801.                (long) fr->firstframe, (long) fr->firstoff,
  802.                (long) fr->lastframe,  (long) fr->lastoff, (long) fr->ignoreframe);
  803. #else
  804.         debug3("frame_set_seek: begin at %li frames, end at %li; ignore from %li",
  805.                (long) fr->firstframe, (long) fr->lastframe, (long) fr->ignoreframe);
  806. #endif
  807. }
  808.  
  809. int attribute_align_arg mpg123_volume_change(mpg123_handle *mh, double change)
  810. {
  811.         if(mh == NULL) return MPG123_ERR;
  812.         return mpg123_volume(mh, change + (double) mh->p.outscale);
  813. }
  814.  
  815. int attribute_align_arg mpg123_volume(mpg123_handle *mh, double vol)
  816. {
  817.         if(mh == NULL) return MPG123_ERR;
  818.  
  819.         if(vol >= 0) mh->p.outscale = vol;
  820.         else mh->p.outscale = 0.;
  821.  
  822.         do_rva(mh);
  823.         return MPG123_OK;
  824. }
  825.  
  826. static int get_rva(mpg123_handle *fr, double *peak, double *gain)
  827. {
  828.         double p = -1;
  829.         double g = 0;
  830.         int ret = 0;
  831.         if(fr->p.rva)
  832.         {
  833.                 int rt = 0;
  834.                 /* Should one assume a zero RVA as no RVA? */
  835.                 if(fr->p.rva == 2 && fr->rva.level[1] != -1) rt = 1;
  836.                 if(fr->rva.level[rt] != -1)
  837.                 {
  838.                         p = fr->rva.peak[rt];
  839.                         g = fr->rva.gain[rt];
  840.                         ret = 1; /* Success. */
  841.                 }
  842.         }
  843.         if(peak != NULL) *peak = p;
  844.         if(gain != NULL) *gain = g;
  845.         return ret;
  846. }
  847.  
  848. /* adjust the volume, taking both fr->outscale and rva values into account */
  849. void do_rva(mpg123_handle *fr)
  850. {
  851.         double peak = 0;
  852.         double gain = 0;
  853.         double newscale;
  854.         double rvafact = 1;
  855.         if(get_rva(fr, &peak, &gain))
  856.         {
  857.                 if(NOQUIET && fr->p.verbose > 1) fprintf(stderr, "Note: doing RVA with gain %f\n", gain);
  858.                 rvafact = pow(10,gain/20);
  859.         }
  860.  
  861.         newscale = fr->p.outscale*rvafact;
  862.  
  863.         /* if peak is unknown (== 0) this check won't hurt */
  864.         if((peak*newscale) > 1.0)
  865.         {
  866.                 newscale = 1.0/peak;
  867.                 warning2("limiting scale value to %f to prevent clipping with indicated peak factor of %f", newscale, peak);
  868.         }
  869.         /* first rva setting is forced with fr->lastscale < 0 */
  870.         if(newscale != fr->lastscale || fr->decoder_change)
  871.         {
  872.                 debug3("changing scale value from %f to %f (peak estimated to %f)", fr->lastscale != -1 ? fr->lastscale : fr->p.outscale, newscale, (double) (newscale*peak));
  873.                 fr->lastscale = newscale;
  874.                 /* It may be too early, actually. */
  875.                 if(fr->make_decode_tables != NULL) fr->make_decode_tables(fr); /* the actual work */
  876.         }
  877. }
  878.  
  879.  
  880. int attribute_align_arg mpg123_getvolume(mpg123_handle *mh, double *base, double *really, double *rva_db)
  881. {
  882.         if(mh == NULL) return MPG123_ERR;
  883.         if(base)   *base   = mh->p.outscale;
  884.         if(really) *really = mh->lastscale;
  885.         get_rva(mh, NULL, rva_db);
  886.         return MPG123_OK;
  887. }
  888.  
  889.