diff --git a/Makefile b/Makefile index 35a282c9a7..6a1967aace 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,10 @@ endif ifeq ($(HAVE_OSS), 1) OBJ += audio/oss.o endif +ifeq ($(HAVE_OSS_BSD), 1) + OBJ += audio/oss.o + LIBS += -lossaudio +endif ifeq ($(HAVE_ALSA), 1) OBJ += audio/alsa.o LIBS += -lasound diff --git a/audio/oss.c b/audio/oss.c index e794d6a9ef..272de6405e 100644 --- a/audio/oss.c +++ b/audio/oss.c @@ -15,28 +15,43 @@ * If not, see . */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "driver.h" #include + +#ifdef HAVE_OSS_BSD +#include +#else #include +#endif + #include #include #include #include #include +#ifdef HAVE_OSS_BSD +#define DEFAULT_OSS_DEV "/dev/audio" +#else +#define DEFAULT_OSS_DEV "/dev/dsp" +#endif + static void* __oss_init(const char* device, unsigned rate, unsigned latency) { int *fd = calloc(1, sizeof(int)); - if ( fd == NULL ) + if (fd == NULL) return NULL; - const char *oss_device = "/dev/dsp"; + const char *oss_device = DEFAULT_OSS_DEV; - if ( device != NULL ) + if (device != NULL) oss_device = device; - if ( (*fd = open(oss_device, O_WRONLY)) < 0 ) + if ((*fd = open(oss_device, O_WRONLY)) < 0) { free(fd); return NULL; @@ -45,7 +60,7 @@ static void* __oss_init(const char* device, unsigned rate, unsigned latency) int frags = (latency * rate * 4)/(1000 * (1 << 9)); int frag = (frags << 16) | 9; - if ( ioctl(*fd, SNDCTL_DSP_SETFRAGMENT, &frag) < 0 ) + if (ioctl(*fd, SNDCTL_DSP_SETFRAGMENT, &frag) < 0) { close(*fd); free(fd); @@ -55,21 +70,21 @@ static void* __oss_init(const char* device, unsigned rate, unsigned latency) int channels = 2; int format = AFMT_S16_LE; - if ( ioctl(*fd, SNDCTL_DSP_CHANNELS, &channels) < 0 ) + if (ioctl(*fd, SNDCTL_DSP_CHANNELS, &channels) < 0) { close(*fd); free(fd); return NULL; } - if ( ioctl(*fd, SNDCTL_DSP_SETFMT, &format) < 0 ) + if (ioctl(*fd, SNDCTL_DSP_SETFMT, &format) < 0) { close(*fd); free(fd); return NULL; } - if ( ioctl(*fd, SNDCTL_DSP_SPEED, &rate) < 0 ) + if (ioctl(*fd, SNDCTL_DSP_SPEED, &rate) < 0) { close(*fd); free(fd); @@ -83,13 +98,13 @@ static ssize_t __oss_write(void* data, const void* buf, size_t size) { int *fd = data; - if ( size == 0 ) + if (size == 0) return 0; ssize_t ret; - if ( (ret = write(*fd, buf, size)) <= 0 ) + if ((ret = write(*fd, buf, size)) <= 0) { - if ( (fcntl(*fd, F_GETFL) & O_NONBLOCK) && errno == EAGAIN ) + if ((fcntl(*fd, F_GETFL) & O_NONBLOCK) && errno == EAGAIN) return 0; return -1; } @@ -139,9 +154,4 @@ const audio_driver_t audio_oss = { .free = __oss_free, .ident = "oss" }; - - - - - diff --git a/config.features.h b/config.features.h index d1a8d2d209..6ee4111eef 100644 --- a/config.features.h +++ b/config.features.h @@ -20,7 +20,7 @@ static const bool _alsa_supp = true; static const bool _alsa_supp = false; #endif -#ifdef HAVE_OSS +#if defined(HAVE_OSS) || defined(HAVE_OSS_BSD) static const bool _oss_supp = true; #else static const bool _oss_supp = false; diff --git a/driver.c b/driver.c index 4cc7518173..89cbaedc3b 100644 --- a/driver.c +++ b/driver.c @@ -32,7 +32,7 @@ static const audio_driver_t *audio_drivers[] = { #ifdef HAVE_ALSA &audio_alsa, #endif -#ifdef HAVE_OSS +#if defined(HAVE_OSS) || defined(HAVE_OSS_BSD) &audio_oss, #endif #ifdef HAVE_RSOUND diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 04410b9e6f..f78ad11852 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -26,6 +26,12 @@ check_lib NETPLAY -lc socket check_lib ALSA -lasound snd_pcm_open check_header OSS sys/soundcard.h +check_header OSS_BSD soundcard.h +check_lib OSS_LIB -lossaudio + +if [ "$HAVE_OSS_BSD" = "yes" ]; then + check_critical OSS_LIB "Have BSD-style OSS, but -lossaudio is not present." +fi if [ "$OS" = "Darwin" ]; then check_lib AL "-framework OpenAL" alcOpenDevice @@ -72,7 +78,7 @@ check_lib STRL -lc strlcpy check_pkgconf PYTHON python3 # Creates config.mk and config.h. -VARS="ALSA OSS AL RSOUND ROAR JACK PULSE SDL DYLIB CG XML SDL_IMAGE DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE SRC CONFIGFILE FREETYPE XVIDEO NETPLAY FBO STRL PYTHON" +VARS="ALSA OSS OSS_BSD AL RSOUND ROAR JACK PULSE SDL DYLIB CG XML SDL_IMAGE DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE SRC CONFIGFILE FREETYPE XVIDEO NETPLAY FBO STRL PYTHON" create_config_make config.mk $VARS create_config_header config.h $VARS diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 36b6f5b689..131d8314db 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -41,9 +41,13 @@ check_lib() eval tmpval=\$$tmpval [ "$tmpval" = "no" ] && return 0 - echo -n "Checking function $3 in $2 ... " - echo "void $3(void); int main(void) { $3(); return 0; }" > $TEMP_C - + if [ -z "$3" ]; then + echo -n "Checking existence of $2 ..." + echo "int main(void) { return 0; }" > $TEMP_C + else + echo -n "Checking function $3 in $2 ... " + echo "void $3(void); int main(void) { $3(); return 0; }" > $TEMP_C + fi eval HAVE_$1=no answer=no @@ -67,8 +71,13 @@ check_lib_cxx() eval tmpval=\$$tmpval [ "$tmpval" = "no" ] && return 0 - echo -n "Checking function $3 in $2 ... " - echo "extern \"C\" { void $3(void); } int main() { $3(); }" > $TEMP_CXX + if [ -z "$3" ]; then + echo -n "Checking existence of $2 ..." + echo "int main(void) { return 0; }" > $TEMP_C + else + echo -n "Checking function $3 in $2 ... " + echo "extern \"C\" { void $3(void); } int main() { $3(); }" > $TEMP_CXX + fi eval HAVE_$1=no answer=no