$OpenBSD: patch-src_audio_cc,v 1.2 2009/12/20 00:35:23 jakemsr Exp $ --- src/audio.cc.orig Wed May 31 00:17:59 2000 +++ src/audio.cc Thu Dec 17 01:55:40 2009 @@ -32,6 +32,8 @@ // sound playback type definition #if defined(USE_ESD) #define ESD +#elif defined(USE_SNDIO) +#define SNDIO #else #if defined(__linux__) && defined(USE_ALSA) @@ -51,6 +53,8 @@ // include header file #ifdef ESD #include +#elif defined(SNDIO) +#include #else #ifdef __linux__ @@ -165,6 +169,11 @@ int Audio::openDevice() return 1; #elif defined(ESD) return 1; +#elif defined(SNDIO) + if ((hdl = sio_open(NULL, SIO_PLAY, 0)) == NULL) + return -1; + started = 0; + return 1; #else m_audiofd = open(m_audiodev, O_WRONLY); if (m_audiofd < 0) @@ -184,6 +193,8 @@ int Audio::closeDevice() if (!(m_audiofd < 0)) if (esd_close(m_audiofd) < 0) return -1; +#elif defined(SNDIO) + sio_close(hdl); #else if (close(m_audiofd) < 0) return -1; @@ -222,6 +233,15 @@ int Audio::setFormat(int bits, int encoding) return -1; #endif +#ifdef SNDIO + if (encoding != EN_LINEAR && encoding != EN_NONE) + return -1; + sio_initpar(&par); + par.bits = bits; + par.sig = bits == 8 ? 0 : 1; + par.le = SIO_LE_NATIVE; +#endif + #ifdef OSS if (encoding != EN_LINEAR && encoding != EN_NONE) return -1; @@ -232,7 +252,7 @@ int Audio::setFormat(int bits, int encoding) #endif #ifdef SUN - struct audio_info_t ainfo; + audio_info_t ainfo; AUDIO_INITINFO(&ainfo); @@ -270,8 +290,12 @@ int Audio::setChannels(int channels) return -1; #endif +#ifdef SNDIO + par.pchan = channels; +#endif + #ifdef SUN - struct audio_info_t ainfo; + audio_info_t ainfo; AUDIO_INITINFO(&ainfo); ainfo.play.channels = channels; @@ -299,8 +323,12 @@ int Audio::setSamplingRate(int rate) return -1; #endif +#ifdef SNDIO + par.rate = rate; +#endif + #ifdef SUN - struct audio_info_t ainfo; + audio_info_t ainfo; AUDIO_INITINFO(&ainfo); ainfo.play.sample_rate = rate; @@ -336,9 +364,21 @@ int Audio::output(char* buf, int size) } #endif +#ifdef SNDIO + if (!started) { + if (!sio_setpar(hdl, &par) || !sio_start(hdl)) { + printf("could not start sndio\n"); + return -1; + } + started = 1; + } +#endif + while (size > 0) { #ifdef ALSA ret = snd_pcm_write(m_audiopcm, buf, size); +#elif defined(SNDIO) + ret = sio_write(hdl, buf, size); #else ret = write(m_audiofd, buf, size); #endif