diff options
author | lukem <lukem@pkgsrc.org> | 2002-03-25 05:44:48 +0000 |
---|---|---|
committer | lukem <lukem@pkgsrc.org> | 2002-03-25 05:44:48 +0000 |
commit | c13b5c0e0f241caaf49fe26863df3f4e4f3b5e80 (patch) | |
tree | 8004fda764229bd3900ba2c65dbf679bcc324962 /audio/gqmpeg | |
parent | e515a9150f0eb6dc9af66fc7274453b867c475f1 (diff) | |
download | pkgsrc-c13b5c0e0f241caaf49fe26863df3f4e4f3b5e80.tar.gz |
Add back patch-ac containing various ogg123 playback fixes (different
from the last set), making ogg playback useful:
- implement ogg123_pipe_open() which opens a pipe and runs the command
supplied in the char **, returning the child pid and fd array from pipe(2).
based on code from ogg123_child_run().
- replace popen() with ogg123_pipe_open() in ogg123_info_get(),
ogg123_comment_get(), and ogg123_comment_set(). now info actually
works for file names which contain wacky shell characters (where
surrounding the file name with quotes just Isn't Enough)
- parse_bitrate(): current bitrate in ogg123 output is now "(NNN.MM kbps)",
so look for that rather than "Bitrate: NNNN"
- when setting the initial bit_rate for a song, use "bitrate_average / 1000"
rather than "bitrate_nominal", since bit_rate is in kbps and bitrate_*
is in bps and bitrate_average is more appropriate that bitrate_nominal.
Diffstat (limited to 'audio/gqmpeg')
-rw-r--r-- | audio/gqmpeg/Makefile | 3 | ||||
-rw-r--r-- | audio/gqmpeg/distinfo | 3 | ||||
-rw-r--r-- | audio/gqmpeg/patches/patch-ac | 376 |
3 files changed, 380 insertions, 2 deletions
diff --git a/audio/gqmpeg/Makefile b/audio/gqmpeg/Makefile index 21207f52152..1b765aee7a2 100644 --- a/audio/gqmpeg/Makefile +++ b/audio/gqmpeg/Makefile @@ -1,7 +1,8 @@ -# $NetBSD: Makefile,v 1.58 2002/03/18 08:21:12 wiz Exp $ +# $NetBSD: Makefile,v 1.59 2002/03/25 05:44:48 lukem Exp $ # DISTNAME= gqmpeg-0.15.0 +PKGREVISION= 1 CATEGORIES= audio MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=gqmpeg/} diff --git a/audio/gqmpeg/distinfo b/audio/gqmpeg/distinfo index 486fa80c33c..517873bdf7e 100644 --- a/audio/gqmpeg/distinfo +++ b/audio/gqmpeg/distinfo @@ -1,6 +1,7 @@ -$NetBSD: distinfo,v 1.15 2002/03/18 08:21:12 wiz Exp $ +$NetBSD: distinfo,v 1.16 2002/03/25 05:44:48 lukem Exp $ SHA1 (gqmpeg-0.15.0.tar.gz) = 110b1e55cb52b38216524c8c9d3ac2cc5835ea98 Size (gqmpeg-0.15.0.tar.gz) = 885429 bytes SHA1 (patch-aa) = c006f7a0490bced6a80e30e3aced606fc6eef5ab SHA1 (patch-ab) = b49b9fda51342dff25d097bbdaeee22657ea2dc6 +SHA1 (patch-ac) = 6721f376f1ebc27e8cf53a97e85c7ed80934b731 diff --git a/audio/gqmpeg/patches/patch-ac b/audio/gqmpeg/patches/patch-ac new file mode 100644 index 00000000000..e5c2595f114 --- /dev/null +++ b/audio/gqmpeg/patches/patch-ac @@ -0,0 +1,376 @@ +$NetBSD: patch-ac,v 1.8 2002/03/25 05:44:48 lukem Exp $ + +--- src/io_ogg123.c.orig Sat Feb 23 04:39:13 2002 ++++ src/io_ogg123.c Mon Mar 25 16:32:41 2002 +@@ -47,6 +47,62 @@ static gint ogg123_child_pid = -1; + static int ogg123_pipe[2]; + + /* ++ *----------------------------------------------------------------------------- ++ * pipe functions ++ *----------------------------------------------------------------------------- ++ */ ++ ++static gint ogg123_pipe_open(char *ogg_argv[], gint *ogg_child, ++ int ogg_pipe[2]) ++{ ++ pid_t frk_pid; ++ ++ /* Create the pipe. */ ++ if (pipe(ogg_pipe)) ++ { ++ fprintf (stderr, _("Pipe failed.\n")); ++ return FALSE; ++ } ++ ++ if (debug_mode) printf("ogg123_pipe_open: %s\n", ogg_argv[0]); ++ ++ /* Create the child process. */ ++ frk_pid = fork (); ++ if (frk_pid == (pid_t) 0) ++ { ++ /* This is the child process. */ ++ dup2(ogg_pipe[1], 1); ++ dup2(ogg_pipe[1], 2); ++ close(ogg_pipe[0]); ++ ++ execvp(ogg_argv[0], ogg_argv); ++ printf(_("unable to run %s (in the path?)\n"), ogg_argv); ++ _exit(1); ++ } ++ else if (frk_pid < (pid_t) 0) ++ { ++ /* The fork failed. */ ++ fprintf (stderr, _("Fork failed.\n")); ++ close(ogg_pipe[0]); ++ close(ogg_pipe[1]); ++ *ogg_child = -1; ++ return FALSE; ++ } ++ else ++ { ++ /* This is the parent process. */ ++ *ogg_child = (int) frk_pid; ++ ++ close(ogg_pipe[1]); ++ ogg_pipe[1] = -1; ++ } ++ ++ if (debug_mode) printf("ogg123_pipe_open pid = %d\n", *ogg_child); ++ ++ return TRUE; ++} ++ ++/* + *---------------------------------------------------------------------------- + * title/description utils + *---------------------------------------------------------------------------- +@@ -100,21 +156,22 @@ OGGInfo *ogg123_info_get(const gchar *pa + { + OGGInfo *info = NULL; + FILE *f; +- gchar *command; ++ char *command[3]; ++ gint child_pid; ++ int child_pipe[2]; + char buf[128]; + + if (!ogg123_info_found) return NULL; ++ command[0] = OGG123_BINARY_INFO; ++ command[1] = (char *)path; ++ command[2] = NULL; + +- command = g_strdup_printf("%s \"%s\"", OGG123_BINARY_INFO, path); +- f = popen(command, "r"); +- if (!f) ++ if (ogg123_pipe_open(command, &child_pid, child_pipe) == FALSE ++ || (f = fdopen(child_pipe[0], "r")) == NULL) + { +- printf("Failed to run \"%s\n\"", command); +- g_free(command); ++ printf("Failed to run \"%s\n\"", command[0]); + return NULL; + } +- g_free(command); +- + info = g_new0(OGGInfo, 1); + + while (fgets(buf, sizeof(buf), f) != NULL) +@@ -163,7 +220,7 @@ OGGInfo *ogg123_info_get(const gchar *pa + } + } + +- pclose(f); ++ close(child_pipe[0]); + + info->bytes = filesize(path); + +@@ -178,20 +235,23 @@ GList *ogg123_comment_get(const gchar *p + { + GList *list = NULL; + FILE *f; +- gchar *command; ++ char *command[4]; ++ gint child_pid; ++ int child_pipe[2]; + char buf[128]; + + if (!ogg123_comment_found) return NULL; ++ command[0] = OGG123_BINARY_COMMENT; ++ command[1] = "-l"; ++ command[2] = (char *)path; ++ command[3] = NULL; + +- command = g_strdup_printf("%s -l \"%s\"", OGG123_BINARY_COMMENT, path); +- f = popen(command, "r"); +- if (!f) ++ if (ogg123_pipe_open(command, &child_pid, child_pipe) == FALSE ++ || (f = fdopen(child_pipe[0], "r")) == NULL) + { +- printf("Failed to run \"%s\n\"", command); +- g_free(command); ++ printf("Failed to run \"%s\n\"", command[0]); + return NULL; + } +- g_free(command); + + while (fgets(buf, sizeof(buf), f) != NULL) + { +@@ -214,7 +274,7 @@ GList *ogg123_comment_get(const gchar *p + g_free(key); + } + +- pclose(f); ++ close(child_pipe[0]); + + return g_list_reverse(list); + } +@@ -250,16 +310,36 @@ const gchar *ogg123_comment_value(GList + gint ogg123_comment_set(const gchar *path, GList *comments) + { + FILE *f; +- gchar *command; + GList *errlist; + GList *work; + char buf[128]; +- gchar *tmp; ++ int argc; ++ char **argv; ++ gint child_pid; ++ int child_pipe[2]; + + if (!ogg123_comment_found) return TRUE; + if (!path) return FALSE; + +- command = g_strdup_printf("%s -w \"%s\"", OGG123_BINARY_COMMENT, path); ++ argc = 4; ++ work = comments; ++ while (work && work->next) { ++ if (work->data) ++ argc += 2; ++ work = work->next; ++ work = work->next; ++ } ++ if ((argv = g_malloc(argc * sizeof(argv[0]))) == NULL) ++ { ++ printf("Failed to allocate memory to run %s\n", ++ OGG123_BINARY_COMMENT); ++ return FALSE; ++ } ++ ++ argc = 0; ++ argv[argc++] = OGG123_BINARY_COMMENT; ++ argv[argc++] = "-w"; ++ argv[argc++] = (char *)path; + + work = comments; + while (work && work->next) +@@ -272,26 +352,21 @@ gint ogg123_comment_set(const gchar *pat + + if (key && strlen(key) > 0 && value && strlen(value) > 0) + { +- tmp = g_strdup_printf("%s -t \"%s=%s\"", command, key, value); +- g_free(command); +- command = tmp; ++ argv[argc++] = "-t"; ++ argv[argc++] = g_strdup_printf("%s=%s", key, value); + } + + work = work->next; + work = work->next; + } +- tmp = g_strdup_printf("%s 2>&1", command); +- g_free(command); +- command = tmp; ++ argv[argc++] = NULL; + +- f = popen(command, "r"); +- if (!f) ++ if (ogg123_pipe_open(argv, &child_pid, child_pipe) == FALSE ++ || (f = fdopen(child_pipe[0], "r")) == NULL) + { +- printf("Failed to run \"%s\"\n", command); +- g_free(command); ++ printf("Failed to run \"%s\"\n", argv[0]); + return FALSE; + } +- g_free(command); + + errlist = NULL; + while (fgets(buf, sizeof(buf), f) != NULL) +@@ -302,7 +377,8 @@ gint ogg123_comment_set(const gchar *pat + } + } + +- pclose(f); ++ close(child_pipe[0]); ++ g_free(argv); + + if (errlist) + { +@@ -472,30 +548,24 @@ static gint parse_time(const gchar *text + return (m * 60 + s); + } + +-static void parse_bitrate(const gchar *text) ++static gint parse_bitrate(const gchar *text) + { + static time_t old_t = 0; + time_t new_t; +- const gchar *ptr; + gint force = FALSE; ++ int new_rate; + +- ptr = strstr(text, "Bitrate: "); +- if (ptr) ++ if (sscanf(text, "(%d.%*d kbps)", &new_rate) != 1) ++ return FALSE; ++ if (input_bitrate != 0) + { +- gint new_rate; +- +- ptr += 9; +- new_rate = (gint)strtol(ptr, NULL, 10); +- if (input_bitrate != 0) +- { +- /* show a trend, ugly but it makes the rate change more smoothly */ +- input_bitrate = ((input_bitrate * 4) + new_rate) / 5; +- } +- else +- { +- input_bitrate = new_rate; +- force = TRUE; +- } ++ /* show a trend, ugly but it makes the rate change more smoothly */ ++ input_bitrate = ((input_bitrate * 4) + (gint)new_rate) / 5; ++ } ++ else ++ { ++ input_bitrate = (gint)new_rate; ++ force = TRUE; + } + + /* we only update once per second */ +@@ -505,12 +575,14 @@ static void parse_bitrate(const gchar *t + module_playback_data_changed(); + old_t = new_t; + } ++ return TRUE; + } + + static gint ogg123_input_parse(const gchar *buffer) + { + if (debug_mode > 1) printf("ogg123 output:\"%s\"\n", buffer); + ++/* Time: 00:03.92 [04:48.17] of 04:52.09 (140.9 kbps) Output Buffer 75.0% */ + if (strncmp(buffer, "Time: ", 6) == 0) + { + const gchar *ptr; +@@ -527,7 +599,9 @@ static gint ogg123_input_parse(const gch + if (strlen(ptr) < 8) return FALSE; + seconds_remaining = parse_time(ptr); + frames_remaining = seconds_remaining; +- parse_bitrate(ptr); ++ ptr = strchr(ptr, '('); ++ if (!ptr) return FALSE; ++ if (parse_bitrate(ptr) == FALSE) return FALSE; + } + else if (strncmp(buffer, "Bitstream is", 12) == 0) + { +@@ -648,7 +722,6 @@ static void ogg123_input_read_reset(void + + static gint ogg123_child_run(SongData *sd, gint position) + { +- pid_t frk_pid; + char cmd_arguments[OGG123_MAX_COMMANDS][512]; + char *cmd_ptr[OGG123_MAX_COMMANDS]; + int cmd_cnt = 0; +@@ -720,48 +793,11 @@ static gint ogg123_child_run(SongData *s + cmd_ptr[cmd_cnt] = NULL; + cmd_cnt++; + +- /* Create the pipe. */ +- if (pipe(ogg123_pipe)) +- { +- fprintf (stderr, _("Pipe failed.\n")); +- return FALSE; +- } +- +- if (debug_mode) printf("opening: %s\n", sd->path); +- +- /* Create the child process. */ +- frk_pid = fork (); +- if (frk_pid == (pid_t) 0) +- { +- /* This is the child process. */ +- dup2(ogg123_pipe[1], 2); +- close(ogg123_pipe[0]); +- +- execvp(exec_bin, cmd_ptr); +- printf(_("unable to run %s (in the path?)\n"), exec_bin); +- _exit(1); +- } +- else if (frk_pid < (pid_t) 0) +- { +- /* The fork failed. */ +- fprintf (stderr, _("Fork failed.\n")); +- close(ogg123_pipe[0]); +- close(ogg123_pipe[1]); +- pid = 0; +- ogg123_child_pid = -1; ++ pid = 0; ++ if (ogg123_pipe_open(cmd_ptr, &ogg123_child_pid, ogg123_pipe) == FALSE) + return FALSE; +- } +- else +- { +- /* This is the parent process. */ +- ogg123_child_pid = (int) frk_pid; +- pid = ogg123_child_pid; + +- close(ogg123_pipe[1]); +- ogg123_pipe[1] = -1; +- } +- +- if (debug_mode) printf("ogg123 pid = %d\n", ogg123_child_pid); ++ pid = ogg123_child_pid; + + ogg123_input_read_reset(); + ogg123_control_read_id = gdk_input_add (ogg123_pipe[0], GDK_INPUT_READ, ogg123_input_read_cb, NULL); +@@ -769,6 +805,7 @@ static gint ogg123_child_run(SongData *s + return TRUE; + } + ++ + /* + *---------------------------------------------------------------------------- + * module callback funcs +@@ -793,7 +830,7 @@ static gint ogg123_data_set(SongData *sd + if (info) + { + sd->length = info->length; +- sd->bit_rate = info->bitrate_nominal; ++ sd->bit_rate = info->bitrate_average / 1000; + sd->channels = info->channels; + sd->bit_depth = 16; /* these two correct ? */ + sd->khz_rate = 44; |