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 )