ports/misc/xcdroast/patches/patch-src_wavplay_c

127 lines
3.3 KiB
Text

--- src/wavplay.c.orig Wed Aug 20 17:34:02 2008
+++ src/wavplay.c Fri Jun 26 19:47:07 2015
@@ -31,7 +31,10 @@
# include <sys/soundcard.h>
# include <sys/ioctl.h>
#endif
-#if defined(sun) || defined(__OpenBSD__)
+#if defined(__OpenBSD__)
+# include <sndio.h>
+#endif
+#if defined(sun)
# include <sys/ioctl.h>
# include <sys/audioio.h>
#endif
@@ -74,6 +77,8 @@ off_t is_std_wav_file(int f, off_t *offset);
#if defined(linux) || defined(__FreeBSD__)
#define DEFAULT_AUDIO_DEVICE "/dev/dsp"
+#elif defined(__OpenBSD__)
+#define DEFAULT_AUDIO_DEVICE SIO_DEVANY
#elif defined (aix)
#define DEFAULT_AUDIO_DEVICE ""
#elif defined(__sgi)
@@ -360,8 +365,50 @@ gint flags;
#endif
-#if defined(sun) || defined(__OpenBSD__)
+#if defined(__OpenBSD__)
+static struct sio_hdl *audio_hdl = NULL;
+
+/* open the sound-device of sndio and set cd-quality */
+gint open_sndio_audio(gchar *dev) {
+ struct sio_par par;
+
+ /* First try open with O_NONBLOCK so it doesn't hang */
+ if ((audio_hdl = sio_open(dev, SIO_PLAY, 0)) == NULL) {
+ g_warning("Unable to open audio device\n");
+ return -1;
+ }
+ sio_initpar(&par);
+ par.rate = 44100;
+ par.pchan = 2;
+ par.bits = 16;
+ par.le = SIO_LE_NATIVE;
+ par.appbufsz = DEFAULT_BUFFER_SIZE;
+
+ if (!sio_setpar(audio_hdl, &par) || !sio_getpar(audio_hdl, &par)) {
+ g_warning("Unable to set audio parameters\n");
+ goto bad;
+ }
+ if (par.rate != 44100 || par.pchan != 2 || par.bits != 16 ||
+ par.le != SIO_LE_NATIVE) {
+ g_warning("Unsupported audio parameters\n");
+ goto bad;
+ }
+ if (!sio_start(audio_hdl)) {
+ g_warning("Couldn't start audio\n");
+ goto bad;
+ }
+ abuf_size = par.appbufsz;
+ return 0;
+bad:
+ sio_close(audio_hdl);
+ audio_hdl = NULL;
+ return -1;
+}
+#endif
+
+#if defined(sun)
+
/* open the sound-device of solaris and set cd-quality */
gint open_solaris_audio(gchar *dev) {
@@ -387,9 +434,7 @@ gint flags;
info.play.precision = 16;
info.play.encoding = AUDIO_ENCODING_LINEAR;
info.play.buffer_size = abuf_size;
-#ifndef __OpenBSD__
info.output_muted = 0;
-#endif
if (ioctl(audio, AUDIO_SETINFO, &info) == -1) {
g_warning("Unable to set audio parameters\n");
@@ -790,7 +835,10 @@ gchar keybuffer[MAXLINE];
#if defined(linux) || defined(__FreeBSD__)
audio = open_linux_audio(audio_dev);
#endif
-#if defined(sun) || defined(__OpenBSD__)
+#if defined(__OpenBSD__)
+ audio = open_sndio_audio(audio_dev);
+#endif
+#if defined(sun)
audio = open_solaris_audio(audio_dev);
#endif
#ifdef aix
@@ -820,7 +868,7 @@ gchar keybuffer[MAXLINE];
fd = open (wavname, O_RDONLY, 0);
if (fd == -1) {
-#if !(defined(__MACH__) && defined(__APPLE__))
+#if !(defined(__MACH__) && defined(__APPLE__)) && !defined(__OpenBSD__)
close(audio);
#endif
g_warning("Can't open wav-file\n");
@@ -934,6 +982,11 @@ gchar keybuffer[MAXLINE];
#if (defined(__MACH__) && defined(__APPLE__))
audio_write(audiobuf,l);
+#elif defined(__OpenBSD__)
+ if (sio_write(audio_hdl, audiobuf, l) != l) {
+ g_print("write error to audio-device\n");
+ exit(-1);
+ }
#elif defined(__sgi)
write_irix_audio(audiobuf, l);
#else
@@ -975,6 +1028,8 @@ gchar keybuffer[MAXLINE];
#if (defined(__MACH__) && defined(__APPLE__))
audio_close();
+#elif defined(__OpenBSD__)
+ sio_close(audio_hdl);
#elif defined(__sgi)
close_irix_audio();
#else