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 )