[ao] Two patches for libao2

Heikki Orsila shd at modeemi.fi
Sun Aug 30 20:52:01 UTC 2009


Please consider these two (Git) patches for inclusion into libao2.

1. Trivial fix

2. Make driver specific options configurable
	- With this patch, one can for example set ALSA's buffer_time
	  option for all programs that use libao

-- 
Heikki Orsila
heikki.orsila at iki.fi
http://www.iki.fi/shd
-------------- next part --------------
>From 19f07a23f4f9e641e9d208930a346c3642c2869b Mon Sep 17 00:00:00 2001
From: Heikki Orsila <heikki.orsila at iki.fi>
Date: Sun, 30 Aug 2009 22:49:57 +0300
Subject: [PATCH 1/2] audio_out: Handle strdup()'s return value correctly [CORRECTIVE]

---
 src/audio_out.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/src/audio_out.c b/src/audio_out.c
index 88660c0..6e39047 100644
--- a/src/audio_out.c
+++ b/src/audio_out.c
@@ -613,6 +613,7 @@ int ao_append_option(ao_option **options, const char *key, const char *value)
 
 	op->key = strdup(key);
 	op->value = strdup(value);
+	if (op->key == NULL || op->value == NULL) return 0;
 	op->next = NULL;
 
 	if ((list = *options) != NULL) {
-- 
1.6.1.2

-------------- next part --------------
>From e905c74eca5c504d1665125df7a9523a685b987f Mon Sep 17 00:00:00 2001
From: Heikki Orsila <heikki.orsila at iki.fi>
Date: Sun, 30 Aug 2009 23:46:48 +0300
Subject: [PATCH 2/2] Make driver specific options configurable

---
 doc/ao_open_file.html |    3 ++-
 doc/ao_open_live.html |    3 ++-
 doc/config.html       |    4 ++++
 libao.conf.5          |    4 ++++
 src/ao_private.h      |    3 +++
 src/audio_out.c       |    8 ++++++--
 src/config.c          |   32 +++++++++++++++++++++++---------
 7 files changed, 44 insertions(+), 13 deletions(-)

diff --git a/doc/ao_open_file.html b/doc/ao_open_file.html
index f6c3935..2a70aea 100644
--- a/doc/ao_open_file.html
+++ b/doc/ao_open_file.html
@@ -46,7 +46,8 @@ preexisting file will cause the function to report a failure.</dd>
 <dd>Pointer to a struct describing the sample format.  The caller retains ownership of this structure.</dd>
 <dt><i>options</i></dt>
 <dd>A linked list of options to be passed to the driver or NULL if no options
-are needed.  Unsupported options are ignored.</dd>
+are needed. If options is NULL, default values from libao.conf are used,
+otherwise the defaults are ignored. Unsupported options are ignored.</dd>
 </dl>
 
 <h3>Return Values</h3>
diff --git a/doc/ao_open_live.html b/doc/ao_open_live.html
index 388c7c8..8ffc709 100644
--- a/doc/ao_open_live.html
+++ b/doc/ao_open_live.html
@@ -40,7 +40,8 @@
 <dd>Pointer to a struct describing the sample format.  The caller retains ownership of this structure.</dd>
 <dt><i>options</i></dt>
 <dd>A linked list of options to be passed to the driver or NULL if no options
-are needed.  Unsupported options are ignored.</dd>
+are needed. If options is NULL, default values from libao.conf are used,
+otherwise the defaults are ignored. Unsupported options are ignored.</dd>
 </dl>
 
 <h3>Return Values</h3>
diff --git a/doc/config.html b/doc/config.html
index ac580e0..5f67f24 100644
--- a/doc/config.html
+++ b/doc/config.html
@@ -39,6 +39,10 @@ There can be no extra spaces anywhere on the line.  Comment lines begin with a <
 </dd>
 </dl>
 
+<p>Any other option will be passed for the audio driver as a
+key-value pair. E.g. buffer_time=100000 will set alsa driver's buffering
+to 100ms.</p>
+
 <br><br>
 <hr noshade>
 <table border=0 width=100%>
diff --git a/libao.conf.5 b/libao.conf.5
index 161346f..7ec9d30 100644
--- a/libao.conf.5
+++ b/libao.conf.5
@@ -52,6 +52,10 @@ systems as well as Solaris.  The "alsa" driver is for the 0.9.x ALSA API,
 whereas the "alsa05" driver is for the 0.5.x API.
 .RE
 
+Any other option will be passed for the audio driver as a
+key-value pair. E.g. buffer_time=100000 will set alsa driver's buffering
+to 100ms.
+
 .SH EXAMPLE
 
 Here is an example
diff --git a/src/ao_private.h b/src/ao_private.h
index 9fe382f..901593b 100644
--- a/src/ao_private.h
+++ b/src/ao_private.h
@@ -26,6 +26,8 @@
 #ifndef __AO_PRIVATE_H__
 #define __AO_PRIVATE_H__
 
+#include "ao/ao.h"
+
 /* --- Operating System Compatibility --- */
 
 /* 
@@ -61,6 +63,7 @@
 
 typedef struct ao_config {
 	char *default_driver;
+	ao_option *options;
 } ao_config;
 
 /* --- Functions --- */
diff --git a/src/audio_out.c b/src/audio_out.c
index 6e39047..14012e4 100644
--- a/src/audio_out.c
+++ b/src/audio_out.c
@@ -95,7 +95,8 @@ static ao_functions *static_drivers[] = {
 
 static driver_list *driver_head = NULL;
 static ao_config config = {
-	NULL /* default_driver */
+	NULL, /* default_driver */
+	NULL, /* options */
 };
 
 static ao_info **info_table = NULL;
@@ -501,7 +502,10 @@ static ao_device* _open_device(int driver_id, ao_sample_format *format,
 		errno = AO_EFAIL;
 		return NULL; /* Couldn't init internal memory */
 	}
-	
+
+	if (options == NULL)
+		options = config.options;
+
 	/* Load options */
 	while (options != NULL) {
 		if (!funcs->set_option(device, options->key, options->value)) {
diff --git a/src/config.c b/src/config.c
index 7c495da..eb6cd29 100644
--- a/src/config.c
+++ b/src/config.c
@@ -54,21 +54,35 @@ int read_config_file(ao_config *config, const char *config_file)
 	FILE *fp;
 	char line[LINE_LEN];
 	int end;
-	
-	
+	char *separator;
+	char *key;
+	char *value;
+
 	if ( !(fp = fopen(config_file, "r")) )
 		return 0; /* Can't open file */
 	
 	while (fgets(line, LINE_LEN, fp)) {
 		/* All options are key=value */
-		
-		if (strncmp(line, "default_driver=", 15) == 0) {
-			free(config->default_driver);
-			end = strlen(line);
-			if (line[end-1] == '\n')
-				line[end-1] = 0; /* Remove trailing newline */
+		if (line[0] == '#')
+			continue;
 
-			config->default_driver = strdup(line+15);
+		end = strlen(line);
+		if (line[end - 1] == '\n')
+			line[end - 1] = 0; /* Remove trailing newline */
+
+		separator = strchr(line, '=');
+		if (separator == NULL)
+			continue;
+		*separator = 0;
+		key = line;
+		value = separator + 1;
+
+		if (strcmp(key, "default_driver") == 0) {
+			free(config->default_driver);
+			config->default_driver = strdup(value);
+		} else {
+			/* Assume it's an option for the audio driver */
+			ao_append_option(&config->options, key, value);
 		}
 	}
 
-- 
1.6.1.2



More information about the Ubuntu-devel-discuss mailing list