Audio-Play-MPG123

 view release on metacpan or  search on metacpan

mpg123/mpg123.c  view on Meta::CPAN

#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();
	break;
    case DECODE_AU:
	au_close();
	break;



( run in 1.057 second using v1.01-cache-2.11-cpan-364913b4093 )