Recently Written · git

sad

sad (2f30.org simple audio daemon) with a Cygwin/OSS port on branch cygwin

git clone https://github.com/equwal/sad

Log | Files | Refs


commit 14aa84edc4b44aa18713157ed120f12f8d78d8cb
sin <sin@2f30.org>
2014-12-29 02:20:36 +0000

Add repeat/random modes

 playlist.c | 39 ++++++++++++++++++++-------------------
 sad.c      |  4 +++-
 sad.h      | 10 ++++++++--
 3 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/playlist.c b/playlist.c
index 31af398..a83e100 100644
--- a/playlist.c
+++ b/playlist.c
@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include "sad.h"
 
@@ -110,28 +111,22 @@ clearplaylist(void)
 }
 
 Song *
-playnextsong(void)
+picknextsong(void)
 {
 	Song *s;
 
-	stopsong(playlist.cursong);
-	/* default to a repeat/cycle through mode */
-	s = getnextsong();
-	s->state = PREPARE;
-	playlist.cursong = s;
-	return s;
-}
-
-Song *
-playprevsong(void)
-{
-	Song *s;
-
-	stopsong(playlist.cursong);
-	/* default to a repeat/cycle through mode */
-	s = getprevsong();
-	s->state = PREPARE;
-	playlist.cursong = s;
+	switch (playlist.mode) {
+	case REPEAT:
+		s = getnextsong();
+		break;
+	case RANDOM:
+		srand(time(NULL));
+		s = playlist.songs[rand() % playlist.nsongs];
+		break;
+	default:
+		s = NULL;
+		break;
+	}
 	return s;
 }
 
@@ -151,3 +146,9 @@ stopsong(Song *s)
 		s->state = NONE;
 	}
 }
+
+void
+playlistmode(int mode)
+{
+	playlist.mode = mode;
+}
diff --git a/sad.c b/sad.c
index b86090e..1ba9810 100644
--- a/sad.c
+++ b/sad.c
@@ -83,7 +83,7 @@ playaudio(void)
 		break;
 	case PLAYING:
 		if ((nbytes = s->decoder->decode(buf, sizeof(buf))) <= 0) {
-			playnextsong();
+			playsong(picknextsong());
 			notify(EVSONGFINISHED);
 		} else {
 			playoutput(buf, nbytes);
@@ -125,6 +125,8 @@ main(int argc, char *argv[])
 	openoutputs();
 	initnotifier();
 
+	playlistmode(REPEAT);
+
 	while (1) {
 		rfds = master;
 		tv.tv_sec = 0;
diff --git a/sad.h b/sad.h
index 8e78363..43cc38b 100644
--- a/sad.h
+++ b/sad.h
@@ -17,6 +17,11 @@ enum {
 	PAUSED
 };
 
+enum {
+	REPEAT,
+	RANDOM
+};
+
 enum {
 	EVSONGFINISHED,
 };
@@ -48,6 +53,7 @@ typedef struct {
 	Song  *cursong;
 	size_t nsongs;
 	size_t maxsongs;
+	int    mode;
 } Playlist;
 
 typedef struct {
@@ -77,10 +83,10 @@ Song *getcursong(void);
 void putcursong(Song *);
 void dumpplaylist(int);
 void clearplaylist(void);
-Song *playnextsong(void);
-Song *playprevsong(void);
+Song *picknextsong(void);
 void playsong(Song *);
 void stopsong(Song *);
+void playlistmode(int);
 
 /* library.c */
 Song *addlibrary(const char *);