#include #include #include #include /* UNIX standard function definitions */ #include /* File control definitions */ #include /* Error number definitions */ #include /* POSIX terminal control definitions */ #define BUFF_SIZE 4096 /* * 'open_port()' - Open serial port 1. * * Returns the file descriptor on success or -1 on error. */ int open_port(void) { int fd; /* File descriptor for the port */ fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { /* * Could not open the port. */ perror("open_port: Unable to open /dev/ttyS0 - "); } else fcntl(fd, F_SETFL, 0); return (fd); } int main (void) { regex_t regexST, regexnm, regexgn, regexmi, regexbr, regexrn; unsigned char buffer[BUFF_SIZE]; unsigned char line[256]; unsigned char *meta[2]; unsigned char lcd[100]; unsigned char icyok = 0; int count, done = 0; int reti, br, metaint = 0; int i, m, n; int fds, len; int bsize = BUFF_SIZE; char *cp; fds = open_port(); usleep(100000); sprintf(lcd, "NM24 "); count = write(fds, lcd, 24); if (count < 0) fputs("Error: write on ttyS0 failed!\n", stderr); usleep(100000); sprintf(lcd, "ST24 "); count = write(fds, lcd, 24); if (count < 0) fputs("Error: write on ttyS0 failed!\n", stderr); usleep(100000); reti = regcomp(®exST, "StreamTitle", 0); reti = regcomp(®exnm, "^icy-name", 0); reti = regcomp(®exgn, "^icy-genre", 0); reti = regcomp(®exmi, "^icy-metaint", 0); reti = regcomp(®exbr, "^icy-br", 0); reti = regcomp(®exrn, "^\r\n$", 0); cp = fgets(line, 256, stdin); while (cp != NULL && !done) { reti = regexec(®exnm, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); fprintf(stderr, "name=%s\n", meta[1]); len = strlen(meta[1]); if (len > 95) { len = 95; } snprintf(lcd, 100, "NM%02i%s", len + 4, meta[1]); count = write(fds, lcd, len + 4); if (count < 0) fputs("Error: write on ttyS0 failed!\n", stderr); usleep(1000); } reti = regexec(®exgn, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); fprintf(stderr, "genre=%s\n", meta[1]); } reti = regexec(®exmi, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); metaint = atoi(meta[1]); fprintf(stderr, "metaint=%i\n", metaint); } reti = regexec(®exbr, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); br = atoi(meta[1]); fprintf(stderr, "br=%i\n", br); } reti = regexec(®exrn, line, 0, NULL, 0); if (!reti) { done = 1; fputs("\n", stderr); } if (!done) { cp = fgets(line, 256, stdin); } } if (metaint == 0) { n = 4; } else if (metaint > 0) { if ((metaint % bsize) != 0) { bsize = 4000; while ((metaint % bsize) != 0) { bsize -= 1000; if (bsize == 0) { fprintf(stderr, "Error: metaint is not multiple of bsize\n"); return 1; } } } n = metaint / bsize; } else { fprintf(stderr, "Error: metaint less then 0\n"); } while (!feof(stdin)) { for (i = 0; i < n; i++) { count = fread(buffer, 1, bsize, stdin); fwrite(buffer, 1, count, stdout); } if (metaint > 0) { count = fread(buffer, 1, 1, stdin); m = buffer[0]; if (m != 0) { count = fread(buffer, 1, m * 16, stdin); //fwrite(buffer, 1, m * 16, stderr); //fputs("\n", stderr); reti = regexec(®exST, buffer, 0, NULL, 0); if (!reti) { meta[0] = strtok(buffer, "'"); meta[1] = strtok(NULL, "'"); fputs("StreamTitle=", stderr); fputs(meta[1], stderr); fputs("\n", stderr); len = strlen(meta[1]); if (len > 95) { len = 95; } snprintf(lcd, 100, "ST%02i%s", len + 4, meta[1]); count = write(fds, lcd, len + 4); if (count < 0) fputs("Error: write on ttyS0 failed!\n", stderr); usleep(1000); } } } } return 0; }