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 )