diff --git a/bochs/config.h.in b/bochs/config.h.in index 4b0a17657..3cffc78bd 100644 --- a/bochs/config.h.in +++ b/bochs/config.h.in @@ -850,12 +850,13 @@ typedef #define BX_SUPPORT_SOUNDLOW 0 #if BX_SUPPORT_SOUNDLOW -// Determines which sound lowlevel class is to be used. +// Determines which sound lowlevel class is to be used as the default. // Currently the following are available: +// bx_sound_alsa_c Output for Linux with ALSA PCM and sequencer interface // bx_sound_linux_c Output for Linux, to /dev/dsp and /dev/midi00 -// or ALSA PCM and sequencer interface // bx_sound_windows_c Output for Windows midi and wave mappers // bx_sound_osx_c Output for MacOSX midi and wave device +// bx_sound_sdl_c Wave output with SDL // bx_sound_lowlevel_c Dummy functions, no output #define BX_SOUND_LOWLEVEL_C bx_sound_lowlevel_c // Use ALSA sound interface on Linux diff --git a/bochs/configure.in b/bochs/configure.in index b1ce5b43e..3588fb11e 100644 --- a/bochs/configure.in +++ b/bochs/configure.in @@ -1767,6 +1767,8 @@ AC_SUBST(CDROM_OBJS) SOUNDCARD_OBJS='' SOUNDLOW_OBJS='' GAME_OBJS='' +soundlow_drivers='' +soundlow_default='' soundcard_present=0 gameport_present=0 AC_MSG_CHECKING(for Sound Blaster 16 support) @@ -1814,17 +1816,20 @@ AC_ARG_ENABLE(es1370, ) if test "$soundcard_present" = 1; then - AC_MSG_CHECKING(for sound lowlevel module) AC_DEFINE(BX_SUPPORT_SOUNDLOW, 1) case "$target" in *-linux* | *-freebsd*) SOUNDLOW_OBJS='soundlnx.o' AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_linux_c) - AC_MSG_RESULT(linux) + soundlow_drivers="oss" + soundlow_default="oss" bx_have_alsa=0 AC_CHECK_HEADER([alsa/asoundlib.h], [bx_have_alsa=1]) if test "$bx_have_alsa" = 1; then SOUNDLOW_OBJS="$SOUNDLOW_OBJS soundalsa.o" + AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_alsa_c) + soundlow_default="alsa" + soundlow_drivers="alsa $soundlow_drivers" AC_DEFINE(BX_HAVE_ALSASOUND, 1) if test "$bx_plugins" = 1; then SOUND_LINK_OPTS="$SOUND_LINK_OPTS -lasound" @@ -1837,40 +1842,47 @@ if test "$soundcard_present" = 1; then SOUNDLOW_OBJS='soundwin.o' AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_windows_c) DEVICE_LINK_OPTS="$DEVICE_LINK_OPTS winmm.lib" - AC_MSG_RESULT(win) + soundlow_drivers="win" + soundlow_default="win" ;; *-cygwin* | *-mingw32*) SOUNDLOW_OBJS='soundwin.o' AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_windows_c) DEVICE_LINK_OPTS="$DEVICE_LINK_OPTS -lwinmm" - AC_MSG_RESULT(win) + soundlow_drivers="win" + soundlow_default="win" ;; *-macosx* | *-macos* | *-apple-darwin*) SOUNDLOW_OBJS='soundosx.o' AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_osx_c) DEVICE_LINK_OPTS="$DEVICE_LINK_OPTS -framework CoreServices -framework AudioUnit -framework AudioToolbox" - AC_MSG_RESULT(osx) + soundlow_drivers="osx" + soundlow_default="osx" ;; *) SOUNDLOW_OBJS='' AC_DEFINE(BX_SOUND_LOWLEVEL_C, bx_sound_lowlevel_c) - AC_MSG_RESULT(dummy) + soundlow_default="dummy" ;; esac - AC_MSG_CHECKING(for additional sound lowlevel modules) if test "$with_sdl" = yes; then SOUNDLOW_OBJS="$SOUNDLOW_OBJS soundsdl.o" if test "$bx_plugins" = 1; then SOUND_LINK_OPTS="$SOUND_LINK_OPTS `sdl-config --libs`" fi - AC_MSG_RESULT(sdl) - else - AC_MSG_RESULT(none) + soundlow_drivers="$soundlow_drivers sdl" + if test "$soundlow_default" = "dummy"; then + soundlow_default="sdl" + fi fi if test "$bx_plugins" = 0; then SOUND_LIB_VAR='iodev/sound/libsound.a' AC_SUBST(SOUND_LIB_VAR) fi + AC_MSG_CHECKING(for sound lowlevel modules) + AC_MSG_RESULT($soundlow_drivers) + AC_MSG_CHECKING(for default sound lowlevel module) + AC_MSG_RESULT($soundlow_default) else AC_DEFINE(BX_SUPPORT_SOUNDLOW, 0) fi diff --git a/bochs/iodev/sound/soundlnx.cc b/bochs/iodev/sound/soundlnx.cc index 3a5ffdaec..6a8c2d195 100644 --- a/bochs/iodev/sound/soundlnx.cc +++ b/bochs/iodev/sound/soundlnx.cc @@ -193,8 +193,11 @@ int bx_sound_linux_c::startwaveplayback(int frequency, int bits, bx_bool stereo, int bx_sound_linux_c::sendwavepacket(int length, Bit8u data[]) { - int ret = write(wave_fd[0], data, length); + if (wave_fd[0] == -1) { + return BX_SOUNDLOW_ERR; + } + int ret = write(wave_fd[0], data, length); if (ret == length) { return BX_SOUNDLOW_OK; } else { diff --git a/bochs/iodev/sound/soundmod.cc b/bochs/iodev/sound/soundmod.cc index 379c6bb44..aaf597c26 100644 --- a/bochs/iodev/sound/soundmod.cc +++ b/bochs/iodev/sound/soundmod.cc @@ -138,7 +138,7 @@ void beep_thread(void *indata) #endif { Bit8u level; - int i, j; + int i, j, ret; bx_sound_lowlevel_c *soundmod = (bx_sound_lowlevel_c*)indata; level = 0x40; @@ -149,7 +149,8 @@ void beep_thread(void *indata) beep_buffer[j++] = level; if ((++i % beep_bytes) == 0) level ^= 0x40; } while (j < beep_bufsize); - soundmod->sendwavepacket(beep_bufsize, beep_buffer); + ret = soundmod->sendwavepacket(beep_bufsize, beep_buffer); + if (ret == BX_SOUNDLOW_ERR) break; if (soundmod->get_type() == BX_SOUNDLOW_WIN) { #ifdef WIN32 Sleep(100);