#include "../common/debug.h"
#ifdef GAPLESS
static int64_t sample_adjust(mpg123_handle *mh, int64_t x)
{
int64_t s;
if(mh->p.flags & MPG123_GAPLESS)
{
if(x > mh->end_os)
{
if(x < mh->fullend_os)
s = mh->end_os - mh->begin_os;
else
s = x - (mh->fullend_os - mh->end_os + mh->begin_os);
}
else
s = x - mh->begin_os;
}
else
s = x;
return s;
}
static int64_t sample_unadjust(mpg123_handle *mh, int64_t x)
{
int64_t s;
if(mh->p.flags & MPG123_GAPLESS)
{
s = x + mh->begin_os;
if(s >= mh->end_os)
s += mh->fullend_os - mh->end_os;
}
else s = x;
return s;
}
static void frame_buffercheck(mpg123_handle *fr)
{
if(!(fr->state_flags & FRAME_ACCURATE)) return;
if(fr->gapless_frames > 0 && fr->num >= fr->gapless_frames) return;
if(fr->lastframe > -1 && fr->num >= fr->lastframe)
{
int64_t byteoff = (fr->num == fr->lastframe) ? INT123_samples_to_bytes(fr, fr->lastoff) : 0;
if((int64_t)fr->buffer.fill > byteoff)
{
fr->buffer.fill = byteoff;
}
if(VERBOSE3)
fprintf(stderr, "\nNote: Cut frame %" PRIi64 " buffer on end of stream to %"
PRIi64 " samples, fill now %zu bytes.\n"
, fr->num, (fr->num == fr->lastframe ? fr->lastoff : 0), fr->buffer.fill);
}
if(fr->firstoff && fr->num == fr->firstframe)
{
int64_t byteoff = INT123_samples_to_bytes(fr, fr->firstoff);
if((int64_t)fr->buffer.fill > byteoff)
{
fr->buffer.fill -= byteoff;
debug6("cutting %" PRIi64 " samples/%" PRIi64
" bytes on begin, own_buffer=%i at %p=%p, buf[1]=%i"
, fr->firstoff, byteoff, fr->own_buffer
, (void*)fr->buffer.p, (void*)fr->buffer.data, ((short*)fr->buffer.p)[2]);
if(fr->own_buffer) fr->buffer.p = fr->buffer.data + byteoff;
else memmove(fr->buffer.data, fr->buffer.data + byteoff, fr->buffer.fill);
debug3("done cutting, buffer at %p =? %p, buf[1]=%i",
(void*)fr->buffer.p, (void*)fr->buffer.data, ((short*)fr->buffer.p)[2]);
}
else fr->buffer.fill = 0;
if(VERBOSE3)
fprintf(stderr, "\nNote: Cut frame %" PRIi64
" buffer on beginning of stream by %" PRIi64 " samples, fill now %zu bytes.\n"
, fr->num, fr->firstoff, fr->buffer.fill);
fr->firstoff = 0;
}
}
#define SAMPLE_ADJUST(mh,x) sample_adjust(mh,x)
#define SAMPLE_UNADJUST(mh,x) sample_unadjust(mh,x)
#define FRAME_BUFFERCHECK(mh) frame_buffercheck(mh)
#else
#define SAMPLE_ADJUST(mh,x) (x)
#define SAMPLE_UNADJUST(mh,x) (x)
#define FRAME_BUFFERCHECK(mh)
#endif