Audio-Scan

 view release on metacpan or  search on metacpan

src/mp3.c  view on Meta::CPAN

    }
    DEBUG_TRACE("find_frame: using absolute offset value %d\n", frame_offset);
  }
  else {
    if (offset >= mp3->song_length_ms) {
      goto out;
    }

    // Use Xing TOC if available
    if ( mp3->xing_frame->has_toc ) {
      float percent;
      uint8_t ipercent;
      uint16_t tva;
      uint16_t tvb;
      float tvx;

      percent = (offset * 1.0 / mp3->song_length_ms) * 100;
      ipercent = (int)percent;

      if (ipercent > 99)
        ipercent = 99;

      // Interpolate between 2 TOC points
      tva = mp3->xing_frame->xing_toc[ipercent];
      if (ipercent < 99) {
        tvb = mp3->xing_frame->xing_toc[ipercent + 1];
      }
      else {
        tvb = 256;
      }

      tvx = tva + (tvb - tva) * (percent - ipercent);

      frame_offset = (int)((1.0/256.0) * tvx * mp3->xing_frame->xing_bytes);

      frame_offset += mp3->audio_offset;

      // Don't return offset == audio_offset, because that would be the Xing frame
      if (frame_offset == mp3->audio_offset) {
        DEBUG_TRACE("find_frame: frame_offset == audio_offset, skipping to next frame\n");
        frame_offset += 1;
      }

      DEBUG_TRACE("find_frame: using Xing TOC, song_length_ms: %d, percent: %f, tva: %d, tvb: %d, tvx: %f, frame offset: %d\n",
        mp3->song_length_ms, percent, tva, tvb, tvx, frame_offset
      );
    }
    else {
      // calculate offset using bitrate
      float bytes_per_ms = mp3->bitrate / 8.0;

      frame_offset = (int)(bytes_per_ms * offset);

      frame_offset += mp3->audio_offset;



( run in 0.344 second using v1.01-cache-2.11-cpan-709fd43a63f )