From 49f9b08933774469ffb92aba24ffe5da442b789a Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@tuebingen.mpg.de>
Date: Sun, 21 Dec 2014 19:05:47 +0000
Subject: [PATCH] vss: Perform stream change actions in vss_post_select().

The pre_select methods should only set the scheduler timeouts and
manipulate fd sets.

Clean up the documentation a bit while at it.
---
 vss.c | 63 +++++++++++++++++++++++++----------------------------------
 1 file changed, 27 insertions(+), 36 deletions(-)

diff --git a/vss.c b/vss.c
index ea075df9..cbc05d13 100644
--- a/vss.c
+++ b/vss.c
@@ -884,47 +884,11 @@ static void set_mmd_offset(void)
 	mmd->offset = tv2ms(&offset);
 }
 
-/*
- * Compute the timeout for the main select-loop of the scheduler.
- *
- * Before the timeout is computed, the current vss status flags are evaluated
- * and acted upon by calling appropriate functions from the lower layers.
- * Possible actions include
- *
- * 	- request a new audio file from afs,
- *	- shutdown of all senders (stop/pause command),
- *	- reposition the stream (ff/jmp command).
- */
 static void vss_pre_select(struct sched *s, void *context)
 {
 	int i;
 	struct vss_task *vsst = context;
 
-	if (!vsst->map || vss_next() || vss_paused() || vss_repos()) {
-		struct fec_client *fc, *tmp;
-		for (i = 0; senders[i].name; i++)
-			if (senders[i].shutdown_clients)
-				senders[i].shutdown_clients();
-		list_for_each_entry_safe(fc, tmp, &fec_client_list, node)
-			fc->state = FEC_STATE_NONE;
-		mmd->stream_start.tv_sec = 0;
-		mmd->stream_start.tv_usec = 0;
-	}
-	if (vss_next())
-		vss_eof(vsst);
-	else if (vss_paused()) {
-		if (mmd->chunks_sent)
-			set_eof_barrier(vsst);
-		mmd->chunks_sent = 0;
-	} else if (vss_repos()) {
-		tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
-		set_eof_barrier(vsst);
-		mmd->chunks_sent = 0;
-		mmd->current_chunk = afh_get_start_chunk(mmd->repos_request,
-			&mmd->afd.afhi);
-		mmd->new_vss_status_flags &= ~VSS_REPOS;
-		set_mmd_offset();
-	}
 	if (need_to_request_new_audio_file(vsst)) {
 		PARA_DEBUG_LOG("ready and playing, but no audio file\n");
 		para_fd_set(vsst->afs_socket, &s->wfds, &s->max_fileno);
@@ -1127,6 +1091,33 @@ static int vss_post_select(struct sched *s, void *context)
 	int ret, i;
 	struct vss_task *vsst = context;
 
+	if (!vsst->map || vss_next() || vss_paused() || vss_repos()) {
+		/* shut down senders and fec clients */
+		struct fec_client *fc, *tmp;
+		for (i = 0; senders[i].name; i++)
+			if (senders[i].shutdown_clients)
+				senders[i].shutdown_clients();
+		list_for_each_entry_safe(fc, tmp, &fec_client_list, node)
+			fc->state = FEC_STATE_NONE;
+		mmd->stream_start.tv_sec = 0;
+		mmd->stream_start.tv_usec = 0;
+	}
+	if (vss_next())
+		vss_eof(vsst);
+	else if (vss_paused()) {
+		if (mmd->chunks_sent)
+			set_eof_barrier(vsst);
+		mmd->chunks_sent = 0;
+	} else if (vss_repos()) { /* repositioning due to ff/jmp command */
+		tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
+		set_eof_barrier(vsst);
+		mmd->chunks_sent = 0;
+		mmd->current_chunk = afh_get_start_chunk(mmd->repos_request,
+			&mmd->afd.afhi);
+		mmd->new_vss_status_flags &= ~VSS_REPOS;
+		set_mmd_offset();
+	}
+	/* If a sender command is pending, run it. */
 	if (mmd->sender_cmd_data.cmd_num >= 0) {
 		int num = mmd->sender_cmd_data.cmd_num,
 			sender_num = mmd->sender_cmd_data.sender_num;
-- 
2.39.5