Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/mpg123.c view on Meta::CPAN
#if !defined(GENERIC)
{
const char *term_type;
term_type = getenv("TERM");
if (term_type && !strcmp(term_type,"xterm") && param.xterm_title) {
fprintf(stderr, "\033]0;%s\007", filename);
}
}
#endif
}
#if !defined(WIN32) && !defined(GENERIC)
#ifdef TERM_CONTROL
if(!param.term_ctrl)
#endif
gettimeofday (&start_time, NULL);
#endif
read_frame_init(fr);
{
int skipped = 0;
if(sync_stream(rd,fr,0xffff,&skipped) <= 0) {
fprintf(stderr,"Can't find frame start");
rd->close(rd);
continue;
}
}
init = 1;
newFrame = param.startFrame;
#ifdef TERM_CONTROL
if(param.term_ctrl) {
term_init();
}
#endif
leftFrames = numframes;
for(frameNum=0;read_frame(rd,fr) && leftFrames && !intflag;frameNum++) {
#ifdef TERM_CONTROL
tc_hack:
#endif
if(frameNum < param.startFrame || (param.doublespeed && (frameNum % param.doublespeed))) {
if(fr->lay == 3)
set_pointer(fr->sideInfoSize,512);
continue;
}
if(leftFrames > 0)
leftFrames--;
if(!play_frame(mp,init,fr)) {
fprintf(stderr,"Error in Frame\n");
break;
}
init = 0;
if(param.verbose) {
#ifndef NOXFERMEM
if (param.verbose > 1 || !(frameNum & 0x7))
print_stat(rd,fr,frameNum,xfermem_get_usedspace(buffermem),&ai);
if(param.verbose > 2 && param.usebuffer)
fprintf(stderr,"[%08x %08x]",buffermem->readindex,buffermem->freeindex);
#else
if (param.verbose > 1 || !(frameNum & 0x7))
print_stat(rd,fr,frameNum,0,&ai);
#endif
}
#ifdef TERM_CONTROL
if(!param.term_ctrl) {
continue;
} else {
long offset;
if((offset=term_control(fr))) {
if(!rd->back_frame(rd, fr, -offset)) {
frameNum+=offset;
if (frameNum < 0)
frameNum = 0;
}
}
}
#endif
}
#ifndef NOXFERMEM
if(param.usebuffer) {
int s;
while ((s = xfermem_get_usedspace(buffermem))) {
struct timeval wait170 = {0, 170000};
buffer_ignore_lowmem();
if(param.verbose)
print_stat(rd,fr,frameNum,s,&ai);
#ifdef TERM_CONTROL
if(param.term_ctrl) {
long offset;
if((offset=term_control(fr))) {
if((!rd->back_frame(rd, fr, -offset))
&& read_frame(rd,fr)) {
frameNum+=offset;
if (frameNum < 0)
frameNum = 0;
goto tc_hack; /* Doh! Gag me with a spoon! */
}
}
}
#endif
select(0, NULL, NULL, NULL, &wait170);
}
}
#endif
if(param.verbose)
print_stat(rd,fr,frameNum,xfermem_get_usedspace(buffermem),&ai);
if (!param.quiet) {
/*
* This formula seems to work at least for
* MPEG 1.0/2.0 layer 3 streams.
*/
int secs = get_songlen(rd,fr,frameNum);
fprintf(stderr,"\n[%d:%02d] Decoding of %s finished.\n", secs / 60,
secs % 60, filename);
}
rd->close(rd);
if (intflag) {
/*
* When using TERM_CONTROL, there is 'q' to terminate a list
* of songs, so no pressing need to keep up this first second
* SIGINT hack that was too often mistaken as a bug. [dk]
*/
#if !defined(WIN32) && !defined(GENERIC)
#ifdef TERM_CONTROL
if(!param.term_ctrl)
#endif
{
gettimeofday (&now, NULL);
secdiff = (now.tv_sec - start_time.tv_sec) * 1000;
if (now.tv_usec >= start_time.tv_usec)
secdiff += (now.tv_usec - start_time.tv_usec) / 1000;
else
secdiff -= (start_time.tv_usec - now.tv_usec) / 1000;
if (secdiff < 1000)
break;
}
#endif
intflag = FALSE;
}
}
}
#ifndef NOXFERMEM
if (buffermem && param.usebuffer) {
buffer_end();
xfermem_done_writer (buffermem);
waitpid (buffer_pid, NULL, 0);
xfermem_done (buffermem);
}
else {
#endif
audio_flush(param.outmode, &ai);
free (pcm_sample);
#ifndef NOXFERMEM
}
#endif
switch(param.outmode) {
case DECODE_AUDIO:
audio_close(&ai);
break;
case DECODE_WAV:
wav_close();
( run in 0.767 second using v1.01-cache-2.11-cpan-800906f7e73 )