summaryrefslogtreecommitdiff
path: root/audio/gqmpeg
diff options
context:
space:
mode:
authorlukem <lukem@pkgsrc.org>2002-03-25 05:44:48 +0000
committerlukem <lukem@pkgsrc.org>2002-03-25 05:44:48 +0000
commitc13b5c0e0f241caaf49fe26863df3f4e4f3b5e80 (patch)
tree8004fda764229bd3900ba2c65dbf679bcc324962 /audio/gqmpeg
parente515a9150f0eb6dc9af66fc7274453b867c475f1 (diff)
downloadpkgsrc-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/Makefile3
-rw-r--r--audio/gqmpeg/distinfo3
-rw-r--r--audio/gqmpeg/patches/patch-ac376
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;