Skip to content

Commit

Permalink
pthreads-based audio and miscellaneous audio clean-up (malc).
Browse files Browse the repository at this point in the history
ESD support (malc, Frederick Reeve).


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3917 c046a42c-6fe2-441c-8c8c-71466251a162
  • Loading branch information
balrog committed Jan 14, 2008
1 parent b34d259 commit ca9cc28
Show file tree
Hide file tree
Showing 15 changed files with 883 additions and 54 deletions.
12 changes: 12 additions & 0 deletions Makefile
Expand Up @@ -73,6 +73,7 @@ AUDIO_OBJS += ossaudio.o
endif
ifdef CONFIG_COREAUDIO
AUDIO_OBJS += coreaudio.o
AUDIO_PT = yes
endif
ifdef CONFIG_ALSA
AUDIO_OBJS += alsaaudio.o
Expand All @@ -84,6 +85,17 @@ ifdef CONFIG_FMOD
AUDIO_OBJS += fmodaudio.o
audio/audio.o audio/fmodaudio.o: CPPFLAGS := -I$(CONFIG_FMOD_INC) $(CPPFLAGS)
endif
ifdef CONFIG_ESD
AUDIO_PT = yes
AUDIO_PT_INT = yes
AUDIO_OBJS += esdaudio.o
endif
ifdef AUDIO_PT
LDFLAGS += -pthread
endif
ifdef AUDIO_PT_INT
AUDIO_OBJS += audio_pt_int.o
endif
AUDIO_OBJS+= wavcapture.o
OBJS+=$(addprefix audio/, $(AUDIO_OBJS))

Expand Down
11 changes: 9 additions & 2 deletions Makefile.target
Expand Up @@ -404,6 +404,9 @@ endif
ifdef CONFIG_ALSA
LIBS += -lasound
endif
ifdef CONFIG_ESD
LIBS += -lesd
endif
ifdef CONFIG_DSOUND
LIBS += -lole32 -ldxguid
endif
Expand All @@ -412,6 +415,9 @@ LIBS += $(CONFIG_FMOD_LIB)
endif

SOUND_HW = sb16.o es1370.o
ifdef CONFIG_AC97
SOUND_HW += ac97.o
endif
ifdef CONFIG_ADLIB
SOUND_HW += fmopl.o adlib.o
endif
Expand Down Expand Up @@ -641,8 +647,9 @@ endif

ifeq (1, 0)
audio.o sdlaudio.o dsoundaudio.o ossaudio.o wavaudio.o noaudio.o \
fmodaudio.o alsaaudio.o mixeng.o sb16.o es1370.o gus.o adlib.o: \
CFLAGS := $(CFLAGS) -Wall -Werror -W -Wsign-compare
fmodaudio.o alsaaudio.o mixeng.o sb16.o es1370.o ac97.o gus.o adlib.o \
esdaudio.o audio_pt_int.o: \
CFLAGS := $(CFLAGS) -O0 -g -Wall -Werror -W -Wsign-compare -Wno-unused
endif

# Include automatically generated dependency files
Expand Down
88 changes: 47 additions & 41 deletions audio/alsaaudio.c
Expand Up @@ -86,16 +86,17 @@ static struct {
};

struct alsa_params_req {
unsigned int freq;
audfmt_e fmt;
unsigned int nchannels;
int freq;
snd_pcm_format_t fmt;
int nchannels;
unsigned int buffer_size;
unsigned int period_size;
};

struct alsa_params_obt {
int freq;
audfmt_e fmt;
int endianness;
int nchannels;
snd_pcm_uframes_t samples;
};
Expand Down Expand Up @@ -143,7 +144,7 @@ static int alsa_write (SWVoiceOut *sw, void *buf, int len)
return audio_pcm_sw_write (sw, buf, len);
}

static int aud_to_alsafmt (audfmt_e fmt)
static snd_pcm_format_t aud_to_alsafmt (audfmt_e fmt)
{
switch (fmt) {
case AUD_FMT_S8:
Expand Down Expand Up @@ -173,7 +174,8 @@ static int aud_to_alsafmt (audfmt_e fmt)
}
}

static int alsa_to_audfmt (int alsafmt, audfmt_e *fmt, int *endianness)
static int alsa_to_audfmt (snd_pcm_format_t alsafmt, audfmt_e *fmt,
int *endianness)
{
switch (alsafmt) {
case SND_PCM_FORMAT_S8:
Expand Down Expand Up @@ -234,7 +236,6 @@ static int alsa_to_audfmt (int alsafmt, audfmt_e *fmt, int *endianness)
return 0;
}

#if defined DEBUG_MISMATCHES || defined DEBUG
static void alsa_dump_info (struct alsa_params_req *req,
struct alsa_params_obt *obt)
{
Expand All @@ -248,7 +249,6 @@ static void alsa_dump_info (struct alsa_params_req *req,
req->buffer_size, req->period_size);
dolog ("obtained: samples %ld\n", obt->samples);
}
#endif

static void alsa_set_threshold (snd_pcm_t *handle, snd_pcm_uframes_t threshold)
{
Expand Down Expand Up @@ -291,6 +291,7 @@ static int alsa_open (int in, struct alsa_params_req *req,
unsigned int period_size, buffer_size;
snd_pcm_uframes_t obt_buffer_size;
const char *typ = in ? "ADC" : "DAC";
snd_pcm_format_t obtfmt;

freq = req->freq;
period_size = req->period_size;
Expand Down Expand Up @@ -327,9 +328,8 @@ static int alsa_open (int in, struct alsa_params_req *req,
}

err = snd_pcm_hw_params_set_format (handle, hw_params, req->fmt);
if (err < 0) {
if (err < 0 && conf.verbose) {
alsa_logerr2 (err, typ, "Failed to set format %d\n", req->fmt);
goto err;
}

err = snd_pcm_hw_params_set_rate_near (handle, hw_params, &freq, 0);
Expand Down Expand Up @@ -494,6 +494,17 @@ static int alsa_open (int in, struct alsa_params_req *req,
goto err;
}

err = snd_pcm_hw_params_get_format (hw_params, &obtfmt);
if (err < 0) {
alsa_logerr2 (err, typ, "Failed to get format\n");
goto err;
}

if (alsa_to_audfmt (obtfmt, &obt->fmt, &obt->endianness)) {
dolog ("Invalid format was returned %d\n", obtfmt);
goto err;
}

err = snd_pcm_prepare (handle);
if (err < 0) {
alsa_logerr2 (err, typ, "Could not prepare handle %p\n", handle);
Expand All @@ -504,28 +515,41 @@ static int alsa_open (int in, struct alsa_params_req *req,
snd_pcm_uframes_t threshold;
int bytes_per_sec;

bytes_per_sec = freq
<< (nchannels == 2)
<< (req->fmt == AUD_FMT_S16 || req->fmt == AUD_FMT_U16);
bytes_per_sec = freq << (nchannels == 2);

switch (obt->fmt) {
case AUD_FMT_S8:
case AUD_FMT_U8:
break;

case AUD_FMT_S16:
case AUD_FMT_U16:
bytes_per_sec <<= 1;
break;

case AUD_FMT_S32:
case AUD_FMT_U32:
bytes_per_sec <<= 2;
break;
}

threshold = (conf.threshold * bytes_per_sec) / 1000;
alsa_set_threshold (handle, threshold);
}

obt->fmt = req->fmt;
obt->nchannels = nchannels;
obt->freq = freq;
obt->samples = obt_buffer_size;

*handlep = handle;

#if defined DEBUG_MISMATCHES || defined DEBUG
if (obt->fmt != req->fmt ||
obt->nchannels != req->nchannels ||
obt->freq != req->freq) {
dolog ("Audio paramters mismatch for %s\n", typ);
if (conf.verbose &&
(obt->fmt != req->fmt ||
obt->nchannels != req->nchannels ||
obt->freq != req->freq)) {
dolog ("Audio paramters for %s\n", typ);
alsa_dump_info (req, obt);
}
#endif

#ifdef DEBUG
alsa_dump_info (req, obt);
Expand Down Expand Up @@ -665,9 +689,6 @@ static int alsa_init_out (HWVoiceOut *hw, audsettings_t *as)
ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
struct alsa_params_req req;
struct alsa_params_obt obt;
audfmt_e effective_fmt;
int endianness;
int err;
snd_pcm_t *handle;
audsettings_t obt_as;

Expand All @@ -681,16 +702,10 @@ static int alsa_init_out (HWVoiceOut *hw, audsettings_t *as)
return -1;
}

err = alsa_to_audfmt (obt.fmt, &effective_fmt, &endianness);
if (err) {
alsa_anal_close (&handle);
return -1;
}

obt_as.freq = obt.freq;
obt_as.nchannels = obt.nchannels;
obt_as.fmt = effective_fmt;
obt_as.endianness = endianness;
obt_as.fmt = obt.fmt;
obt_as.endianness = obt.endianness;

audio_pcm_init_info (&hw->info, &obt_as);
hw->samples = obt.samples;
Expand Down Expand Up @@ -751,9 +766,6 @@ static int alsa_init_in (HWVoiceIn *hw, audsettings_t *as)
ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
struct alsa_params_req req;
struct alsa_params_obt obt;
int endianness;
int err;
audfmt_e effective_fmt;
snd_pcm_t *handle;
audsettings_t obt_as;

Expand All @@ -767,16 +779,10 @@ static int alsa_init_in (HWVoiceIn *hw, audsettings_t *as)
return -1;
}

err = alsa_to_audfmt (obt.fmt, &effective_fmt, &endianness);
if (err) {
alsa_anal_close (&handle);
return -1;
}

obt_as.freq = obt.freq;
obt_as.nchannels = obt.nchannels;
obt_as.fmt = effective_fmt;
obt_as.endianness = endianness;
obt_as.fmt = obt.fmt;
obt_as.endianness = obt.endianness;

audio_pcm_init_info (&hw->info, &obt_as);
hw->samples = obt.samples;
Expand Down
5 changes: 4 additions & 1 deletion audio/audio.c
Expand Up @@ -55,6 +55,9 @@ static struct audio_driver *drvtab[] = {
#endif
#ifdef CONFIG_SDL
&sdl_audio_driver,
#endif
#ifdef CONFIG_ESD
&esd_audio_driver,
#endif
&no_audio_driver,
&wav_audio_driver
Expand Down Expand Up @@ -414,7 +417,7 @@ static void audio_print_options (const char *prefix,
{
audfmt_e *fmtp = opt->valp;
printf (
"format, %s = %s, (one of: U8 S8 U16 S16)\n",
"format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n",
state,
audio_audfmt_to_string (*fmtp)
);
Expand Down
1 change: 1 addition & 0 deletions audio/audio_int.h
Expand Up @@ -202,6 +202,7 @@ extern struct audio_driver fmod_audio_driver;
extern struct audio_driver alsa_audio_driver;
extern struct audio_driver coreaudio_audio_driver;
extern struct audio_driver dsound_audio_driver;
extern struct audio_driver esd_audio_driver;
extern volume_t nominal_volume;

void audio_pcm_init_info (struct audio_pcm_info *info, audsettings_t *as);
Expand Down

0 comments on commit ca9cc28

Please sign in to comment.