Audio-Play-MPG123

 view release on metacpan or  search on metacpan

mpg123/mpg123.c  view on Meta::CPAN

    NULL,   /* equalfile */
    0,      /* enable_equalizer */
    32768,  /* outscale */
    0,      /* startFrame */

    0,      /* print_version:1 */
};


static long numframes = -1;

int buffer_fd[2];
int buffer_pid;

static char *listname = NULL;
static int intflag = FALSE;

int OutputDescriptor;

static struct frame fr;
struct audio_info_struct ai;
txfermem *buffermem = NULL;

#define FRAMEBUFUNIT (18 * 64 * 4)

#if !defined(WIN32) && !defined(GENERIC)
static void catch_child(void)
{
    while (waitpid(-1, NULL, WNOHANG) > 0);
}

static void catch_interrupt(void)
{
    intflag = TRUE;
}
#endif


void init_output(void)
{
    static int init_done = FALSE;
    if (init_done)
	return;
    init_done = TRUE;

#ifndef NOXFERMEM
    /*
     * Only DECODE_AUDIO and DECODE_FILE are sanely handled by the
     * buffer process. For now, we just ignore the request
     * to buffer the output. [dk]
     */
    if (param.usebuffer && (param.outmode != DECODE_AUDIO) &&
	(param.outmode != DECODE_FILE)) {
	fprintf(stderr, "Sorry, won't buffer output unless writing "
		"plain audio.\n"); 
	param.usebuffer = 0;
    } 
  
    if (param.usebuffer) {
	unsigned int bufferbytes;
	sigset_t newsigset, oldsigset;
	if (param.usebuffer < 32)
	    param.usebuffer = 32; /* minimum is 32 Kbytes! */
	bufferbytes = (param.usebuffer * 1024);
	bufferbytes -= bufferbytes % FRAMEBUFUNIT;
	/* +1024 for NtoM rounding problems */
	xfermem_init (&buffermem, bufferbytes ,0,1024);
	pcm_sample = (unsigned char *) buffermem->data;
	pcm_point = 0;
	sigemptyset (&newsigset);
	sigaddset (&newsigset, SIGUSR1);
	sigprocmask (SIG_BLOCK, &newsigset, &oldsigset);
	catchsignal (SIGCHLD, catch_child);
	switch ((buffer_pid = fork())) {
	case -1: /* error */
	    perror("fork()");
	    exit(1);
	case 0: /* child */
	    if(rd)
		rd->close(rd); /* child doesn't need the input stream */
	    xfermem_init_reader (buffermem);
	    buffer_loop (&ai, &oldsigset);
	    xfermem_done_reader (buffermem);
	    xfermem_done (buffermem);
	    _exit(0);
	default: /* parent */
	    xfermem_init_writer (buffermem);
	    param.outmode = DECODE_BUFFER;
	}
    }
    else {
#endif
	/* + 1024 for NtoM rate converter */
	if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2 + 2*1024))) {
	    perror ("malloc()");
	    exit (1);
#ifndef NOXFERMEM
	}
#endif
    }

    switch(param.outmode) {
    case DECODE_AUDIO:
	if(audio_open(&ai) < 0) {
	    perror("audio");
	    exit(1);
	}
	break;
    case DECODE_WAV:
	wav_open(&ai,param.filename);
	break;
    case DECODE_AU:
	au_open(&ai,param.filename);
	break;
    case DECODE_CDR:
	cdr_open(&ai,param.filename);
	break;
    }
}


/* 
 * set_-helpers for advanced option decoding
 */ 
static void set_output_h(char *a)
{
    if(ai.output <= 0)
	ai.output = AUDIO_OUT_HEADPHONES;
    else
	ai.output |= AUDIO_OUT_HEADPHONES;
}
static void set_output_s(char *a)
{
    if(ai.output <= 0)
	ai.output = AUDIO_OUT_INTERNAL_SPEAKER;
    else
	ai.output |= AUDIO_OUT_INTERNAL_SPEAKER;
}
static void set_output_l(char *a)
{
    if(ai.output <= 0)
	ai.output = AUDIO_OUT_LINE_OUT;



( run in 1.500 second using v1.01-cache-2.11-cpan-5e09290becf )