Audio-Play-MPG123

 view release on metacpan or  search on metacpan

mpg123/common.c  view on Meta::CPAN

	/***   no directory specified   ***/
	if (lastdir) {
	    free (lastdir);
	    lastdir = NULL;
	};
	*dname = NULL;
	*fname = (char *)path;
	return 0;
    }
}

void set_pointer(int ssize,long backstep)
{
    bsi.wordpointer = bsbuf + ssize - backstep;
    if (backstep)
	memcpy(bsi.wordpointer,bsbufold+bsbufold_end-backstep,backstep);
    bsi.bitindex = 0; 
}

/********************************/

double compute_bpf(struct frame *fr)
{
    double bpf;

    if(!fr->bitrate_index) {
	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)



( run in 0.530 second using v1.01-cache-2.11-cpan-5735350b133 )