[xiph-cvs] cvs commit: ices/src Makefile.am config.c ices.c process.c registry.h savefile.c
Michael Smith
msmith at xiph.org
Fri Feb 8 21:07:03 PST 2002
msmith 02/02/08 21:07:03
Modified: src Tag: branch-beta2-rewrite Makefile.am config.c
ices.c No tag process.c registry.h Tag:
branch-beta2-rewrite savefile.c
Log:
Config fixes (now it actually gives error messages on some bad configs, instead
of just collapsing in a heap trying to use an invalid config).
Reimplemented savefile.
Revision Changes Path
No revision
<p>No revision
<p>1.5.2.3 +1 -1 ices/src/Makefile.am
Index: Makefile.am
===================================================================
RCS file: /usr/local/cvsroot/ices/src/Makefile.am,v
retrieving revision 1.5.2.2
retrieving revision 1.5.2.3
diff -u -r1.5.2.2 -r1.5.2.3
--- Makefile.am 2002/02/08 12:54:08 1.5.2.2
+++ Makefile.am 2002/02/09 05:07:01 1.5.2.3
@@ -23,7 +23,7 @@
#noinst_HEADERS = config.h input.h im_playlist.h signals.h stream.h reencode.h encode.h playlist_basic.h logging.h im_stdinpcm.h $(ossheaders) $(sunheaders) event.h stream_shared.h metadata.h process.h
#ices_SOURCES = input.c config.c stream.c ices.c signals.c im_playlist.c reencode.c encode.c playlist_basic.c im_stdinpcm.c $(osssources) $(sunsources) stream_shared.c savefile.c metadata.c stream_rewrite.c process.c
noinst_HEADERS = config.h input.h im_playlist.h signals.h stream.h encode.h playlist_basic.h logging.h process.h $(ossheaders) im_stdinpcm.h
-ices_SOURCES = input.c config.c stream.c ices.c signals.c im_playlist.c encode.c playlist_basic.c process.c output.c $(osssources) im_stdinpcm.c
+ices_SOURCES = input.c config.c stream.c ices.c signals.c im_playlist.c encode.c playlist_basic.c process.c output.c $(osssources) im_stdinpcm.c savefile.c
ices_LDADD = net/libicenet.la thread/libicethread.la log/libicelog.la\
avl/libiceavl.la timing/libicetiming.la
<p><p>1.6.2.3 +35 -17 ices/src/config.c
Index: config.c
===================================================================
RCS file: /usr/local/cvsroot/ices/src/config.c,v
retrieving revision 1.6.2.2
retrieving revision 1.6.2.3
diff -u -r1.6.2.2 -r1.6.2.3
--- config.c 2002/02/08 11:14:03 1.6.2.2
+++ config.c 2002/02/09 05:07:01 1.6.2.3
@@ -1,7 +1,7 @@
/* config.c
* - config file reading code, plus default settings.
*
- * $Id: config.c,v 1.6.2.2 2002/02/08 11:14:03 msmith Exp $
+ * $Id: config.c,v 1.6.2.3 2002/02/09 05:07:01 msmith Exp $
*
* Copyright (c) 2001-2002 Michael Smith <msmith at labyrinth.net.au>
*
@@ -165,7 +165,7 @@
}
}
-static void _parse_instance(config_t *config, xmlDocPtr doc, xmlNodePtr node)
+static int _parse_instance(config_t *config, xmlDocPtr doc, xmlNodePtr node)
{
process_chain_element *chain = NULL;
instance_t *instance = calloc(1, sizeof(instance_t));
@@ -180,14 +180,15 @@
if (strcmp(node->name, "maxqueuelength") == 0)
SET_INT(instance->max_queue_length);
- if (strcmp(node->name, "module") == 0)
+ if (strcmp(node->name, "module") == 0) {
chain = _parse_module(doc, node, chain);
+ if(!chain) {
+ fprintf(stderr, "Couldn't create processing chain\n");
+ return -1;
+ }
+ }
} while ((node = node->next));
- if(!chain) {
- fprintf(stderr, "Couldn't create processing chain\n");
- return;
- }
instance->next = NULL;
instance->output_chain = chain;
@@ -203,9 +204,11 @@
prev->next = instance;
}
+
+ return 0;
}
-static void _parse_input(config_t *config, xmlDocPtr doc, xmlNodePtr node)
+static int _parse_input(config_t *config, xmlDocPtr doc, xmlNodePtr node)
{
process_chain_element *chain = NULL;
@@ -219,24 +222,36 @@
} while ((node = node->next));
config->input_chain = chain;
+
+ if(!chain) {
+ fprintf(stderr, "Could not create input processing chain.\n");
+ return -1;
+ }
+
+ return 0;
}
-static void _parse_stream(config_t *config, xmlDocPtr doc, xmlNodePtr node)
+static int _parse_stream(config_t *config, xmlDocPtr doc, xmlNodePtr node)
{
+ int ret = 0;
do
{
if (node == NULL) break;
if (xmlIsBlankNode(node)) continue;
if (strcmp(node->name, "input") == 0)
- _parse_input(config, doc, node->xmlChildrenNode);
+ ret = _parse_input(config, doc, node->xmlChildrenNode);
else if (strcmp(node->name, "instance") == 0)
- _parse_instance(config, doc, node->xmlChildrenNode);
- } while ((node = node->next));
+ ret = _parse_instance(config, doc, node->xmlChildrenNode);
+ } while (!ret && (node = node->next));
+
+ return ret;
}
-static void _parse_root(config_t *config, xmlDocPtr doc, xmlNodePtr node)
+static int _parse_root(config_t *config, xmlDocPtr doc, xmlNodePtr node)
{
+ int ret = -1;
+
do
{
if (node == NULL) break;
@@ -253,8 +268,10 @@
else if (strcmp(node->name, "consolelog") == 0)
SET_INT(config->log_stderr);
else if (strcmp(node->name, "stream") == 0)
- _parse_stream(config, doc, node->xmlChildrenNode);
+ ret = _parse_stream(config, doc, node->xmlChildrenNode);
} while ((node = node->next));
+
+ return ret;
}
void config_initialise(void)
@@ -275,6 +292,7 @@
{
xmlDocPtr doc;
xmlNodePtr node;
+ int ret;
if (fn == NULL || strcmp(fn, "") == 0) return -1;
@@ -285,14 +303,14 @@
if (node == NULL || strcmp(node->name, "ices") != 0)
{
xmlFreeDoc(doc);
- return 0;
+ return -1;
}
- _parse_root(ices_config, doc, node->xmlChildrenNode);
+ ret = _parse_root(ices_config, doc, node->xmlChildrenNode);
xmlFreeDoc(doc);
- return 1;
+ return ret;
}
<p><p>1.4.2.3 +2 -2 ices/src/ices.c
Index: ices.c
===================================================================
RCS file: /usr/local/cvsroot/ices/src/ices.c,v
retrieving revision 1.4.2.2
retrieving revision 1.4.2.3
diff -u -r1.4.2.2 -r1.4.2.3
--- ices.c 2002/02/08 11:14:03 1.4.2.2
+++ ices.c 2002/02/09 05:07:01 1.4.2.3
@@ -1,7 +1,7 @@
/* ices.c
* - Main startup, thread launching, and cleanup code.
*
- * $Id: ices.c,v 1.4.2.2 2002/02/08 11:14:03 msmith Exp $
+ * $Id: ices.c,v 1.4.2.3 2002/02/09 05:07:01 msmith Exp $
*
* Copyright (c) 2001-2002 Michael Smith <msmith at labyrinth.net.au>
*
@@ -52,7 +52,7 @@
** make it so you can specify all parameters on the commandline
** too.
*/
- if (config_read(argv[1]) <= 0)
+ if (config_read(argv[1]) < 0)
{
fprintf(stderr, "Failed to read config file \"%s\"\n", argv[1]);
goto fail;
<p><p>No revision
<p>No revision
<p>1.3 +6 -6 ices/src/process.c
Index: process.c
===================================================================
RCS file: /usr/local/cvsroot/ices/src/process.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- process.c 2002/02/09 03:55:37 1.2
+++ process.c 2002/02/09 05:07:01 1.3
@@ -2,7 +2,7 @@
* - Processing chains - data sources, sinks, processing effects, reencoding,
* etc.
*
- * $Id: process.c,v 1.2 2002/02/09 03:55:37 msmith Exp $
+ * $Id: process.c,v 1.3 2002/02/09 05:07:01 msmith Exp $
*
* Copyright (c) 2001-2002 Michael Smith <msmith at labyrinth.net.au>
*
@@ -100,9 +100,9 @@
LOG_ERROR0("NULL input buffer where input required.");
return -2;
}
-
- if(chain->input_type != MEDIA_NONE && in->type != chain->input_type) {
- LOG_ERROR2("Chain input does not match expected input! (%d != %d",
+ else if(chain->input_type != MEDIA_NONE && chain->input_type !=
+ MEDIA_DATA && in->type != chain->input_type) {
+ LOG_ERROR2("Chain input does not match expected input! (%d != %d)",
in->type, chain->input_type);
return -2;
}
@@ -113,8 +113,8 @@
return ret;
}
- if(chain->output_type != MEDIA_NONE &&
- (*out)->type != chain->output_type) {
+ if(chain->output_type != MEDIA_NONE && chain->output_type != MEDIA_DATA
+ && (*out)->type != chain->output_type) {
LOG_ERROR0("Chain did not produce expected output type.");
return -2;
}
<p><p>1.2 +5 -1 ices/src/registry.h
Index: registry.h
===================================================================
RCS file: /usr/local/cvsroot/ices/src/registry.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- registry.h 2002/02/07 09:11:12 1.1
+++ registry.h 2002/02/09 05:07:01 1.2
@@ -1,7 +1,7 @@
/* registry.h
* - Registry of input/output/processing modules.
*
- * $Id: registry.h,v 1.1 2002/02/07 09:11:12 msmith Exp $
+ * $Id: registry.h,v 1.2 2002/02/09 05:07:01 msmith Exp $
*
* Copyright (c) 2001-2002 Michael Smith <msmith at labyrinth.net.au>
*
@@ -36,11 +36,15 @@
open_func open;
} module;
+/* Some others we don't have headers for */
+int savefile_open_module(process_chain_element *mod, module_param_t *params);
+
static module registered_modules[] = {
{ "encode", encode_open_module},
{ "stream", stream_open_module},
{ "playlist", playlist_open_module},
{ "stdinpcm", stdin_open_module},
+ { "savestream", savefile_open_module},
#ifdef HAVE_OSS
{ "oss", oss_open_module},
#endif
<p><p>No revision
<p>No revision
<p>1.3.2.2 +104 -54 ices/src/savefile.c
Index: savefile.c
===================================================================
RCS file: /usr/local/cvsroot/ices/src/savefile.c,v
retrieving revision 1.3.2.1
retrieving revision 1.3.2.2
diff -u -r1.3.2.1 -r1.3.2.2
--- savefile.c 2002/02/07 09:11:12 1.3.2.1
+++ savefile.c 2002/02/09 05:07:01 1.3.2.2
@@ -1,7 +1,7 @@
/* savefile.c
- * - Stream saving to file.
+ * - Save a stream to a file, for archival purposes
*
- * $Id: savefile.c,v 1.3.2.1 2002/02/07 09:11:12 msmith Exp $
+ * $Id: savefile.c,v 1.3.2.2 2002/02/09 05:07:01 msmith Exp $
*
* Copyright (c) 2001-2002 Michael Smith <msmith at labyrinth.net.au>
*
@@ -9,81 +9,131 @@
* Public License, version 2. You may use, modify, and redistribute
* it under the terms of this license. A copy should be included
* with this source.
- *
- * NOTE: Not currently actually used.
*/
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
#include <string.h>
+#include <errno.h>
+#include <ogg/ogg.h>
+
+#include "thread.h"
#include "config.h"
-#include "input.h"
-#include "inputmodule.h"
-#include "stream_shared.h"
#include "stream.h"
-#define MODULE "stream-save/"
+#include "process.h"
+
+#define MODULE "savefile/"
#include "logging.h"
+/* FIXME: Extend savefile to be able to create a new output file either
+ * whenever a new stream is reached, or when a certain filesize is reached.
+ */
-void *savefile_stream(void *arg)
-{
- stream_description *sdsc = arg;
- instance_t *stream = sdsc->stream;
- ref_buffer *buf;
- FILE *file;
- int ret;
- char *filename = stream->savefilename;
-
- /* FIXME: Check for file existence, and append some unique string
- * if it already exists.
- */
- file = fopen(filename, "wb");
- if(!file)
+typedef struct {
+ FILE *file;
+ char *filename;
+} savefile_state;
+
+static int event_handler(process_chain_element *mod, event_type ev,
+ void *param)
+{
+ switch(ev)
{
- LOG_ERROR1("Couldn't open file to save stream: %s", filename);
- stream->died = 1;
- return NULL;
+ case EVENT_SHUTDOWN:
+ if(mod)
+ {
+ if(mod->priv_data) {
+ if(((savefile_state *)mod->priv_data)->filename)
+ free(((savefile_state *)mod->priv_data)->filename);
+ free(mod->priv_data);
+ }
+ }
+ break;
+ default:
+ return -1;
}
- LOG_INFO1("Saving stream to file: %s", filename);
+ return 0;
+}
- while(1)
- {
- buf = stream_wait_for_data(stream);
+/* Core streaming function for this module
+ * This is what actually produces the data which gets streamed.
+ *
+ * returns: >0 Number of bytes read
+ * 0 Non-fatal error.
+ * <0 Fatal error.
+ */
+static int savefile_read(instance_t *instance, void *self,
+ ref_buffer *in, ref_buffer **out)
+{
+ savefile_state *s = self;
+ int ret;
- if(!buf)
- break;
+ /* If this isn't set up right, don't cause errors... */
+ if(!s->file) {
+ *out = in;
+ return in->len;
+ }
+
+ ret = fwrite(in->buf, 1, in->len, s->file);
+
+ if(ret < in->len) {
+ if(ret >= 0)
+ LOG_WARN2("Could only write %d of %d bytes to savefile",
+ ret, in->len);
+ else {
+ LOG_ERROR2("Error writing to savefile (%s): %s", s->filename,
+ strerror(errno));
+ return -1;
+ }
+ }
- if(!buf->buf || !buf->len)
- {
- LOG_WARN0("Bad buffer dequeue, not saving");
- continue;
- }
-
- ret = fwrite(buf->buf, 1, buf->len, file);
-
- if(ret != buf->len)
- {
- LOG_ERROR1("Error writing to file: %s", strerror(errno));
- /* FIXME: Try writing to a new file, or something */
- break;
- }
+ *out = in;
+
+ return in->len;
+}
+
+int savefile_open_module(process_chain_element *mod, module_param_t *params)
+{
+ savefile_state *s;
+ module_param_t *current;
+
+ mod->name = "process-savefile";
+
+ /* We actually don't care what input and output are, so we use MEDIA_DATA */
+ mod->input_type = MEDIA_DATA;
+ mod->output_type = MEDIA_DATA;
+
+ mod->process = savefile_read;
+ mod->event_handler = event_handler;
+
+ mod->priv_data = calloc(1, sizeof(savefile_state));
+ s = mod->priv_data;
+
+ current = params;
+
+ while(current)
+ {
+ if(!strcmp(current->name, "filename"))
+ s->filename = strdup(current->value);
+ else
+ LOG_WARN1("Unknown parameter %s for savefile module",current->name);
- stream_release_buffer(buf);
+ current = current->next;
}
+ config_free_params(params);
- fclose(file);
+ s->file = fopen(s->filename, "wb");
+ if(!s->file)
+ LOG_ERROR2("Error opening file for savefile %s: %s", s->filename,
+ strerror(errno));
+ else
+ LOG_INFO1("Opened file %s for savestream", s->filename);
- stream->died = 1;
- return NULL;
+ return 0;
}
-
-
-
<p><p><p>--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the commits
mailing list