Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/common.c view on Meta::CPAN
return fr->freeformatsize + 4;
}
switch(fr->lay) {
case 1:
bpf = tabsel_123[fr->lsf][0][fr->bitrate_index];
bpf *= 12000.0 * 4.0;
bpf /= freqs[fr->sampling_frequency] <<(fr->lsf);
break;
case 2:
case 3:
bpf = tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index];
bpf *= 144000;
bpf /= freqs[fr->sampling_frequency] << (fr->lsf);
break;
default:
bpf = 1.0;
}
return bpf;
}
double compute_tpf(struct frame *fr)
{
static int bs[4] = { 0,384,1152,1152 };
double tpf;
tpf = (double) bs[fr->lay];
tpf /= freqs[fr->sampling_frequency] << (fr->lsf);
return tpf;
}
/*
* Returns number of frames queued up in output buffer, i.e.
* offset between currently played and currently decoded frame.
*/
long compute_buffer_offset(struct frame *fr)
{
long bufsize;
/*
* buffermem->buf[0] holds output sampling rate,
* buffermem->buf[1] holds number of channels,
* buffermem->buf[2] holds audio format of output.
*/
if(!param.usebuffer || !(bufsize=xfermem_get_usedspace(buffermem))
|| !buffermem->buf[0] || !buffermem->buf[1])
return 0;
bufsize = (long)((double) bufsize / buffermem->buf[0] /
buffermem->buf[1] / compute_tpf(fr));
if((buffermem->buf[2] & AUDIO_FORMAT_MASK) == AUDIO_FORMAT_16)
return bufsize/2;
else
return bufsize;
}
void print_stat(struct reader *rds,struct frame *fr,int no,long buffsize,struct audio_info_struct *ai)
{
double bpf,tpf,tim1,tim2;
double dt = 0.0;
int sno,rno;
char outbuf[256];
if(!rds || !fr)
return;
outbuf[0] = 0;
#ifndef GENERIC
{
struct timeval t;
fd_set serr;
int n,errfd = fileno(stderr);
t.tv_sec=t.tv_usec=0;
FD_ZERO(&serr);
FD_SET(errfd,&serr);
n = select(errfd+1,NULL,&serr,NULL,&t);
if(n <= 0)
return;
}
#endif
/* bpf = compute_bpf(fr); */
bpf = vbr ? (rds->filelen / head.frames) : compute_bpf(fr);
tpf = compute_tpf(fr);
if(buffsize > 0 && ai && ai->rate > 0 && ai->channels > 0) {
dt = (double) buffsize / ai->rate / ai->channels;
if( (ai->format & AUDIO_FORMAT_MASK) == AUDIO_FORMAT_16)
dt *= 0.5;
}
rno = 0;
sno = no;
if(rds->filelen >= 0) {
long t = rds->tell(rds);
rno = (int)((double)(rds->filelen-t)/bpf);
sno = (int)((double)t/bpf);
}
sprintf(outbuf+strlen(outbuf),"\rFrame# %5d [%5d], ",sno,rno);
tim1 = sno*tpf-dt;
tim2 = rno*tpf+dt;
#if 0
tim1 = tim1 < 0 ? 0.0 : tim1;
#endif
tim2 = tim2 < 0 ? 0.0 : tim2;
sprintf(outbuf+strlen(outbuf),"Time: %02u:%02u.%02u [%02u:%02u.%02u], Bitrate %3u",
(unsigned int)tim1/60,
(unsigned int)tim1%60,
(unsigned int)(tim1*100)%100,
(unsigned int)tim2/60,
(unsigned int)tim2%60,
( run in 1.248 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )