Commit fb065187e4ee9e0d1709b344ec01bb426ff1e43b

Authored by bellard
1 parent bf71c9d9

audio clean up (initial patch by malc)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1131 c046a42c-6fe2-441c-8c8c-71466251a162
Makefile.target
1 include config.mak 1 include config.mak
2 2
3 -#After enabling Adlib and/or FMOD rebuild QEMU from scratch  
4 -#Uncomment following for adlib support  
5 -#USE_ADLIB=1  
6 -  
7 #Uncomment following and specify proper paths/names for FMOD support 3 #Uncomment following and specify proper paths/names for FMOD support
8 #USE_FMOD=1 4 #USE_FMOD=1
9 #FMOD_INCLUDE=/net/include/fmod 5 #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 @@ -278,11 +274,18 @@ VL_OBJS=vl.o osdep.o block.o readline.o monitor.o pci.o console.o
278 VL_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o 274 VL_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o
279 275
280 SOUND_HW = sb16.o 276 SOUND_HW = sb16.o
281 -AUDIODRV = audio.o ossaudio.o sdlaudio.o wavaudio.o 277 +AUDIODRV = audio.o wavaudio.o
  278 +ifdef CONFIG_SDL
  279 +AUDIODRV += sdlaudio.o
  280 +endif
  281 +ifdef CONFIG_OSS
  282 +AUDIODRV += ossaudio.o
  283 +endif
  284 +
  285 +pc.o: DEFINES := -DUSE_SB16 $(DEFINES)
282 286
283 -ifeq ($(USE_ADLIB),1) 287 +ifdef CONFIG_ADLIB
284 SOUND_HW += fmopl.o adlib.o 288 SOUND_HW += fmopl.o adlib.o
285 -audio.o: DEFINES := -DUSE_ADLIB $(DEFINES)  
286 endif 289 endif
287 290
288 ifeq ($(USE_FMOD),1) 291 ifeq ($(USE_FMOD),1)
audio/audio.c
@@ -22,62 +22,26 @@ @@ -22,62 +22,26 @@
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 #include <assert.h> 24 #include <assert.h>
25 -#include <limits.h>  
26 #include "vl.h" 25 #include "vl.h"
27 26
28 -#define AUDIO_CAP "audio"  
29 -#include "audio/audio.h"  
30 -  
31 #define USE_SDL_AUDIO 27 #define USE_SDL_AUDIO
32 #define USE_WAV_AUDIO 28 #define USE_WAV_AUDIO
33 29
34 -#if defined __linux__ || (defined _BSD && !defined __APPLE__)  
35 -#define USE_OSS_AUDIO  
36 -#endif  
37 -  
38 -#ifdef USE_OSS_AUDIO  
39 -#include "audio/ossaudio.h"  
40 -#endif  
41 -  
42 -#ifdef USE_SDL_AUDIO  
43 -#include "audio/sdlaudio.h"  
44 -#endif  
45 -  
46 -#ifdef USE_WAV_AUDIO  
47 -#include "audio/wavaudio.h"  
48 -#endif 30 +#include "audio/audio_int.h"
49 31
50 -#ifdef USE_FMOD_AUDIO  
51 -#include "audio/fmodaudio.h" 32 +#define dolog(...) AUD_log ("audio", __VA_ARGS__)
  33 +#ifdef DEBUG
  34 +#define ldebug(...) dolog (__VA_ARGS__)
  35 +#else
  36 +#define ldebug(...)
52 #endif 37 #endif
53 38
54 #define QC_AUDIO_DRV "QEMU_AUDIO_DRV" 39 #define QC_AUDIO_DRV "QEMU_AUDIO_DRV"
55 -#define QC_VOICES "QEMU_VOICES" 40 +#define QC_VOICES "QEMU_VOICES"
56 #define QC_FIXED_FORMAT "QEMU_FIXED_FORMAT" 41 #define QC_FIXED_FORMAT "QEMU_FIXED_FORMAT"
57 #define QC_FIXED_FREQ "QEMU_FIXED_FREQ" 42 #define QC_FIXED_FREQ "QEMU_FIXED_FREQ"
58 43
59 -extern void SB16_init (void);  
60 -  
61 -#ifdef USE_ADLIB  
62 -extern void Adlib_init (void);  
63 -#endif  
64 -  
65 -#ifdef USE_GUS  
66 -extern void GUS_init (void);  
67 -#endif  
68 -  
69 -static void (*hw_ctors[]) (void) = {  
70 - SB16_init,  
71 -#ifdef USE_ADLIB  
72 - Adlib_init,  
73 -#endif  
74 -#ifdef USE_GUS  
75 - GUS_init,  
76 -#endif  
77 - NULL  
78 -};  
79 -  
80 -static HWVoice *hw_voice; 44 +static HWVoice *hw_voices;
81 45
82 AudioState audio_state = { 46 AudioState audio_state = {
83 1, /* use fixed settings */ 47 1, /* use fixed settings */
@@ -127,9 +91,10 @@ const char *audio_get_conf_str (const char *key, const char *defval) @@ -127,9 +91,10 @@ const char *audio_get_conf_str (const char *key, const char *defval)
127 return val; 91 return val;
128 } 92 }
129 93
130 -void audio_log (const char *fmt, ...) 94 +void AUD_log (const char *cap, const char *fmt, ...)
131 { 95 {
132 va_list ap; 96 va_list ap;
  97 + fprintf (stderr, "%s: ", cap);
133 va_start (ap, fmt); 98 va_start (ap, fmt);
134 vfprintf (stderr, fmt, ap); 99 vfprintf (stderr, fmt, ap);
135 va_end (ap); 100 va_end (ap);
@@ -403,7 +368,7 @@ int pcm_hw_init (HWVoice *hw, int freq, int nchannels, audfmt_e fmt) @@ -403,7 +368,7 @@ int pcm_hw_init (HWVoice *hw, int freq, int nchannels, audfmt_e fmt)
403 static int dist (void *hw) 368 static int dist (void *hw)
404 { 369 {
405 if (hw) { 370 if (hw) {
406 - return (((uint8_t *) hw - (uint8_t *) hw_voice) 371 + return (((uint8_t *) hw - (uint8_t *) hw_voices)
407 / audio_state.voice_size) + 1; 372 / audio_state.voice_size) + 1;
408 } 373 }
409 else { 374 else {
@@ -411,7 +376,7 @@ static int dist (void *hw) @@ -411,7 +376,7 @@ static int dist (void *hw)
411 } 376 }
412 } 377 }
413 378
414 -#define ADVANCE(hw) hw ? advance (hw, audio_state.voice_size) : hw_voice 379 +#define ADVANCE(hw) hw ? advance (hw, audio_state.voice_size) : hw_voices
415 380
416 HWVoice *pcm_hw_find_any (HWVoice *hw) 381 HWVoice *pcm_hw_find_any (HWVoice *hw)
417 { 382 {
@@ -648,6 +613,21 @@ SWVoice *AUD_open (SWVoice *sw, const char *name, @@ -648,6 +613,21 @@ SWVoice *AUD_open (SWVoice *sw, const char *name,
648 return sw; 613 return sw;
649 } 614 }
650 615
  616 +void AUD_close (SWVoice *sw)
  617 +{
  618 + if (!sw)
  619 + return;
  620 +
  621 + pcm_sw_fini (sw);
  622 + pcm_hw_del_sw (sw->hw, sw);
  623 + pcm_hw_gc (sw->hw);
  624 + if (sw->name) {
  625 + qemu_free (sw->name);
  626 + sw->name = NULL;
  627 + }
  628 + qemu_free (sw);
  629 +}
  630 +
651 int AUD_write (SWVoice *sw, void *buf, int size) 631 int AUD_write (SWVoice *sw, void *buf, int size)
652 { 632 {
653 int bytes; 633 int bytes;
@@ -797,13 +777,13 @@ void AUD_enable (SWVoice *sw, int on) @@ -797,13 +777,13 @@ void AUD_enable (SWVoice *sw, int on)
797 } 777 }
798 778
799 static struct audio_output_driver *drvtab[] = { 779 static struct audio_output_driver *drvtab[] = {
800 -#ifdef USE_OSS_AUDIO 780 +#ifdef CONFIG_OSS
801 &oss_output_driver, 781 &oss_output_driver,
802 #endif 782 #endif
803 #ifdef USE_FMOD_AUDIO 783 #ifdef USE_FMOD_AUDIO
804 &fmod_output_driver, 784 &fmod_output_driver,
805 #endif 785 #endif
806 -#ifdef USE_SDL_AUDIO 786 +#ifdef CONFIG_SDL
807 &sdl_output_driver, 787 &sdl_output_driver,
808 #endif 788 #endif
809 #ifdef USE_WAV_AUDIO 789 #ifdef USE_WAV_AUDIO
@@ -821,8 +801,8 @@ static int voice_init (struct audio_output_driver *drv) @@ -821,8 +801,8 @@ static int voice_init (struct audio_output_driver *drv)
821 drv->name, audio_state.nb_hw_voices, drv->max_voices); 801 drv->name, audio_state.nb_hw_voices, drv->max_voices);
822 audio_state.nb_hw_voices = drv->max_voices; 802 audio_state.nb_hw_voices = drv->max_voices;
823 } 803 }
824 - hw_voice = qemu_mallocz (audio_state.nb_hw_voices * drv->voice_size);  
825 - if (hw_voice) { 804 + hw_voices = qemu_mallocz (audio_state.nb_hw_voices * drv->voice_size);
  805 + if (hw_voices) {
826 audio_state.drv = drv; 806 audio_state.drv = drv;
827 return 1; 807 return 1;
828 } 808 }
@@ -928,8 +908,4 @@ void AUD_init (void) @@ -928,8 +908,4 @@ void AUD_init (void)
928 dolog ("Can not initialize audio subsystem\n"); 908 dolog ("Can not initialize audio subsystem\n");
929 return; 909 return;
930 } 910 }
931 -  
932 - for (i = 0; hw_ctors[i]; i++) {  
933 - hw_ctors[i] ();  
934 - }  
935 } 911 }
audio/audio.h
@@ -26,13 +26,6 @@ @@ -26,13 +26,6 @@
26 26
27 #include "mixeng.h" 27 #include "mixeng.h"
28 28
29 -#define dolog(...) fprintf (stderr, AUDIO_CAP ": " __VA_ARGS__)  
30 -#ifdef DEBUG  
31 -#define ldebug(...) dolog (__VA_ARGS__)  
32 -#else  
33 -#define ldebug(...)  
34 -#endif  
35 -  
36 typedef enum { 29 typedef enum {
37 AUD_FMT_U8, 30 AUD_FMT_U8,
38 AUD_FMT_S8, 31 AUD_FMT_S8,
@@ -40,130 +33,14 @@ typedef enum { @@ -40,130 +33,14 @@ typedef enum {
40 AUD_FMT_S16 33 AUD_FMT_S16
41 } audfmt_e; 34 } audfmt_e;
42 35
43 -typedef struct HWVoice HWVoice;  
44 -struct audio_output_driver;  
45 -  
46 -typedef struct AudioState {  
47 - int fixed_format;  
48 - int fixed_freq;  
49 - int fixed_channels;  
50 - int fixed_fmt;  
51 - int nb_hw_voices;  
52 - int voice_size;  
53 - int64_t ticks_threshold;  
54 - int freq_threshold;  
55 - void *opaque;  
56 - struct audio_output_driver *drv;  
57 -} AudioState;  
58 -  
59 -extern AudioState audio_state;  
60 -  
61 -typedef struct SWVoice {  
62 - int freq;  
63 - audfmt_e fmt;  
64 - int nchannels;  
65 -  
66 - int shift;  
67 - int align;  
68 -  
69 - t_sample *conv;  
70 -  
71 - int left;  
72 - int pos;  
73 - int bytes_per_second;  
74 - int64_t ratio;  
75 - st_sample_t *buf;  
76 - void *rate;  
77 -  
78 - int wpos;  
79 - int live;  
80 - int active;  
81 - int64_t old_ticks;  
82 - HWVoice *hw;  
83 - char *name;  
84 -} SWVoice;  
85 -  
86 -#define VOICE_ENABLE 1  
87 -#define VOICE_DISABLE 2  
88 -  
89 -struct pcm_ops {  
90 - int (*init) (HWVoice *hw, int freq, int nchannels, audfmt_e fmt);  
91 - void (*fini) (HWVoice *hw);  
92 - void (*run) (HWVoice *hw);  
93 - int (*write) (SWVoice *sw, void *buf, int size);  
94 - int (*ctl) (HWVoice *hw, int cmd, ...);  
95 -};  
96 -  
97 -struct audio_output_driver {  
98 - const char *name;  
99 - void *(*init) (void);  
100 - void (*fini) (void *);  
101 - struct pcm_ops *pcm_ops;  
102 - int can_be_default;  
103 - int max_voices;  
104 - int voice_size;  
105 -};  
106 -  
107 -struct HWVoice {  
108 - int active;  
109 - int enabled;  
110 - int pending_disable;  
111 - int valid;  
112 - int freq;  
113 -  
114 - f_sample *clip;  
115 - audfmt_e fmt;  
116 - int nchannels;  
117 -  
118 - int align;  
119 - int shift;  
120 -  
121 - int rpos;  
122 - int bufsize;  
123 -  
124 - int bytes_per_second;  
125 - st_sample_t *mix_buf;  
126 -  
127 - int samples;  
128 - int64_t old_ticks;  
129 - int nb_voices;  
130 - struct SWVoice **pvoice;  
131 - struct pcm_ops *pcm_ops;  
132 -};  
133 -  
134 -void audio_log (const char *fmt, ...);  
135 -void pcm_sw_free_resources (SWVoice *sw);  
136 -int pcm_sw_alloc_resources (SWVoice *sw);  
137 -void pcm_sw_fini (SWVoice *sw);  
138 -int pcm_sw_init (SWVoice *sw, HWVoice *hw, int freq,  
139 - int nchannels, audfmt_e fmt);  
140 -  
141 -void pcm_hw_clear (HWVoice *hw, void *buf, int len);  
142 -HWVoice * pcm_hw_find_any (HWVoice *hw);  
143 -HWVoice * pcm_hw_find_any_active (HWVoice *hw);  
144 -HWVoice * pcm_hw_find_any_passive (HWVoice *hw);  
145 -HWVoice * pcm_hw_find_specific (HWVoice *hw, int freq,  
146 - int nchannels, audfmt_e fmt);  
147 -HWVoice * pcm_hw_add (int freq, int nchannels, audfmt_e fmt);  
148 -int pcm_hw_add_sw (HWVoice *hw, SWVoice *sw);  
149 -int pcm_hw_del_sw (HWVoice *hw, SWVoice *sw);  
150 -SWVoice * pcm_create_voice_pair (int freq, int nchannels, audfmt_e fmt);  
151 -  
152 -void pcm_hw_free_resources (HWVoice *hw);  
153 -int pcm_hw_alloc_resources (HWVoice *hw);  
154 -void pcm_hw_fini (HWVoice *hw);  
155 -void pcm_hw_gc (HWVoice *hw);  
156 -int pcm_hw_get_live (HWVoice *hw);  
157 -int pcm_hw_get_live2 (HWVoice *hw, int *nb_active);  
158 -void pcm_hw_dec_live (HWVoice *hw, int decr);  
159 -int pcm_hw_write (SWVoice *sw, void *buf, int len);  
160 -  
161 -int audio_get_conf_int (const char *key, int defval);  
162 -const char *audio_get_conf_str (const char *key, const char *defval); 36 +typedef struct SWVoice SWVoice;
163 37
164 -/* Public API */  
165 SWVoice * AUD_open (SWVoice *sw, const char *name, int freq, 38 SWVoice * AUD_open (SWVoice *sw, const char *name, int freq,
166 int nchannels, audfmt_e fmt); 39 int nchannels, audfmt_e fmt);
  40 +void AUD_init (void);
  41 +void AUD_log (const char *cap, const char *fmt, ...)
  42 + __attribute__ ((__format__ (__printf__, 2, 3)));;
  43 +void AUD_close (SWVoice *sw);
167 int AUD_write (SWVoice *sw, void *pcm_buf, int size); 44 int AUD_write (SWVoice *sw, void *pcm_buf, int size);
168 void AUD_adjust (SWVoice *sw, int leftover); 45 void AUD_adjust (SWVoice *sw, int leftover);
169 void AUD_reset (SWVoice *sw); 46 void AUD_reset (SWVoice *sw);
audio/audio_int.h 0 โ†’ 100644
  1 +/*
  2 + * QEMU Audio subsystem header
  3 + *
  4 + * Copyright (c) 2003-2004 Vassili Karpov (malc)
  5 + *
  6 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  7 + * of this software and associated documentation files (the "Software"), to deal
  8 + * in the Software without restriction, including without limitation the rights
  9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 + * copies of the Software, and to permit persons to whom the Software is
  11 + * furnished to do so, subject to the following conditions:
  12 + *
  13 + * The above copyright notice and this permission notice shall be included in
  14 + * all copies or substantial portions of the Software.
  15 + *
  16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 + * THE SOFTWARE.
  23 + */
  24 +#ifndef QEMU_AUDIO_INT_H
  25 +#define QEMU_AUDIO_INT_H
  26 +
  27 +#include "vl.h"
  28 +
  29 +struct pcm_ops;
  30 +
  31 +typedef struct HWVoice {
  32 + int active;
  33 + int enabled;
  34 + int pending_disable;
  35 + int valid;
  36 + int freq;
  37 +
  38 + f_sample *clip;
  39 + audfmt_e fmt;
  40 + int nchannels;
  41 +
  42 + int align;
  43 + int shift;
  44 +
  45 + int rpos;
  46 + int bufsize;
  47 +
  48 + int bytes_per_second;
  49 + st_sample_t *mix_buf;
  50 +
  51 + int samples;
  52 + int64_t old_ticks;
  53 + int nb_voices;
  54 + struct SWVoice **pvoice;
  55 + struct pcm_ops *pcm_ops;
  56 +} HWVoice;
  57 +
  58 +extern struct pcm_ops oss_pcm_ops;
  59 +extern struct audio_output_driver oss_output_driver;
  60 +
  61 +extern struct pcm_ops sdl_pcm_ops;
  62 +extern struct audio_output_driver sdl_output_driver;
  63 +
  64 +extern struct pcm_ops wav_pcm_ops;
  65 +extern struct audio_output_driver wav_output_driver;
  66 +
  67 +extern struct pcm_ops fmod_pcm_ops;
  68 +extern struct audio_output_driver fmod_output_driver;
  69 +
  70 +struct audio_output_driver {
  71 + const char *name;
  72 + void *(*init) (void);
  73 + void (*fini) (void *);
  74 + struct pcm_ops *pcm_ops;
  75 + int can_be_default;
  76 + int max_voices;
  77 + int voice_size;
  78 +};
  79 +
  80 +typedef struct AudioState {
  81 + int fixed_format;
  82 + int fixed_freq;
  83 + int fixed_channels;
  84 + int fixed_fmt;
  85 + int nb_hw_voices;
  86 + int voice_size;
  87 + int64_t ticks_threshold;
  88 + int freq_threshold;
  89 + void *opaque;
  90 + struct audio_output_driver *drv;
  91 +} AudioState;
  92 +extern AudioState audio_state;
  93 +
  94 +struct SWVoice {
  95 + int freq;
  96 + audfmt_e fmt;
  97 + int nchannels;
  98 +
  99 + int shift;
  100 + int align;
  101 +
  102 + t_sample *conv;
  103 +
  104 + int left;
  105 + int pos;
  106 + int bytes_per_second;
  107 + int64_t ratio;
  108 + st_sample_t *buf;
  109 + void *rate;
  110 +
  111 + int wpos;
  112 + int live;
  113 + int active;
  114 + int64_t old_ticks;
  115 + HWVoice *hw;
  116 + char *name;
  117 +};
  118 +
  119 +struct pcm_ops {
  120 + int (*init) (HWVoice *hw, int freq, int nchannels, audfmt_e fmt);
  121 + void (*fini) (HWVoice *hw);
  122 + void (*run) (HWVoice *hw);
  123 + int (*write) (SWVoice *sw, void *buf, int size);
  124 + int (*ctl) (HWVoice *hw, int cmd, ...);
  125 +};
  126 +
  127 +void pcm_sw_free_resources (SWVoice *sw);
  128 +int pcm_sw_alloc_resources (SWVoice *sw);
  129 +void pcm_sw_fini (SWVoice *sw);
  130 +int pcm_sw_init (SWVoice *sw, HWVoice *hw, int freq,
  131 + int nchannels, audfmt_e fmt);
  132 +
  133 +void pcm_hw_clear (HWVoice *hw, void *buf, int len);
  134 +HWVoice * pcm_hw_find_any (HWVoice *hw);
  135 +HWVoice * pcm_hw_find_any_active (HWVoice *hw);
  136 +HWVoice * pcm_hw_find_any_passive (HWVoice *hw);
  137 +HWVoice * pcm_hw_find_specific (HWVoice *hw, int freq,
  138 + int nchannels, audfmt_e fmt);
  139 +HWVoice * pcm_hw_add (int freq, int nchannels, audfmt_e fmt);
  140 +int pcm_hw_add_sw (HWVoice *hw, SWVoice *sw);
  141 +int pcm_hw_del_sw (HWVoice *hw, SWVoice *sw);
  142 +SWVoice * pcm_create_voice_pair (int freq, int nchannels, audfmt_e fmt);
  143 +
  144 +void pcm_hw_free_resources (HWVoice *hw);
  145 +int pcm_hw_alloc_resources (HWVoice *hw);
  146 +void pcm_hw_fini (HWVoice *hw);
  147 +void pcm_hw_gc (HWVoice *hw);
  148 +int pcm_hw_get_live (HWVoice *hw);
  149 +int pcm_hw_get_live2 (HWVoice *hw, int *nb_active);
  150 +void pcm_hw_dec_live (HWVoice *hw, int decr);
  151 +int pcm_hw_write (SWVoice *sw, void *buf, int len);
  152 +
  153 +int audio_get_conf_int (const char *key, int defval);
  154 +const char *audio_get_conf_str (const char *key, const char *defval);
  155 +
  156 +struct audio_output_driver;
  157 +
  158 +#define VOICE_ENABLE 1
  159 +#define VOICE_DISABLE 2
  160 +
  161 +#endif /* audio_int.h */
audio/fmodaudio.c
@@ -25,9 +25,22 @@ @@ -25,9 +25,22 @@
25 #include <fmod_errors.h> 25 #include <fmod_errors.h>
26 #include "vl.h" 26 #include "vl.h"
27 27
28 -#define AUDIO_CAP "fmod"  
29 -#include "audio/audio.h"  
30 -#include "audio/fmodaudio.h" 28 +#include "audio/audio_int.h"
  29 +
  30 +typedef struct FMODVoice {
  31 + HWVoice hw;
  32 + unsigned int old_pos;
  33 + FSOUND_SAMPLE *fmod_sample;
  34 + int channel;
  35 +} FMODVoice;
  36 +
  37 +
  38 +#define dolog(...) AUD_log ("fmod", __VA_ARGS__)
  39 +#ifdef DEBUG
  40 +#define ldebug(...) dolog (__VA_ARGS__)
  41 +#else
  42 +#define ldebug(...)
  43 +#endif
31 44
32 #define QC_FMOD_DRV "QEMU_FMOD_DRV" 45 #define QC_FMOD_DRV "QEMU_FMOD_DRV"
33 #define QC_FMOD_FREQ "QEMU_FMOD_FREQ" 46 #define QC_FMOD_FREQ "QEMU_FMOD_FREQ"
audio/fmodaudio.h deleted 100644 โ†’ 0
1 -/*  
2 - * QEMU FMOD audio output driver header  
3 - *  
4 - * Copyright (c) 2004 Vassili Karpov (malc)  
5 - *  
6 - * Permission is hereby granted, free of charge, to any person obtaining a copy  
7 - * of this software and associated documentation files (the "Software"), to deal  
8 - * in the Software without restriction, including without limitation the rights  
9 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
10 - * copies of the Software, and to permit persons to whom the Software is  
11 - * furnished to do so, subject to the following conditions:  
12 - *  
13 - * The above copyright notice and this permission notice shall be included in  
14 - * all copies or substantial portions of the Software.  
15 - *  
16 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
17 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
18 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
19 - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
20 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
21 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
22 - * THE SOFTWARE.  
23 - */  
24 -#ifndef QEMU_FMODAUDIO_H  
25 -#define QEMU_FMODAUDIO_H  
26 -  
27 -#include <fmod.h>  
28 -  
29 -typedef struct FMODVoice {  
30 - struct HWVoice hw;  
31 - unsigned int old_pos;  
32 - FSOUND_SAMPLE *fmod_sample;  
33 - int channel;  
34 -} FMODVoice;  
35 -  
36 -extern struct pcm_ops fmod_pcm_ops;  
37 -extern struct audio_output_driver fmod_output_driver;  
38 -  
39 -#endif /* fmodaudio.h */  
audio/ossaudio.c
@@ -21,20 +21,32 @@ @@ -21,20 +21,32 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
24 -  
25 -/* Temporary kludge */  
26 -#if defined __linux__ || (defined _BSD && !defined __APPLE__)  
27 -#include <assert.h>  
28 -#include "vl.h"  
29 -  
30 #include <sys/mman.h> 24 #include <sys/mman.h>
31 #include <sys/types.h> 25 #include <sys/types.h>
32 #include <sys/ioctl.h> 26 #include <sys/ioctl.h>
33 #include <sys/soundcard.h> 27 #include <sys/soundcard.h>
  28 +#include <assert.h>
  29 +#include "vl.h"
  30 +
  31 +#include "audio/audio_int.h"
  32 +
  33 +typedef struct OSSVoice {
  34 + HWVoice hw;
  35 + void *pcm_buf;
  36 + int fd;
  37 + int nfrags;
  38 + int fragsize;
  39 + int mmapped;
  40 + int old_optr;
  41 +} OSSVoice;
34 42
35 -#define AUDIO_CAP "oss"  
36 -#include "audio/audio.h"  
37 -#include "audio/ossaudio.h" 43 +
  44 +#define dolog(...) AUD_log ("oss", __VA_ARGS__)
  45 +#ifdef DEBUG
  46 +#define ldebug(...) dolog (__VA_ARGS__)
  47 +#else
  48 +#define ldebug(...)
  49 +#endif
38 50
39 #define QC_OSS_FRAGSIZE "QEMU_OSS_FRAGSIZE" 51 #define QC_OSS_FRAGSIZE "QEMU_OSS_FRAGSIZE"
40 #define QC_OSS_NFRAGS "QEMU_OSS_NFRAGS" 52 #define QC_OSS_NFRAGS "QEMU_OSS_NFRAGS"
@@ -463,4 +475,3 @@ struct audio_output_driver oss_output_driver = { @@ -463,4 +475,3 @@ struct audio_output_driver oss_output_driver = {
463 INT_MAX, 475 INT_MAX,
464 sizeof (OSSVoice) 476 sizeof (OSSVoice)
465 }; 477 };
466 -#endif  
audio/sdlaudio.c
@@ -25,9 +25,18 @@ @@ -25,9 +25,18 @@
25 #include <SDL/SDL_thread.h> 25 #include <SDL/SDL_thread.h>
26 #include "vl.h" 26 #include "vl.h"
27 27
28 -#define AUDIO_CAP "sdl"  
29 -#include "audio/audio.h"  
30 -#include "audio/sdlaudio.h" 28 +#include "audio/audio_int.h"
  29 +
  30 +typedef struct SDLVoice {
  31 + HWVoice hw;
  32 +} SDLVoice;
  33 +
  34 +#define dolog(...) AUD_log ("sdl", __VA_ARGS__)
  35 +#ifdef DEBUG
  36 +#define ldebug(...) dolog (__VA_ARGS__)
  37 +#else
  38 +#define ldebug(...)
  39 +#endif
31 40
32 #define QC_SDL_SAMPLES "QEMU_SDL_SAMPLES" 41 #define QC_SDL_SAMPLES "QEMU_SDL_SAMPLES"
33 42
audio/sdlaudio.h deleted 100644 โ†’ 0
1 -/*  
2 - * QEMU SDL audio output driver header  
3 - *  
4 - * Copyright (c) 2004 Vassili Karpov (malc)  
5 - *  
6 - * Permission is hereby granted, free of charge, to any person obtaining a copy  
7 - * of this software and associated documentation files (the "Software"), to deal  
8 - * in the Software without restriction, including without limitation the rights  
9 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
10 - * copies of the Software, and to permit persons to whom the Software is  
11 - * furnished to do so, subject to the following conditions:  
12 - *  
13 - * The above copyright notice and this permission notice shall be included in  
14 - * all copies or substantial portions of the Software.  
15 - *  
16 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
17 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
18 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
19 - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
20 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
21 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
22 - * THE SOFTWARE.  
23 - */  
24 -#ifndef QEMU_SDLAUDIO_H  
25 -#define QEMU_SDLAUDIO_H  
26 -  
27 -typedef struct SDLVoice {  
28 - struct HWVoice hw;  
29 -} SDLVoice;  
30 -  
31 -extern struct pcm_ops sdl_pcm_ops;  
32 -extern struct audio_output_driver sdl_output_driver;  
33 -  
34 -#endif /* sdlaudio.h */  
audio/wavaudio.c
@@ -23,9 +23,22 @@ @@ -23,9 +23,22 @@
23 */ 23 */
24 #include "vl.h" 24 #include "vl.h"
25 25
26 -#define AUDIO_CAP "wav"  
27 -#include "audio/audio.h"  
28 -#include "audio/wavaudio.h" 26 +#include "audio/audio_int.h"
  27 +
  28 +typedef struct WAVVoice {
  29 + HWVoice hw;
  30 + QEMUFile *f;
  31 + int64_t old_ticks;
  32 + void *pcm_buf;
  33 + int total_samples;
  34 +} WAVVoice;
  35 +
  36 +#define dolog(...) AUD_log ("wav", __VA_ARGS__)
  37 +#ifdef DEBUG
  38 +#define ldebug(...) dolog (__VA_ARGS__)
  39 +#else
  40 +#define ldebug(...)
  41 +#endif
29 42
30 static struct { 43 static struct {
31 const char *wav_path; 44 const char *wav_path;
audio/wavaudio.h deleted 100644 โ†’ 0
1 -/*  
2 - * QEMU WAV audio output driver header  
3 - *  
4 - * Copyright (c) 2004 Vassili Karpov (malc)  
5 - *  
6 - * Permission is hereby granted, free of charge, to any person obtaining a copy  
7 - * of this software and associated documentation files (the "Software"), to deal  
8 - * in the Software without restriction, including without limitation the rights  
9 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
10 - * copies of the Software, and to permit persons to whom the Software is  
11 - * furnished to do so, subject to the following conditions:  
12 - *  
13 - * The above copyright notice and this permission notice shall be included in  
14 - * all copies or substantial portions of the Software.  
15 - *  
16 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
17 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
18 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
19 - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
20 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
21 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
22 - * THE SOFTWARE.  
23 - */  
24 -#ifndef QEMU_WAVAUDIO_H  
25 -#define QEMU_WAVAUDIO_H  
26 -  
27 -typedef struct WAVVoice {  
28 - struct HWVoice hw;  
29 - QEMUFile *f;  
30 - int64_t old_ticks;  
31 - void *pcm_buf;  
32 - int total_samples;  
33 -} WAVVoice;  
34 -  
35 -extern struct pcm_ops wav_pcm_ops;  
36 -extern struct audio_output_driver wav_output_driver;  
37 -  
38 -#endif /* wavaudio.h */  
configure
@@ -72,6 +72,8 @@ mingw32=&quot;no&quot; @@ -72,6 +72,8 @@ mingw32=&quot;no&quot;
72 EXESUF="" 72 EXESUF=""
73 gdbstub="yes" 73 gdbstub="yes"
74 slirp="yes" 74 slirp="yes"
  75 +adlib="no"
  76 +oss="no"
75 77
76 # OS specific 78 # OS specific
77 targetos=`uname -s` 79 targetos=`uname -s`
@@ -81,18 +83,23 @@ mingw32=&quot;yes&quot; @@ -81,18 +83,23 @@ mingw32=&quot;yes&quot;
81 ;; 83 ;;
82 FreeBSD) 84 FreeBSD)
83 bsd="yes" 85 bsd="yes"
  86 +oss="yes"
84 ;; 87 ;;
85 NetBSD) 88 NetBSD)
86 bsd="yes" 89 bsd="yes"
  90 +oss="yes"
87 ;; 91 ;;
88 OpenBSD) 92 OpenBSD)
89 bsd="yes" 93 bsd="yes"
  94 +oss="yes"
90 ;; 95 ;;
91 Darwin) 96 Darwin)
92 bsd="yes" 97 bsd="yes"
93 darwin="yes" 98 darwin="yes"
94 ;; 99 ;;
95 -*) ;; 100 +*)
  101 +oss="yes"
  102 +;;
96 esac 103 esac
97 104
98 if [ "$bsd" = "yes" ] ; then 105 if [ "$bsd" = "yes" ] ; then
@@ -147,6 +154,8 @@ for opt do @@ -147,6 +154,8 @@ for opt do
147 ;; 154 ;;
148 --disable-slirp) slirp="no" 155 --disable-slirp) slirp="no"
149 ;; 156 ;;
  157 + --enable-adlib) adlib="yes"
  158 + ;;
150 esac 159 esac
151 done 160 done
152 161
@@ -316,6 +325,7 @@ echo &quot;static build $static&quot; @@ -316,6 +325,7 @@ echo &quot;static build $static&quot;
316 echo "SDL support $sdl" 325 echo "SDL support $sdl"
317 echo "SDL static link $sdl_static" 326 echo "SDL static link $sdl_static"
318 echo "mingw32 support $mingw32" 327 echo "mingw32 support $mingw32"
  328 +echo "Adlib support $adlib"
319 329
320 if test $sdl_too_old = "yes"; then 330 if test $sdl_too_old = "yes"; then
321 echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support" 331 echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support"
@@ -416,6 +426,14 @@ if test &quot;$slirp&quot; = &quot;yes&quot; ; then @@ -416,6 +426,14 @@ if test &quot;$slirp&quot; = &quot;yes&quot; ; then
416 echo "CONFIG_SLIRP=yes" >> $config_mak 426 echo "CONFIG_SLIRP=yes" >> $config_mak
417 echo "#define CONFIG_SLIRP 1" >> $config_h 427 echo "#define CONFIG_SLIRP 1" >> $config_h
418 fi 428 fi
  429 +if test "$adlib" = "yes" ; then
  430 + echo "CONFIG_ADLIB=yes" >> $config_mak
  431 + echo "#define CONFIG_ADLIB 1" >> $config_h
  432 +fi
  433 +if test "$oss" = "yes" ; then
  434 + echo "CONFIG_OSS=yes" >> $config_mak
  435 + echo "#define CONFIG_OSS 1" >> $config_h
  436 +fi
419 echo -n "VERSION=" >>$config_mak 437 echo -n "VERSION=" >>$config_mak
420 head $source_path/VERSION >>$config_mak 438 head $source_path/VERSION >>$config_mak
421 echo "" >>$config_mak 439 echo "" >>$config_mak
hw/adlib.c
@@ -23,8 +23,12 @@ @@ -23,8 +23,12 @@
23 */ 23 */
24 #include "vl.h" 24 #include "vl.h"
25 25
26 -#define AUDIO_CAP "adlib"  
27 -#include "audio/audio.h" 26 +#define dolog(...) AUD_log ("adlib", __VA_ARGS__)
  27 +#ifdef DEBUG
  28 +#define ldebug(...) dolog (__VA_ARGS__)
  29 +#else
  30 +#define ldebug(...)
  31 +#endif
28 32
29 #ifdef USE_YMF262 33 #ifdef USE_YMF262
30 #define HAS_YMF262 1 34 #define HAS_YMF262 1
@@ -555,8 +555,19 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, @@ -555,8 +555,19 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
555 DMA_init(0); 555 DMA_init(0);
556 556
557 if (audio_enabled) { 557 if (audio_enabled) {
558 - /* no audio supported yet for win32 */  
559 AUD_init(); 558 AUD_init();
  559 +#ifdef USE_SB16
  560 + if (sb16_enabled)
  561 + SB16_init ();
  562 +#endif
  563 +#ifdef CONFIG_ADLIB
  564 + if (adlib_enabled)
  565 + Adlib_init ();
  566 +#endif
  567 +#ifdef USE_GUS
  568 + if (gus_enabled)
  569 + GUS_init ();
  570 +#endif
560 } 571 }
561 572
562 floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table); 573 floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
hw/sb16.c
@@ -23,12 +23,16 @@ @@ -23,12 +23,16 @@
23 */ 23 */
24 #include "vl.h" 24 #include "vl.h"
25 25
26 -/* #define DEBUG */  
27 -#define AUDIO_CAP "sb16"  
28 -#include "audio/audio.h"  
29 -  
30 #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) 26 #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
31 27
  28 +#define dolog(...) AUD_log ("sb16", __VA_ARGS__)
  29 +#ifdef DEBUG
  30 +#define ldebug(...) dolog (__VA_ARGS__)
  31 +#else
  32 +#define ldebug(...)
  33 +#endif
  34 +
  35 +/* #define DEBUG */
32 /* #define DEBUG_SB16_MOST */ 36 /* #define DEBUG_SB16_MOST */
33 37
34 #define IO_READ_PROTO(name) \ 38 #define IO_READ_PROTO(name) \
@@ -511,7 +515,7 @@ static void command (SB16State *s, uint8_t cmd) @@ -511,7 +515,7 @@ static void command (SB16State *s, uint8_t cmd)
511 return; 515 return;
512 516
513 warn: 517 warn:
514 - dolog ("warning command %#x,%d is not trully understood yet\n", 518 + dolog ("warning: command %#x,%d is not trully understood yet\n",
515 cmd, s->needed_bytes); 519 cmd, s->needed_bytes);
516 s->cmd = cmd; 520 s->cmd = cmd;
517 return; 521 return;
@@ -1172,8 +1176,10 @@ static int SB_load (QEMUFile *f, void *opaque, int version_id) @@ -1172,8 +1176,10 @@ static int SB_load (QEMUFile *f, void *opaque, int version_id)
1172 qemu_get_be32s (f, &s->mixer_nreg); 1176 qemu_get_be32s (f, &s->mixer_nreg);
1173 qemu_get_buffer (f, s->mixer_regs, 256); 1177 qemu_get_buffer (f, s->mixer_regs, 256);
1174 1178
1175 - if (s->voice)  
1176 - AUD_reset (s->voice); 1179 + if (s->voice) {
  1180 + AUD_close (s->voice);
  1181 + s->voice = NULL;
  1182 + }
1177 1183
1178 if (s->dma_running) { 1184 if (s->dma_running) {
1179 if (s->freq) 1185 if (s->freq)
@@ -122,6 +122,9 @@ NetDriverState nd_table[MAX_NICS]; @@ -122,6 +122,9 @@ NetDriverState nd_table[MAX_NICS];
122 QEMUTimer *gui_timer; 122 QEMUTimer *gui_timer;
123 int vm_running; 123 int vm_running;
124 int audio_enabled = 0; 124 int audio_enabled = 0;
  125 +int sb16_enabled = 1;
  126 +int adlib_enabled = 1;
  127 +int gus_enabled = 1;
125 int pci_enabled = 1; 128 int pci_enabled = 1;
126 int prep_enabled = 0; 129 int prep_enabled = 0;
127 int rtc_utc = 1; 130 int rtc_utc = 1;
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 #include <unistd.h> 37 #include <unistd.h>
38 #include <fcntl.h> 38 #include <fcntl.h>
39 #include <sys/stat.h> 39 #include <sys/stat.h>
  40 +#include "audio/audio.h"
40 41
41 #ifndef O_LARGEFILE 42 #ifndef O_LARGEFILE
42 #define O_LARGEFILE 0 43 #define O_LARGEFILE 0
@@ -112,6 +113,9 @@ void qemu_system_shutdown_request(void); @@ -112,6 +113,9 @@ void qemu_system_shutdown_request(void);
112 void main_loop_wait(int timeout); 113 void main_loop_wait(int timeout);
113 114
114 extern int audio_enabled; 115 extern int audio_enabled;
  116 +extern int sb16_enabled;
  117 +extern int adlib_enabled;
  118 +extern int gus_enabled;
115 extern int ram_size; 119 extern int ram_size;
116 extern int bios_size; 120 extern int bios_size;
117 extern int rtc_utc; 121 extern int rtc_utc;
@@ -554,8 +558,14 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table); @@ -554,8 +558,14 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table);
554 int pmac_ide_init (BlockDriverState **hd_table, 558 int pmac_ide_init (BlockDriverState **hd_table,
555 openpic_t *openpic, int irq); 559 openpic_t *openpic, int irq);
556 560
557 -/* audio.c */  
558 -void AUD_init (void); 561 +/* sb16.c */
  562 +void SB16_init (void);
  563 +
  564 +/* adlib.c */
  565 +void Adlib_init (void);
  566 +
  567 +/* gus.c */
  568 +void GUS_init (void);
559 569
560 /* dma.c */ 570 /* dma.c */
561 typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size); 571 typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);