[alsa-devel] [PATCH 3/3] ascenario: Make sequences unique for every scenario.

Stefan Schmidt stefan at datenfreihafen.org
Fri Oct 9 17:53:31 CEST 2009


From: Stefan Schmidt <stefan at slimlogic.co.uk>

I could have sworn that worked before. Anyway, pre and post sequences are now
unique per scenario as they always should have been.

Signed-off-by: Stefan Schmidt <stefan at slimlogic.co.uk>
---
 src/ascenario.c |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/src/ascenario.c b/src/ascenario.c
index 49845dc..945b776 100644
--- a/src/ascenario.c
+++ b/src/ascenario.c
@@ -71,6 +71,8 @@ struct scenario_info {
 	char *file;
 	char *pre_sequence_file;
 	char *post_sequence_file;
+	struct sequence_element *pre_seq_list; /* Linked list for pre sequence */
+	struct sequence_element *post_seq_list; /* Linked list for post sequence */
 	short playback_volume_id;
 	short playback_switch_id;
 	short capture_volume_id;
@@ -85,8 +87,6 @@ struct snd_scenario {
 	int current_scenario;
 	int num_scenarios; /* number of supported scenarios */
 	int num_kcontrols;  /* number of kcontrols */
-	struct sequence_element *pre_seq_list; /* Linked list for pre sequence */
-	struct sequence_element *post_seq_list; /* Linked list for post sequence */
 	const char **list;
 	struct scenario_info *scenario; /* var len array of scenario info */
 	struct control_settings *control; /* var len array of controls */
@@ -414,11 +414,11 @@ static void seq_list_append(snd_scenario_t *scn,
 	struct sequence_element *last, *tmp;
 
 	if (position) {
-		if (!scn->post_seq_list)
-			scn->post_seq_list = curr;
+		if (!scn->scenario[scn->current_scenario].post_seq_list)
+			scn->scenario[scn->current_scenario].post_seq_list = curr;
 
 		else {
-			tmp = scn->post_seq_list;
+			tmp = scn->scenario[scn->current_scenario].post_seq_list;
 			while (tmp) {
 				last = tmp;
 				tmp = tmp->next;
@@ -427,11 +427,11 @@ static void seq_list_append(snd_scenario_t *scn,
 		}
 	}
 	else {
-		if (!scn->pre_seq_list) {
-			scn->pre_seq_list = curr;
+		if (!scn->scenario[scn->current_scenario].pre_seq_list) {
+			scn->scenario[scn->current_scenario].pre_seq_list = curr;
 		}
 		else {
-			tmp = scn->pre_seq_list;
+			tmp = scn->scenario[scn->current_scenario].pre_seq_list;
 			while (tmp) {
 				last = tmp;
 				tmp = tmp->next;
@@ -595,10 +595,12 @@ static int parse_scenario(snd_scenario_t *scn, FILE *f, int line_)
 	bzero(scn->scenario + offset, len);
 	info = scn->scenario + scn->num_scenarios;
 
-	/* Set sequence filename to NULL as it is optional and we want to check
-	 * for  NULL to avoid segfaults */
+	/* Set to NULL as it is optional and we want to check for  NULL to
+	 * avoid segfaults */
 	info->pre_sequence_file = NULL;
 	info->post_sequence_file = NULL;
+	info->pre_seq_list = NULL;
+	info->post_seq_list = NULL;
 
 	while(fgets(buf, MAX_BUF, f) != NULL) {
 
@@ -953,10 +955,6 @@ static void free_scn(snd_scenario_t *scn)
 		free(scn->list);
 	if (scn->card_name)
 		free(scn->card_name);
-	if (scn->pre_seq_list)
-		free(scn->pre_seq_list);
-	if (scn->post_seq_list)
-		free(scn->post_seq_list);
 
 	if (scn->scenario) {
 		for (i = 0; i < scn->num_scenarios; i++) {
@@ -970,6 +968,10 @@ static void free_scn(snd_scenario_t *scn)
 				free(info->pre_sequence_file);
 			if (info->post_sequence_file)
 				free(info->post_sequence_file);
+			if (info->pre_seq_list)
+				free(info->pre_seq_list);
+			if (info->post_seq_list)
+				free(info->post_seq_list);
 		}
 		free(scn->scenario);
 	}
@@ -1216,8 +1218,9 @@ found:
 
 	/* If we have a sequence list that should be executed before the new
 	 * scenario is set do it now */
-	if (scn->pre_seq_list)
-		exec_sequence(scn->pre_seq_list, scn, list, handle);
+	if (scn->scenario[scn->current_scenario].pre_seq_list)
+		exec_sequence(scn->scenario[scn->current_scenario].pre_seq_list,
+			      scn, list, handle);
 
 	/* iterate through each kcontrol and add to db */
 	for (i = 0; i < count; ++i) {
@@ -1234,8 +1237,9 @@ found:
 
 	/* If we have a sequence list that should be executed after the new
 	 * scenario is set do it now */
-	if (scn->post_seq_list)
-		exec_sequence(scn->post_seq_list, scn, list, handle);
+	if (scn->scenario[scn->current_scenario].post_seq_list)
+		exec_sequence(scn->scenario[scn->current_scenario].post_seq_list,
+			      scn, list, handle);
 
 free:
 	snd_ctl_elem_list_free_space(list);
-- 
1.6.4.3



More information about the Alsa-devel mailing list