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 c68f913e25b52cb755d84702c0ae8f047f30d34a
sin <sin@2f30.org>
2015-01-02 15:48:21 +0000

Add support to remove playlist entries

 cmd.c      | 24 ++++++++++++++++++++++++
 playlist.c | 19 +++++++++++++++++++
 sad.h      |  1 +
 3 files changed, 44 insertions(+)
diff --git a/cmd.c b/cmd.c
index 708f13b..077f1af 100644
--- a/cmd.c
+++ b/cmd.c
@@ -252,6 +252,30 @@ cmdempty(int fd, char *arg)
 static void
 cmdremove(int fd, char *arg)
 {
+	Song *s;
+	const char *errstr;
+	int   id;
+
+	if (!arg[0]) {
+		s = getcursong();
+		stopsong(s);
+	} else {
+		id = strtonum(arg, 0, INT_MAX, &errstr);
+		if (errstr) {
+			dprintf(fd, "ERR invalid song id\n");
+			return;
+		}
+		s = findsongid(id);
+		if (!s) {
+			dprintf(fd, "ERR cannot find song with given id\n");
+			return;
+		}
+	}
+	if (rmplaylist(s->id) < 0) {
+		dprintf(fd, "ERR failed to remove song\n");
+		return;
+	}
+	dprintf(fd, "OK\n");
 }
 
 static void
diff --git a/playlist.c b/playlist.c
index a83e100..cd0f663 100644
--- a/playlist.c
+++ b/playlist.c
@@ -36,6 +36,25 @@ addplaylist(int id)
 	return s;
 }
 
+int
+rmplaylist(int id)
+{
+	Song *s;
+	int   i;
+
+	for (i = 0; i < playlist.nsongs; i++)
+		if (playlist.songs[i]->id == id)
+			break;
+	if (i == playlist.nsongs)
+		return -1;
+	s = getnextsong();
+	memmove(&playlist.songs[i], &playlist.songs[i+1],
+	        (playlist.nsongs - i - 1) * sizeof(*playlist.songs[i]));
+	putcursong(s);
+	playlist.nsongs--;
+	return 0;
+}
+
 Song *
 getnextsong(void)
 {
diff --git a/sad.h b/sad.h
index 2631299..bd5a449 100644
--- a/sad.h
+++ b/sad.h
@@ -84,6 +84,7 @@ int docmd(int);
 
 /* playlist.c */
 Song *addplaylist(int);
+int rmplaylist(int);
 Song *getnextsong(void);
 Song *getprevsong(void);
 Song *getcursong(void);