Audio-Scan
view release on metacpan or search on metacpan
}
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 )