From: bellard Date: Tue, 9 Nov 2004 23:09:44 +0000 (+0000) Subject: audio clean up (initial patch by malc) X-Git-Tag: 0.10.0-0maemo1~5205 X-Git-Url: http://vcs.maemo.org/git/?a=commitdiff_plain;h=fb065187e4ee9e0d1709b344ec01bb426ff1e43b;p=qemu audio clean up (initial patch by malc) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1131 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/Makefile.target b/Makefile.target index 280ffa1..5982f08 100644 --- a/Makefile.target +++ b/Makefile.target @@ -1,9 +1,5 @@ include config.mak -#After enabling Adlib and/or FMOD rebuild QEMU from scratch -#Uncomment following for adlib support -#USE_ADLIB=1 - #Uncomment following and specify proper paths/names for FMOD support #USE_FMOD=1 #FMOD_INCLUDE=/net/include/fmod @@ -278,11 +274,18 @@ VL_OBJS=vl.o osdep.o block.o readline.o monitor.o pci.o console.o VL_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o SOUND_HW = sb16.o -AUDIODRV = audio.o ossaudio.o sdlaudio.o wavaudio.o +AUDIODRV = audio.o wavaudio.o +ifdef CONFIG_SDL +AUDIODRV += sdlaudio.o +endif +ifdef CONFIG_OSS +AUDIODRV += ossaudio.o +endif + +pc.o: DEFINES := -DUSE_SB16 $(DEFINES) -ifeq ($(USE_ADLIB),1) +ifdef CONFIG_ADLIB SOUND_HW += fmopl.o adlib.o -audio.o: DEFINES := -DUSE_ADLIB $(DEFINES) endif ifeq ($(USE_FMOD),1) diff --git a/audio/audio.c b/audio/audio.c index f55e1a2..ec77c25 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -22,62 +22,26 @@ * THE SOFTWARE. */ #include -#include #include "vl.h" -#define AUDIO_CAP "audio" -#include "audio/audio.h" - #define USE_SDL_AUDIO #define USE_WAV_AUDIO -#if defined __linux__ || (defined _BSD && !defined __APPLE__) -#define USE_OSS_AUDIO -#endif - -#ifdef USE_OSS_AUDIO -#include "audio/ossaudio.h" -#endif - -#ifdef USE_SDL_AUDIO -#include "audio/sdlaudio.h" -#endif - -#ifdef USE_WAV_AUDIO -#include "audio/wavaudio.h" -#endif +#include "audio/audio_int.h" -#ifdef USE_FMOD_AUDIO -#include "audio/fmodaudio.h" +#define dolog(...) AUD_log ("audio", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) #endif #define QC_AUDIO_DRV "QEMU_AUDIO_DRV" -#define QC_VOICES "QEMU_VOICES" +#define QC_VOICES "QEMU_VOICES" #define QC_FIXED_FORMAT "QEMU_FIXED_FORMAT" #define QC_FIXED_FREQ "QEMU_FIXED_FREQ" -extern void SB16_init (void); - -#ifdef USE_ADLIB -extern void Adlib_init (void); -#endif - -#ifdef USE_GUS -extern void GUS_init (void); -#endif - -static void (*hw_ctors[]) (void) = { - SB16_init, -#ifdef USE_ADLIB - Adlib_init, -#endif -#ifdef USE_GUS - GUS_init, -#endif - NULL -}; - -static HWVoice *hw_voice; +static HWVoice *hw_voices; AudioState audio_state = { 1, /* use fixed settings */ @@ -127,9 +91,10 @@ const char *audio_get_conf_str (const char *key, const char *defval) return val; } -void audio_log (const char *fmt, ...) +void AUD_log (const char *cap, const char *fmt, ...) { va_list ap; + fprintf (stderr, "%s: ", cap); va_start (ap, fmt); vfprintf (stderr, fmt, ap); va_end (ap); @@ -403,7 +368,7 @@ int pcm_hw_init (HWVoice *hw, int freq, int nchannels, audfmt_e fmt) static int dist (void *hw) { if (hw) { - return (((uint8_t *) hw - (uint8_t *) hw_voice) + return (((uint8_t *) hw - (uint8_t *) hw_voices) / audio_state.voice_size) + 1; } else { @@ -411,7 +376,7 @@ static int dist (void *hw) } } -#define ADVANCE(hw) hw ? advance (hw, audio_state.voice_size) : hw_voice +#define ADVANCE(hw) hw ? advance (hw, audio_state.voice_size) : hw_voices HWVoice *pcm_hw_find_any (HWVoice *hw) { @@ -648,6 +613,21 @@ SWVoice *AUD_open (SWVoice *sw, const char *name, return sw; } +void AUD_close (SWVoice *sw) +{ + if (!sw) + return; + + pcm_sw_fini (sw); + pcm_hw_del_sw (sw->hw, sw); + pcm_hw_gc (sw->hw); + if (sw->name) { + qemu_free (sw->name); + sw->name = NULL; + } + qemu_free (sw); +} + int AUD_write (SWVoice *sw, void *buf, int size) { int bytes; @@ -797,13 +777,13 @@ void AUD_enable (SWVoice *sw, int on) } static struct audio_output_driver *drvtab[] = { -#ifdef USE_OSS_AUDIO +#ifdef CONFIG_OSS &oss_output_driver, #endif #ifdef USE_FMOD_AUDIO &fmod_output_driver, #endif -#ifdef USE_SDL_AUDIO +#ifdef CONFIG_SDL &sdl_output_driver, #endif #ifdef USE_WAV_AUDIO @@ -821,8 +801,8 @@ static int voice_init (struct audio_output_driver *drv) drv->name, audio_state.nb_hw_voices, drv->max_voices); audio_state.nb_hw_voices = drv->max_voices; } - hw_voice = qemu_mallocz (audio_state.nb_hw_voices * drv->voice_size); - if (hw_voice) { + hw_voices = qemu_mallocz (audio_state.nb_hw_voices * drv->voice_size); + if (hw_voices) { audio_state.drv = drv; return 1; } @@ -928,8 +908,4 @@ void AUD_init (void) dolog ("Can not initialize audio subsystem\n"); return; } - - for (i = 0; hw_ctors[i]; i++) { - hw_ctors[i] (); - } } diff --git a/audio/audio.h b/audio/audio.h index 926a1ba..7520383 100644 --- a/audio/audio.h +++ b/audio/audio.h @@ -26,13 +26,6 @@ #include "mixeng.h" -#define dolog(...) fprintf (stderr, AUDIO_CAP ": " __VA_ARGS__) -#ifdef DEBUG -#define ldebug(...) dolog (__VA_ARGS__) -#else -#define ldebug(...) -#endif - typedef enum { AUD_FMT_U8, AUD_FMT_S8, @@ -40,130 +33,14 @@ typedef enum { AUD_FMT_S16 } audfmt_e; -typedef struct HWVoice HWVoice; -struct audio_output_driver; - -typedef struct AudioState { - int fixed_format; - int fixed_freq; - int fixed_channels; - int fixed_fmt; - int nb_hw_voices; - int voice_size; - int64_t ticks_threshold; - int freq_threshold; - void *opaque; - struct audio_output_driver *drv; -} AudioState; - -extern AudioState audio_state; - -typedef struct SWVoice { - int freq; - audfmt_e fmt; - int nchannels; - - int shift; - int align; - - t_sample *conv; - - int left; - int pos; - int bytes_per_second; - int64_t ratio; - st_sample_t *buf; - void *rate; - - int wpos; - int live; - int active; - int64_t old_ticks; - HWVoice *hw; - char *name; -} SWVoice; - -#define VOICE_ENABLE 1 -#define VOICE_DISABLE 2 - -struct pcm_ops { - int (*init) (HWVoice *hw, int freq, int nchannels, audfmt_e fmt); - void (*fini) (HWVoice *hw); - void (*run) (HWVoice *hw); - int (*write) (SWVoice *sw, void *buf, int size); - int (*ctl) (HWVoice *hw, int cmd, ...); -}; - -struct audio_output_driver { - const char *name; - void *(*init) (void); - void (*fini) (void *); - struct pcm_ops *pcm_ops; - int can_be_default; - int max_voices; - int voice_size; -}; - -struct HWVoice { - int active; - int enabled; - int pending_disable; - int valid; - int freq; - - f_sample *clip; - audfmt_e fmt; - int nchannels; - - int align; - int shift; - - int rpos; - int bufsize; - - int bytes_per_second; - st_sample_t *mix_buf; - - int samples; - int64_t old_ticks; - int nb_voices; - struct SWVoice **pvoice; - struct pcm_ops *pcm_ops; -}; - -void audio_log (const char *fmt, ...); -void pcm_sw_free_resources (SWVoice *sw); -int pcm_sw_alloc_resources (SWVoice *sw); -void pcm_sw_fini (SWVoice *sw); -int pcm_sw_init (SWVoice *sw, HWVoice *hw, int freq, - int nchannels, audfmt_e fmt); - -void pcm_hw_clear (HWVoice *hw, void *buf, int len); -HWVoice * pcm_hw_find_any (HWVoice *hw); -HWVoice * pcm_hw_find_any_active (HWVoice *hw); -HWVoice * pcm_hw_find_any_passive (HWVoice *hw); -HWVoice * pcm_hw_find_specific (HWVoice *hw, int freq, - int nchannels, audfmt_e fmt); -HWVoice * pcm_hw_add (int freq, int nchannels, audfmt_e fmt); -int pcm_hw_add_sw (HWVoice *hw, SWVoice *sw); -int pcm_hw_del_sw (HWVoice *hw, SWVoice *sw); -SWVoice * pcm_create_voice_pair (int freq, int nchannels, audfmt_e fmt); - -void pcm_hw_free_resources (HWVoice *hw); -int pcm_hw_alloc_resources (HWVoice *hw); -void pcm_hw_fini (HWVoice *hw); -void pcm_hw_gc (HWVoice *hw); -int pcm_hw_get_live (HWVoice *hw); -int pcm_hw_get_live2 (HWVoice *hw, int *nb_active); -void pcm_hw_dec_live (HWVoice *hw, int decr); -int pcm_hw_write (SWVoice *sw, void *buf, int len); - -int audio_get_conf_int (const char *key, int defval); -const char *audio_get_conf_str (const char *key, const char *defval); +typedef struct SWVoice SWVoice; -/* Public API */ SWVoice * AUD_open (SWVoice *sw, const char *name, int freq, int nchannels, audfmt_e fmt); +void AUD_init (void); +void AUD_log (const char *cap, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3)));; +void AUD_close (SWVoice *sw); int AUD_write (SWVoice *sw, void *pcm_buf, int size); void AUD_adjust (SWVoice *sw, int leftover); void AUD_reset (SWVoice *sw); diff --git a/audio/audio_int.h b/audio/audio_int.h new file mode 100644 index 0000000..599d3b0 --- /dev/null +++ b/audio/audio_int.h @@ -0,0 +1,161 @@ +/* + * QEMU Audio subsystem header + * + * Copyright (c) 2003-2004 Vassili Karpov (malc) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef QEMU_AUDIO_INT_H +#define QEMU_AUDIO_INT_H + +#include "vl.h" + +struct pcm_ops; + +typedef struct HWVoice { + int active; + int enabled; + int pending_disable; + int valid; + int freq; + + f_sample *clip; + audfmt_e fmt; + int nchannels; + + int align; + int shift; + + int rpos; + int bufsize; + + int bytes_per_second; + st_sample_t *mix_buf; + + int samples; + int64_t old_ticks; + int nb_voices; + struct SWVoice **pvoice; + struct pcm_ops *pcm_ops; +} HWVoice; + +extern struct pcm_ops oss_pcm_ops; +extern struct audio_output_driver oss_output_driver; + +extern struct pcm_ops sdl_pcm_ops; +extern struct audio_output_driver sdl_output_driver; + +extern struct pcm_ops wav_pcm_ops; +extern struct audio_output_driver wav_output_driver; + +extern struct pcm_ops fmod_pcm_ops; +extern struct audio_output_driver fmod_output_driver; + +struct audio_output_driver { + const char *name; + void *(*init) (void); + void (*fini) (void *); + struct pcm_ops *pcm_ops; + int can_be_default; + int max_voices; + int voice_size; +}; + +typedef struct AudioState { + int fixed_format; + int fixed_freq; + int fixed_channels; + int fixed_fmt; + int nb_hw_voices; + int voice_size; + int64_t ticks_threshold; + int freq_threshold; + void *opaque; + struct audio_output_driver *drv; +} AudioState; +extern AudioState audio_state; + +struct SWVoice { + int freq; + audfmt_e fmt; + int nchannels; + + int shift; + int align; + + t_sample *conv; + + int left; + int pos; + int bytes_per_second; + int64_t ratio; + st_sample_t *buf; + void *rate; + + int wpos; + int live; + int active; + int64_t old_ticks; + HWVoice *hw; + char *name; +}; + +struct pcm_ops { + int (*init) (HWVoice *hw, int freq, int nchannels, audfmt_e fmt); + void (*fini) (HWVoice *hw); + void (*run) (HWVoice *hw); + int (*write) (SWVoice *sw, void *buf, int size); + int (*ctl) (HWVoice *hw, int cmd, ...); +}; + +void pcm_sw_free_resources (SWVoice *sw); +int pcm_sw_alloc_resources (SWVoice *sw); +void pcm_sw_fini (SWVoice *sw); +int pcm_sw_init (SWVoice *sw, HWVoice *hw, int freq, + int nchannels, audfmt_e fmt); + +void pcm_hw_clear (HWVoice *hw, void *buf, int len); +HWVoice * pcm_hw_find_any (HWVoice *hw); +HWVoice * pcm_hw_find_any_active (HWVoice *hw); +HWVoice * pcm_hw_find_any_passive (HWVoice *hw); +HWVoice * pcm_hw_find_specific (HWVoice *hw, int freq, + int nchannels, audfmt_e fmt); +HWVoice * pcm_hw_add (int freq, int nchannels, audfmt_e fmt); +int pcm_hw_add_sw (HWVoice *hw, SWVoice *sw); +int pcm_hw_del_sw (HWVoice *hw, SWVoice *sw); +SWVoice * pcm_create_voice_pair (int freq, int nchannels, audfmt_e fmt); + +void pcm_hw_free_resources (HWVoice *hw); +int pcm_hw_alloc_resources (HWVoice *hw); +void pcm_hw_fini (HWVoice *hw); +void pcm_hw_gc (HWVoice *hw); +int pcm_hw_get_live (HWVoice *hw); +int pcm_hw_get_live2 (HWVoice *hw, int *nb_active); +void pcm_hw_dec_live (HWVoice *hw, int decr); +int pcm_hw_write (SWVoice *sw, void *buf, int len); + +int audio_get_conf_int (const char *key, int defval); +const char *audio_get_conf_str (const char *key, const char *defval); + +struct audio_output_driver; + +#define VOICE_ENABLE 1 +#define VOICE_DISABLE 2 + +#endif /* audio_int.h */ diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c index 7457033..8245f93 100644 --- a/audio/fmodaudio.c +++ b/audio/fmodaudio.c @@ -25,9 +25,22 @@ #include #include "vl.h" -#define AUDIO_CAP "fmod" -#include "audio/audio.h" -#include "audio/fmodaudio.h" +#include "audio/audio_int.h" + +typedef struct FMODVoice { + HWVoice hw; + unsigned int old_pos; + FSOUND_SAMPLE *fmod_sample; + int channel; +} FMODVoice; + + +#define dolog(...) AUD_log ("fmod", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif #define QC_FMOD_DRV "QEMU_FMOD_DRV" #define QC_FMOD_FREQ "QEMU_FMOD_FREQ" diff --git a/audio/fmodaudio.h b/audio/fmodaudio.h deleted file mode 100644 index 9f85c30..0000000 --- a/audio/fmodaudio.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QEMU FMOD audio output driver header - * - * Copyright (c) 2004 Vassili Karpov (malc) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef QEMU_FMODAUDIO_H -#define QEMU_FMODAUDIO_H - -#include - -typedef struct FMODVoice { - struct HWVoice hw; - unsigned int old_pos; - FSOUND_SAMPLE *fmod_sample; - int channel; -} FMODVoice; - -extern struct pcm_ops fmod_pcm_ops; -extern struct audio_output_driver fmod_output_driver; - -#endif /* fmodaudio.h */ diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 9fefaa3..6bf8cc4 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -21,20 +21,32 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - -/* Temporary kludge */ -#if defined __linux__ || (defined _BSD && !defined __APPLE__) -#include -#include "vl.h" - #include #include #include #include +#include +#include "vl.h" + +#include "audio/audio_int.h" + +typedef struct OSSVoice { + HWVoice hw; + void *pcm_buf; + int fd; + int nfrags; + int fragsize; + int mmapped; + int old_optr; +} OSSVoice; -#define AUDIO_CAP "oss" -#include "audio/audio.h" -#include "audio/ossaudio.h" + +#define dolog(...) AUD_log ("oss", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif #define QC_OSS_FRAGSIZE "QEMU_OSS_FRAGSIZE" #define QC_OSS_NFRAGS "QEMU_OSS_NFRAGS" @@ -463,4 +475,3 @@ struct audio_output_driver oss_output_driver = { INT_MAX, sizeof (OSSVoice) }; -#endif diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c index 4d75853..6103c45 100644 --- a/audio/sdlaudio.c +++ b/audio/sdlaudio.c @@ -25,9 +25,18 @@ #include #include "vl.h" -#define AUDIO_CAP "sdl" -#include "audio/audio.h" -#include "audio/sdlaudio.h" +#include "audio/audio_int.h" + +typedef struct SDLVoice { + HWVoice hw; +} SDLVoice; + +#define dolog(...) AUD_log ("sdl", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif #define QC_SDL_SAMPLES "QEMU_SDL_SAMPLES" diff --git a/audio/sdlaudio.h b/audio/sdlaudio.h deleted file mode 100644 index 380d0da..0000000 --- a/audio/sdlaudio.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QEMU SDL audio output driver header - * - * Copyright (c) 2004 Vassili Karpov (malc) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef QEMU_SDLAUDIO_H -#define QEMU_SDLAUDIO_H - -typedef struct SDLVoice { - struct HWVoice hw; -} SDLVoice; - -extern struct pcm_ops sdl_pcm_ops; -extern struct audio_output_driver sdl_output_driver; - -#endif /* sdlaudio.h */ diff --git a/audio/wavaudio.c b/audio/wavaudio.c index dee4a06..f8d6acb 100644 --- a/audio/wavaudio.c +++ b/audio/wavaudio.c @@ -23,9 +23,22 @@ */ #include "vl.h" -#define AUDIO_CAP "wav" -#include "audio/audio.h" -#include "audio/wavaudio.h" +#include "audio/audio_int.h" + +typedef struct WAVVoice { + HWVoice hw; + QEMUFile *f; + int64_t old_ticks; + void *pcm_buf; + int total_samples; +} WAVVoice; + +#define dolog(...) AUD_log ("wav", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif static struct { const char *wav_path; diff --git a/audio/wavaudio.h b/audio/wavaudio.h deleted file mode 100644 index 0b6070b..0000000 --- a/audio/wavaudio.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * QEMU WAV audio output driver header - * - * Copyright (c) 2004 Vassili Karpov (malc) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef QEMU_WAVAUDIO_H -#define QEMU_WAVAUDIO_H - -typedef struct WAVVoice { - struct HWVoice hw; - QEMUFile *f; - int64_t old_ticks; - void *pcm_buf; - int total_samples; -} WAVVoice; - -extern struct pcm_ops wav_pcm_ops; -extern struct audio_output_driver wav_output_driver; - -#endif /* wavaudio.h */ diff --git a/configure b/configure index 28cb708..9d45ab9 100755 --- a/configure +++ b/configure @@ -72,6 +72,8 @@ mingw32="no" EXESUF="" gdbstub="yes" slirp="yes" +adlib="no" +oss="no" # OS specific targetos=`uname -s` @@ -81,18 +83,23 @@ mingw32="yes" ;; FreeBSD) bsd="yes" +oss="yes" ;; NetBSD) bsd="yes" +oss="yes" ;; OpenBSD) bsd="yes" +oss="yes" ;; Darwin) bsd="yes" darwin="yes" ;; -*) ;; +*) +oss="yes" +;; esac if [ "$bsd" = "yes" ] ; then @@ -147,6 +154,8 @@ for opt do ;; --disable-slirp) slirp="no" ;; + --enable-adlib) adlib="yes" + ;; esac done @@ -316,6 +325,7 @@ echo "static build $static" echo "SDL support $sdl" echo "SDL static link $sdl_static" echo "mingw32 support $mingw32" +echo "Adlib support $adlib" if test $sdl_too_old = "yes"; then echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support" @@ -416,6 +426,14 @@ if test "$slirp" = "yes" ; then echo "CONFIG_SLIRP=yes" >> $config_mak echo "#define CONFIG_SLIRP 1" >> $config_h fi +if test "$adlib" = "yes" ; then + echo "CONFIG_ADLIB=yes" >> $config_mak + echo "#define CONFIG_ADLIB 1" >> $config_h +fi +if test "$oss" = "yes" ; then + echo "CONFIG_OSS=yes" >> $config_mak + echo "#define CONFIG_OSS 1" >> $config_h +fi echo -n "VERSION=" >>$config_mak head $source_path/VERSION >>$config_mak echo "" >>$config_mak diff --git a/hw/adlib.c b/hw/adlib.c index a49b32b..939a7ed 100644 --- a/hw/adlib.c +++ b/hw/adlib.c @@ -23,8 +23,12 @@ */ #include "vl.h" -#define AUDIO_CAP "adlib" -#include "audio/audio.h" +#define dolog(...) AUD_log ("adlib", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif #ifdef USE_YMF262 #define HAS_YMF262 1 diff --git a/hw/pc.c b/hw/pc.c index fbcd969..06ec7b1 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -555,8 +555,19 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, DMA_init(0); if (audio_enabled) { - /* no audio supported yet for win32 */ AUD_init(); +#ifdef USE_SB16 + if (sb16_enabled) + SB16_init (); +#endif +#ifdef CONFIG_ADLIB + if (adlib_enabled) + Adlib_init (); +#endif +#ifdef USE_GUS + if (gus_enabled) + GUS_init (); +#endif } floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table); diff --git a/hw/sb16.c b/hw/sb16.c index d932056..a94e689 100644 --- a/hw/sb16.c +++ b/hw/sb16.c @@ -23,12 +23,16 @@ */ #include "vl.h" -/* #define DEBUG */ -#define AUDIO_CAP "sb16" -#include "audio/audio.h" - #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) +#define dolog(...) AUD_log ("sb16", __VA_ARGS__) +#ifdef DEBUG +#define ldebug(...) dolog (__VA_ARGS__) +#else +#define ldebug(...) +#endif + +/* #define DEBUG */ /* #define DEBUG_SB16_MOST */ #define IO_READ_PROTO(name) \ @@ -511,7 +515,7 @@ static void command (SB16State *s, uint8_t cmd) return; warn: - dolog ("warning command %#x,%d is not trully understood yet\n", + dolog ("warning: command %#x,%d is not trully understood yet\n", cmd, s->needed_bytes); s->cmd = cmd; return; @@ -1172,8 +1176,10 @@ static int SB_load (QEMUFile *f, void *opaque, int version_id) qemu_get_be32s (f, &s->mixer_nreg); qemu_get_buffer (f, s->mixer_regs, 256); - if (s->voice) - AUD_reset (s->voice); + if (s->voice) { + AUD_close (s->voice); + s->voice = NULL; + } if (s->dma_running) { if (s->freq) diff --git a/vl.c b/vl.c index 6710e30..ec56f77 100644 --- a/vl.c +++ b/vl.c @@ -122,6 +122,9 @@ NetDriverState nd_table[MAX_NICS]; QEMUTimer *gui_timer; int vm_running; int audio_enabled = 0; +int sb16_enabled = 1; +int adlib_enabled = 1; +int gus_enabled = 1; int pci_enabled = 1; int prep_enabled = 0; int rtc_utc = 1; diff --git a/vl.h b/vl.h index 56927f3..268f72c 100644 --- a/vl.h +++ b/vl.h @@ -37,6 +37,7 @@ #include #include #include +#include "audio/audio.h" #ifndef O_LARGEFILE #define O_LARGEFILE 0 @@ -112,6 +113,9 @@ void qemu_system_shutdown_request(void); void main_loop_wait(int timeout); extern int audio_enabled; +extern int sb16_enabled; +extern int adlib_enabled; +extern int gus_enabled; extern int ram_size; extern int bios_size; extern int rtc_utc; @@ -554,8 +558,14 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table); int pmac_ide_init (BlockDriverState **hd_table, openpic_t *openpic, int irq); -/* audio.c */ -void AUD_init (void); +/* sb16.c */ +void SB16_init (void); + +/* adlib.c */ +void Adlib_init (void); + +/* gus.c */ +void GUS_init (void); /* dma.c */ typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);