shithub: qk1

Download patch

ref: 72401e717205cf5864beebdcbacaefcd39ce8465
parent: a6e5ce1f5f63750ce3b86291982e27892b2ea568
author: qwx <qwx@sciops.net>
date: Thu Aug 12 10:02:28 EDT 2021

add missing cd.c

unless i rewrote history and somehow these were
full-trotskied...  mistery.

--- /dev/null
+++ b/cd.c
@@ -1,0 +1,188 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <regexp.h>
+#include "dat.h"
+#include "quakedef.h"
+#include "fns.h"
+
+cvar_t bgmvolume = {"bgmvolume", "1", 1};
+
+static char cdfile[13];
+static int trk, chtrk, ntrk;
+static int cdread, cdloop;
+
+static void
+cproc(void *)
+{
+	int n, afd, fd, v;
+	char f[32];
+	s16int buf[4096];
+	short *p;
+	double vol;
+
+	if((afd = open("/dev/audio", OWRITE)) < 0){
+		fprint(2, "cd: open: %r\n");
+		return;
+	}
+	fd = -1;
+	for(;;){
+		if(chtrk > 0){
+			close(fd);
+			trk = chtrk;
+			snprint(f, sizeof f, "%s%03ud", cdfile, trk);
+			if((fd = open(f, OREAD)) < 0)
+				fprint(2, "cd: open: %r\n");
+			chtrk = 0;
+		}
+		if(!cdread || fd < 0){
+			sleep(1);
+			continue;
+		}
+		if((n = read(fd, buf, sizeof buf)) < 0)
+			break;
+		if(n == 0){
+			if(cdloop)
+				seek(fd, 0, 0);
+			else{
+				close(fd);
+				fd = -1;
+			}
+			continue;
+		}
+		vol = bgmvolume.value;
+		for(p=buf; p<buf+n/sizeof*buf; p++){
+			v = *p * vol;
+			if(v > 0x7fff)
+				v = 0x7fff;
+			else if(v < -0x8000)
+				v = -0x8000;
+			*p = v;
+		}
+		if(write(afd, buf, n) != n)
+			break;
+	}
+}
+
+void
+stopcd(void)
+{
+	cdread = 0;
+	cdloop = 0;
+}
+
+void
+pausecd(void)
+{
+	cdread = 0;
+}
+
+void
+resumecd(void)
+{
+	cdread = 1;
+}
+
+void
+shutcd(void)
+{
+	stopcd();
+}
+
+void
+stepcd(void)
+{
+	if(bgmvolume.value <= 0.0 || cdread == 0)
+		return;
+	cdread = bgmvolume.value > 0.0;
+}
+
+void
+playcd(int nt, int loop)
+{
+	if(ntrk < 1)
+		return;
+	nt -= 1;	/* d001 assumed part of track list */
+	if(nt < 1 || nt > ntrk){
+		Con_Printf("cd: invalid track number %d\n", nt);
+		return;
+	}
+	chtrk = nt;
+	cdloop = loop;
+	cdread = bgmvolume.value > 0.0;
+}
+
+static void
+cdcmd(void)
+{
+	char *c;
+
+	if(Cmd_Argc() < 2){
+usage:
+		Con_Printf("cd (play|loop|stop|pause|resume|info) [track]\n");
+		return;
+	}
+	c = Cmd_Argv(1);
+	if(cistrcmp(c, "play") == 0){
+		if(Cmd_Argc() < 3)
+			goto usage;
+		playcd(atoi(Cmd_Argv(2)), 0);
+	}else if(cistrcmp(c, "loop") == 0){
+		if(Cmd_Argc() < 3)
+			goto usage;
+		playcd(atoi(Cmd_Argv(2)), 1);
+	}else if(cistrcmp(c, "stop") == 0)
+		stopcd();
+	else if(cistrcmp(c, "pause") == 0)
+		pausecd();
+	else if(cistrcmp(c, "resume") == 0)
+		resumecd();
+	else if(cistrcmp(c, "info") == 0)
+		Con_Printf("track %d/%d; loop %d; vol %.1f\n", trk, ntrk, cdloop, bgmvolume.value);
+	else
+		goto usage;
+}
+
+static int
+cdinfo(void)
+{
+	int fd, i, n;
+	char type;
+	Reprog *pat;
+	Dir *d;
+
+	ntrk = 0;
+	if((fd = open("/mnt/cd", OREAD)) < 0)
+		return -1;
+	n = dirreadall(fd, &d);
+	close(fd);
+	if(n < 0)
+		return -1;
+	pat = regcomp("[au][0-9][0-9][0-9]");
+	for(type=0, i=0; i<n; i++)
+		if(regexec(pat, d[i].name, nil, 0)){
+			if(type == 0)
+				type = d[i].name[0];
+			ntrk++;
+		}
+	free(pat);
+	free(d);
+	if(ntrk < 1)
+		return -1;
+	snprint(cdfile, sizeof cdfile, "/mnt/cd/%c", type);
+	return 0;
+}
+
+int
+initcd(void)
+{
+	if(cdinfo() < 0){
+		fprint(2, "cdinfo: %r\n");
+		return -1;
+	}
+	if(proccreate(cproc, nil, 16384) < 0)
+		sysfatal("proccreate: %r");
+	Cvar_RegisterVariable(&bgmvolume);
+	Cmd_AddCommand("cd", cdcmd);
+	return 0;
+}
--- /dev/null
+++ b/qw/cd.c
@@ -1,0 +1,187 @@
+#include <u.h>
+#include <libc.h>
+#include <stdio.h>
+#include <thread.h>
+#include <regexp.h>
+#include "quakedef.h"
+
+cvar_t bgmvolume = {"bgmvolume", "1", 1};
+
+static char cdfile[13];
+static int trk, chtrk, ntrk;
+static int cdread, cdloop;
+
+static void
+cproc(void *)
+{
+	int n, afd, fd, v;
+	char f[32];
+	s16int buf[4096];
+	short *p;
+	double vol;
+
+	if((afd = open("/dev/audio", OWRITE)) < 0){
+		fprint(2, "cd: open: %r\n");
+		return;
+	}
+	fd = -1;
+	for(;;){
+		if(chtrk > 0){
+			close(fd);
+			trk = chtrk;
+			snprint(f, sizeof f, "%s%03ud", cdfile, trk);
+			if((fd = open(f, OREAD)) < 0)
+				fprint(2, "cd: open: %r\n");
+			chtrk = 0;
+		}
+		if(!cdread || fd < 0){
+			sleep(1);
+			continue;
+		}
+		if((n = read(fd, buf, sizeof buf)) < 0)
+			break;
+		if(n == 0){
+			if(cdloop)
+				seek(fd, 0, 0);
+			else{
+				close(fd);
+				fd = -1;
+			}
+			continue;
+		}
+		vol = bgmvolume.value;
+		for(p=buf; p<buf+n/sizeof*buf; p++){
+			v = *p * vol;
+			if(v > 0x7fff)
+				v = 0x7fff;
+			else if(v < -0x8000)
+				v = -0x8000;
+			*p = v;
+		}
+		if(write(afd, buf, n) != n)
+			break;
+	}
+}
+
+void
+stopcd(void)
+{
+	cdread = 0;
+	cdloop = 0;
+}
+
+void
+pausecd(void)
+{
+	cdread = 0;
+}
+
+void
+resumecd(void)
+{
+	cdread = 1;
+}
+
+void
+shutcd(void)
+{
+	stopcd();
+}
+
+void
+stepcd(void)
+{
+	if(bgmvolume.value <= 0.0 || cdread == 0)
+		return;
+	cdread = bgmvolume.value > 0.0;
+}
+
+void
+playcd(int nt, int loop)
+{
+	if(ntrk < 1)
+		return;
+	nt -= 1;	/* d001 assumed part of track list */
+	if(nt < 1 || nt > ntrk){
+		Con_Printf("cd: invalid track number %d\n", nt);
+		return;
+	}
+	chtrk = nt;
+	cdloop = loop;
+	cdread = bgmvolume.value > 0.0;
+}
+
+static void
+cdcmd(void)
+{
+	char *c;
+
+	if(Cmd_Argc() < 2){
+usage:
+		Con_Printf("cd (play|loop|stop|pause|resume|info) [track]\n");
+		return;
+	}
+	c = Cmd_Argv(1);
+	if(cistrcmp(c, "play") == 0){
+		if(Cmd_Argc() < 3)
+			goto usage;
+		playcd(atoi(Cmd_Argv(2)), 0);
+	}else if(cistrcmp(c, "loop") == 0){
+		if(Cmd_Argc() < 3)
+			goto usage;
+		playcd(atoi(Cmd_Argv(2)), 1);
+	}else if(cistrcmp(c, "stop") == 0)
+		stopcd();
+	else if(cistrcmp(c, "pause") == 0)
+		pausecd();
+	else if(cistrcmp(c, "resume") == 0)
+		resumecd();
+	else if(cistrcmp(c, "info") == 0)
+		Con_Printf("track %d/%d; loop %d; vol %.1f\n", trk, ntrk, cdloop, bgmvolume.value);
+	else
+		goto usage;
+}
+
+static int
+cdinfo(void)
+{
+	int fd, i, n;
+	char type;
+	Reprog *pat;
+	Dir *d;
+
+	ntrk = 0;
+	if((fd = open("/mnt/cd", OREAD)) < 0)
+		return -1;
+	n = dirreadall(fd, &d);
+	close(fd);
+	if(n < 0)
+		return -1;
+	pat = regcomp("[au][0-9][0-9][0-9]");
+	for(type=0, i=0; i<n; i++)
+		if(regexec(pat, d[i].name, nil, 0)){
+			if(type == 0)
+				type = d[i].name[0];
+			ntrk++;
+		}
+	free(pat);
+	free(d);
+	if(ntrk < 1)
+		return -1;
+	snprint(cdfile, sizeof cdfile, "/mnt/cd/%c", type);
+	return 0;
+}
+
+int
+initcd(void)
+{
+	if(cdinfo() < 0){
+		fprint(2, "cdinfo: %r\n");
+		return -1;
+	}
+	if(proccreate(cproc, nil, 16384) < 0)
+		sysfatal("proccreate: %r");
+	Cvar_RegisterVariable(&bgmvolume);
+	Cmd_AddCommand("cd", cdcmd);
+	return 0;
+}