Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/control_generic.c view on Meta::CPAN
{
char *s, *t;
s = strrchr(filename, '/');
if (!s)
s = filename;
else
s++;
t = strrchr(s, '.');
if (t)
*t = 0;
generic_sendmsg("I %s", s);
}
void control_generic (struct mpstr *mp,struct frame *fr)
{
struct timeval tv;
fd_set fds;
int n;
int mode = MODE_STOPPED;
int init = 0;
int framecnt = 0;
float statcnt = 0, statfreq = 1;
setvbuf(stdout, (char *)NULL, _IOLBF, 0);
generic_sendmsg("R MPG123 %s", prgVersion);
while (1) {
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
/* play frame if no command needs to be processed */
if (mode == MODE_PLAYING) {
n = select(32, &fds, NULL, NULL, &tv);
if (n == 0) {
if (!read_frame(rd,fr)) {
mode = MODE_STOPPED;
rd->close(rd);
generic_sendmsg("P 0 EOF");
continue;
}
play_frame(mp,init,fr);
if (init) {
static char *modes[4] = {"Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel"};
generic_sendmsg("S %s %d %ld %s %d %d %d %d %d %d %d %d %d",
fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
fr->lay,
freqs[fr->sampling_frequency],
modes[fr->mode],
fr->mode_ext,
fr->framesize+4,
fr->stereo,
fr->copyright ? 1 : 0,
fr->error_protection ? 1 : 0,
fr->emphasis,
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
fr->extension,
fr->lsf);
init = 0;
generic_sendstat(fr, framecnt);
statcnt = 0;
}
framecnt++;
statcnt++;
if (statfreq && statcnt >= statfreq)
{
statcnt -= statfreq;
generic_sendstat(fr, framecnt);
}
}
}
else {
/* wait for command */
while (1) {
n = select(32, &fds, NULL, NULL, NULL);
if (n != 0)
break;
}
}
/* exit on error */
if (n < 0) {
fprintf(stderr, "Error waiting for command: %s\n", strerror(errno));
exit(1);
}
/* process command */
if (n > 0) {
int len,rc;
char buf[1024];
char *cmd;
/* read command */
buf[0] = 0; len = 0;
do {
rc = read(STDIN_FILENO, buf+len, 1);
if (rc == 0 || (rc < 0 && errno != EAGAIN && errno != EINTR))
goto end;
len += rc;
} while (rc>0 && buf[len-rc]!='\012' && buf[len-rc]!='\015');
buf[len] = 0;
/* exit on error */
if (rc < 0) {
fprintf(stderr, "Error reading command: %s\n", strerror(errno));
exit(1);
}
if (len == 0) {
fprintf(stderr, "Caught End-Of-File -> Exit\n");
exit(1);
}
/* strip CR/LF at EOL */
while (len>0 && (buf[strlen(buf)-1] == '\n' || buf[strlen(buf)-1] == '\r')) {
buf[strlen(buf)-1] = 0;
len--;
}
/* continue if no command */
if (len == 0) {
continue;
}
cmd = strtok(buf, " \t");
if (!cmd || !strlen(cmd))
continue;
/* QUIT */
if (!strcasecmp(cmd, "Q") || !strcasecmp(cmd, "QUIT"))
break;
/* LOAD */
if (!strcasecmp(cmd, "L") || !strcasecmp(cmd, "LOAD")) {
char *filename;
extern void init_output(void);
filename = strtok(NULL, "");
if (mode != MODE_STOPPED) {
rd->close(rd);
mode = MODE_STOPPED;
}
init_output ();
if (param.outmode == DECODE_AUDIO && ai.fn < 0)
audio_open(&ai);
open_stream(filename, -1);
if (rd && rd->flags & READER_ID3TAG)
generic_sendinfoid3((char *)rd->id3buf);
else
generic_sendinfo(filename);
mode = MODE_PLAYING;
init = 1;
framecnt = 0;
read_frame_init(fr);
continue;
}
/* OPTS */
if (!strcasecmp(cmd, "STATFREQ")) {
statfreq = atof (strtok (NULL, ""));
continue;
}
/* STAT */
if (!strcasecmp(cmd, "STAT")) {
generic_sendstat(fr, framecnt);
continue;
}
/* STOP */
if (!strcasecmp(cmd, "S") || !strcasecmp(cmd, "STOP")) {
if (mode != MODE_STOPPED) {
if (param.outmode == DECODE_AUDIO) {
audio_close(&ai);
ai.fn = -1;
}
rd->close(rd);
mode = MODE_STOPPED;
generic_sendmsg("P 0");
}
continue;
}
/* PAUSE */
if (!strcasecmp(cmd, "P") || !strcasecmp(cmd, "PAUSE")) {
if (mode == MODE_STOPPED)
continue;
if (mode == MODE_PLAYING) {
mode = MODE_PAUSED;
if (param.usebuffer)
kill(buffer_pid, SIGSTOP);
generic_sendmsg("P 1");
} else {
mode = MODE_PLAYING;
if (param.usebuffer)
kill(buffer_pid, SIGCONT);
generic_sendmsg("P 2");
}
continue;
}
/* JUMP */
if (!strcasecmp(cmd, "J") || !strcasecmp(cmd, "JUMP")) {
char *spos;
int pos, ok;
spos = strtok(NULL, " \t");
if (!spos)
continue;
if (spos[0] == '-')
pos = framecnt + atoi(spos);
else if (spos[0] == '+')
pos = framecnt + atoi(spos+1);
else
pos = atoi(spos);
if (mode == MODE_STOPPED)
continue;
ok = 1;
if (pos < framecnt) {
rd->rewind(rd);
read_frame_init(fr);
for (framecnt=0; ok && framecnt<pos; framecnt++) {
ok = read_frame(rd,fr);
if (fr->lay == 3)
set_pointer(fr->sideInfoSize,512);
( run in 1.819 second using v1.01-cache-2.11-cpan-bbcb1afb8fc )