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