Revision fb065187
b/Makefile.target | ||
---|---|---|
1 | 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 | 3 |
#Uncomment following and specify proper paths/names for FMOD support |
8 | 4 |
#USE_FMOD=1 |
9 | 5 |
#FMOD_INCLUDE=/net/include/fmod |
... | ... | |
278 | 274 |
VL_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o |
279 | 275 |
|
280 | 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 | 288 |
SOUND_HW += fmopl.o adlib.o |
285 |
audio.o: DEFINES := -DUSE_ADLIB $(DEFINES) |
|
286 | 289 |
endif |
287 | 290 |
|
288 | 291 |
ifeq ($(USE_FMOD),1) |
b/audio/audio.c | ||
---|---|---|
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 | 24 |
#include <assert.h> |
25 |
#include <limits.h> |
|
26 | 25 |
#include "vl.h" |
27 | 26 |
|
28 |
#define AUDIO_CAP "audio" |
|
29 |
#include "audio/audio.h" |
|
30 |
|
|
31 | 27 |
#define USE_SDL_AUDIO |
32 | 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 | 37 |
#endif |
53 | 38 |
|
54 | 39 |
#define QC_AUDIO_DRV "QEMU_AUDIO_DRV" |
55 |
#define QC_VOICES "QEMU_VOICES" |
|
40 |
#define QC_VOICES "QEMU_VOICES"
|
|
56 | 41 |
#define QC_FIXED_FORMAT "QEMU_FIXED_FORMAT" |
57 | 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 | 46 |
AudioState audio_state = { |
83 | 47 |
1, /* use fixed settings */ |
... | ... | |
127 | 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 | 96 |
va_list ap; |
97 |
fprintf (stderr, "%s: ", cap); |
|
133 | 98 |
va_start (ap, fmt); |
134 | 99 |
vfprintf (stderr, fmt, ap); |
135 | 100 |
va_end (ap); |
... | ... | |
403 | 368 |
static int dist (void *hw) |
404 | 369 |
{ |
405 | 370 |
if (hw) { |
406 |
return (((uint8_t *) hw - (uint8_t *) hw_voice) |
|
371 |
return (((uint8_t *) hw - (uint8_t *) hw_voices)
|
|
407 | 372 |
/ audio_state.voice_size) + 1; |
408 | 373 |
} |
409 | 374 |
else { |
... | ... | |
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 | 381 |
HWVoice *pcm_hw_find_any (HWVoice *hw) |
417 | 382 |
{ |
... | ... | |
648 | 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 | 631 |
int AUD_write (SWVoice *sw, void *buf, int size) |
652 | 632 |
{ |
653 | 633 |
int bytes; |
... | ... | |
797 | 777 |
} |
798 | 778 |
|
799 | 779 |
static struct audio_output_driver *drvtab[] = { |
800 |
#ifdef USE_OSS_AUDIO
|
|
780 |
#ifdef CONFIG_OSS
|
|
801 | 781 |
&oss_output_driver, |
802 | 782 |
#endif |
803 | 783 |
#ifdef USE_FMOD_AUDIO |
804 | 784 |
&fmod_output_driver, |
805 | 785 |
#endif |
806 |
#ifdef USE_SDL_AUDIO
|
|
786 |
#ifdef CONFIG_SDL
|
|
807 | 787 |
&sdl_output_driver, |
808 | 788 |
#endif |
809 | 789 |
#ifdef USE_WAV_AUDIO |
... | ... | |
821 | 801 |
drv->name, audio_state.nb_hw_voices, drv->max_voices); |
822 | 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 | 806 |
audio_state.drv = drv; |
827 | 807 |
return 1; |
828 | 808 |
} |
... | ... | |
928 | 908 |
dolog ("Can not initialize audio subsystem\n"); |
929 | 909 |
return; |
930 | 910 |
} |
931 |
|
|
932 |
for (i = 0; hw_ctors[i]; i++) { |
|
933 |
hw_ctors[i] (); |
|
934 |
} |
|
935 | 911 |
} |
b/audio/audio.h | ||
---|---|---|
26 | 26 |
|
27 | 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 | 29 |
typedef enum { |
37 | 30 |
AUD_FMT_U8, |
38 | 31 |
AUD_FMT_S8, |
... | ... | |
40 | 33 |
AUD_FMT_S16 |
41 | 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 | 38 |
SWVoice * AUD_open (SWVoice *sw, const char *name, int freq, |
166 | 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 | 44 |
int AUD_write (SWVoice *sw, void *pcm_buf, int size); |
168 | 45 |
void AUD_adjust (SWVoice *sw, int leftover); |
169 | 46 |
void AUD_reset (SWVoice *sw); |
b/audio/audio_int.h | ||
---|---|---|
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 */ |
b/audio/fmodaudio.c | ||
---|---|---|
25 | 25 |
#include <fmod_errors.h> |
26 | 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 | 45 |
#define QC_FMOD_DRV "QEMU_FMOD_DRV" |
33 | 46 |
#define QC_FMOD_FREQ "QEMU_FMOD_FREQ" |
/dev/null | ||
---|---|---|
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 */ |
b/audio/ossaudio.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 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 | 24 |
#include <sys/mman.h> |
31 | 25 |
#include <sys/types.h> |
32 | 26 |
#include <sys/ioctl.h> |
33 | 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 | 51 |
#define QC_OSS_FRAGSIZE "QEMU_OSS_FRAGSIZE" |
40 | 52 |
#define QC_OSS_NFRAGS "QEMU_OSS_NFRAGS" |
... | ... | |
463 | 475 |
INT_MAX, |
464 | 476 |
sizeof (OSSVoice) |
465 | 477 |
}; |
466 |
#endif |
b/audio/sdlaudio.c | ||
---|---|---|
25 | 25 |
#include <SDL/SDL_thread.h> |
26 | 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 | 41 |
#define QC_SDL_SAMPLES "QEMU_SDL_SAMPLES" |
33 | 42 |
|
/dev/null | ||
---|---|---|
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 */ |
b/audio/wavaudio.c | ||
---|---|---|
23 | 23 |
*/ |
24 | 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 | 43 |
static struct { |
31 | 44 |
const char *wav_path; |
/dev/null | ||
---|---|---|
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 */ |
b/configure | ||
---|---|---|
72 | 72 |
EXESUF="" |
73 | 73 |
gdbstub="yes" |
74 | 74 |
slirp="yes" |
75 |
adlib="no" |
|
76 |
oss="no" |
|
75 | 77 |
|
76 | 78 |
# OS specific |
77 | 79 |
targetos=`uname -s` |
... | ... | |
81 | 83 |
;; |
82 | 84 |
FreeBSD) |
83 | 85 |
bsd="yes" |
86 |
oss="yes" |
|
84 | 87 |
;; |
85 | 88 |
NetBSD) |
86 | 89 |
bsd="yes" |
90 |
oss="yes" |
|
87 | 91 |
;; |
88 | 92 |
OpenBSD) |
89 | 93 |
bsd="yes" |
94 |
oss="yes" |
|
90 | 95 |
;; |
91 | 96 |
Darwin) |
92 | 97 |
bsd="yes" |
93 | 98 |
darwin="yes" |
94 | 99 |
;; |
95 |
*) ;; |
|
100 |
*) |
|
101 |
oss="yes" |
|
102 |
;; |
|
96 | 103 |
esac |
97 | 104 |
|
98 | 105 |
if [ "$bsd" = "yes" ] ; then |
... | ... | |
147 | 154 |
;; |
148 | 155 |
--disable-slirp) slirp="no" |
149 | 156 |
;; |
157 |
--enable-adlib) adlib="yes" |
|
158 |
;; |
|
150 | 159 |
esac |
151 | 160 |
done |
152 | 161 |
|
... | ... | |
316 | 325 |
echo "SDL support $sdl" |
317 | 326 |
echo "SDL static link $sdl_static" |
318 | 327 |
echo "mingw32 support $mingw32" |
328 |
echo "Adlib support $adlib" |
|
319 | 329 |
|
320 | 330 |
if test $sdl_too_old = "yes"; then |
321 | 331 |
echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support" |
... | ... | |
416 | 426 |
echo "CONFIG_SLIRP=yes" >> $config_mak |
417 | 427 |
echo "#define CONFIG_SLIRP 1" >> $config_h |
418 | 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 | 437 |
echo -n "VERSION=" >>$config_mak |
420 | 438 |
head $source_path/VERSION >>$config_mak |
421 | 439 |
echo "" >>$config_mak |
b/hw/adlib.c | ||
---|---|---|
23 | 23 |
*/ |
24 | 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 | 33 |
#ifdef USE_YMF262 |
30 | 34 |
#define HAS_YMF262 1 |
b/hw/pc.c | ||
---|---|---|
555 | 555 |
DMA_init(0); |
556 | 556 |
|
557 | 557 |
if (audio_enabled) { |
558 |
/* no audio supported yet for win32 */ |
|
559 | 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 | 573 |
floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table); |
b/hw/sb16.c | ||
---|---|---|
23 | 23 |
*/ |
24 | 24 |
#include "vl.h" |
25 | 25 |
|
26 |
/* #define DEBUG */ |
|
27 |
#define AUDIO_CAP "sb16" |
|
28 |
#include "audio/audio.h" |
|
29 |
|
|
30 | 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 | 36 |
/* #define DEBUG_SB16_MOST */ |
33 | 37 |
|
34 | 38 |
#define IO_READ_PROTO(name) \ |
... | ... | |
511 | 515 |
return; |
512 | 516 |
|
513 | 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 | 519 |
cmd, s->needed_bytes); |
516 | 520 |
s->cmd = cmd; |
517 | 521 |
return; |
... | ... | |
1172 | 1176 |
qemu_get_be32s (f, &s->mixer_nreg); |
1173 | 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 | 1184 |
if (s->dma_running) { |
1179 | 1185 |
if (s->freq) |
b/vl.c | ||
---|---|---|
122 | 122 |
QEMUTimer *gui_timer; |
123 | 123 |
int vm_running; |
124 | 124 |
int audio_enabled = 0; |
125 |
int sb16_enabled = 1; |
|
126 |
int adlib_enabled = 1; |
|
127 |
int gus_enabled = 1; |
|
125 | 128 |
int pci_enabled = 1; |
126 | 129 |
int prep_enabled = 0; |
127 | 130 |
int rtc_utc = 1; |
b/vl.h | ||
---|---|---|
37 | 37 |
#include <unistd.h> |
38 | 38 |
#include <fcntl.h> |
39 | 39 |
#include <sys/stat.h> |
40 |
#include "audio/audio.h" |
|
40 | 41 |
|
41 | 42 |
#ifndef O_LARGEFILE |
42 | 43 |
#define O_LARGEFILE 0 |
... | ... | |
112 | 113 |
void main_loop_wait(int timeout); |
113 | 114 |
|
114 | 115 |
extern int audio_enabled; |
116 |
extern int sb16_enabled; |
|
117 |
extern int adlib_enabled; |
|
118 |
extern int gus_enabled; |
|
115 | 119 |
extern int ram_size; |
116 | 120 |
extern int bios_size; |
117 | 121 |
extern int rtc_utc; |
... | ... | |
554 | 558 |
int pmac_ide_init (BlockDriverState **hd_table, |
555 | 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 | 570 |
/* dma.c */ |
561 | 571 |
typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size); |
Also available in: Unified diff