* [Qemu-devel] audio: Mixing engine and mixer emulation @ 2011-01-03 23:05 Michael Walle 2011-01-04 0:08 ` [Qemu-devel] " malc 0 siblings, 1 reply; 11+ messages in thread From: Michael Walle @ 2011-01-03 23:05 UTC (permalink / raw) To: malc; +Cc: qemu-devel Hi, the SWVoiceIn volume is never used, although there is AUD_set_volume_in() to set it. Would it be possible to add support for it? So we could get the mixer emulation for capture devices too? BTW i see you can only attenuate an audio stream with these volume settings (you can only set a max value of 255 and the formula is nominal_value * vol / 255). Would it be possible to support amplification too? -- Michael ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: audio: Mixing engine and mixer emulation 2011-01-03 23:05 [Qemu-devel] audio: Mixing engine and mixer emulation Michael Walle @ 2011-01-04 0:08 ` malc 2011-01-05 0:05 ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle 0 siblings, 1 reply; 11+ messages in thread From: malc @ 2011-01-04 0:08 UTC (permalink / raw) To: Michael Walle; +Cc: qemu-devel On Tue, 4 Jan 2011, Michael Walle wrote: > > Hi, > > the SWVoiceIn volume is never used, although there is AUD_set_volume_in() to > set it. Would it be possible to add support for it? So we could get the mixer > emulation for capture devices too? > > BTW i see you can only attenuate an audio stream with these volume settings > (you can only set a max value of 255 and the formula is nominal_value * vol / > 255). Would it be possible to support amplification too? I've never touched this code since writing it way back then, if you cook up a patch... (This is a reply to both your questions) -- mailto:av1474@comtv.ru ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing 2011-01-04 0:08 ` [Qemu-devel] " malc @ 2011-01-05 0:05 ` Michael Walle 2011-01-10 20:43 ` [Qemu-devel] " Jan Kiszka 2011-01-12 15:44 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc 0 siblings, 2 replies; 11+ messages in thread From: Michael Walle @ 2011-01-05 0:05 UTC (permalink / raw) To: qemu-devel; +Cc: Michael Walle Refactor the volume mixing, so it can be reused for capturing devices. Additionally, it removes superfluous multiplications with the nominal volume within the hardware voice code path. Signed-off-by: Michael Walle <michael@walle.cc> --- audio/alsaaudio.c | 2 +- audio/audio.c | 11 ++++++----- audio/audio_int.h | 2 +- audio/dsoundaudio.c | 4 ++-- audio/esdaudio.c | 3 +-- audio/fmodaudio.c | 4 ++-- audio/mixeng.c | 25 +++++++++++++++++++++++++ audio/mixeng.h | 4 ++-- audio/mixeng_template.h | 39 +++++++-------------------------------- audio/ossaudio.c | 3 +-- audio/paaudio.c | 2 +- audio/spiceaudio.c | 5 ++--- audio/winwaveaudio.c | 3 +-- 13 files changed, 52 insertions(+), 55 deletions(-) diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index fef24f6..301a6af 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw) } } - hw->conv (dst, src, nread, &nominal_volume); + hw->conv (dst, src, nread); src = advance (src, nread << hwshift); dst += nread; diff --git a/audio/audio.c b/audio/audio.c index 1707446..1729c0b 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -104,7 +104,7 @@ static struct { static AudioState glob_audio_state; -struct mixeng_volume nominal_volume = { +const struct mixeng_volume nominal_volume = { .mute = 0, #ifdef FLOAT_MIXENG .r = 1.0, @@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len) /* * Capture */ -static void noop_conv (struct st_sample *dst, const void *src, - int samples, struct mixeng_volume *vol) +static void noop_conv (struct st_sample *dst, const void *src, int samples) { (void) src; (void) dst; (void) samples; - (void) vol; } static CaptureVoiceOut *audio_pcm_capture_find_specific ( @@ -956,6 +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size) total += isamp; } + mixeng_volume (sw->buf, ret, &sw->vol); + sw->clip (buf, sw->buf, ret); sw->total_hw_samples_acquired += total; return ret << sw->info.shift; @@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size) swlim = ((int64_t) dead << 32) / sw->ratio; swlim = audio_MIN (swlim, samples); if (swlim) { - sw->conv (sw->buf, buf, swlim, &sw->vol); + sw->conv (sw->buf, buf, swlim); + mixeng_volume (sw->buf, swlim, &sw->vol); } while (swlim) { diff --git a/audio/audio_int.h b/audio/audio_int.h index d66f2c3..2003f8b 100644 --- a/audio/audio_int.h +++ b/audio/audio_int.h @@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver; extern struct audio_driver pa_audio_driver; extern struct audio_driver spice_audio_driver; extern struct audio_driver winwave_audio_driver; -extern struct mixeng_volume nominal_volume; +extern const struct mixeng_volume nominal_volume; void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as); void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len); diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c index e547955..e2d89fd 100644 --- a/audio/dsoundaudio.c +++ b/audio/dsoundaudio.c @@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw) decr = len1 + len2; if (p1 && len1) { - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); + hw->conv (hw->conv_buf + hw->wpos, p1, len1); } if (p2 && len2) { - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); + hw->conv (hw->conv_buf, p2, len2); } dsound_unlock_in (dscb, p1, p2, blen1, blen2); diff --git a/audio/esdaudio.c b/audio/esdaudio.c index 9a1f2f8..ff97b39 100644 --- a/audio/esdaudio.c +++ b/audio/esdaudio.c @@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg) break; } - hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift, - &nominal_volume); + hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift); wpos = (wpos + chunk) % hw->samples; to_grab -= chunk; } diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c index 7f08e14..c34cf53 100644 --- a/audio/fmodaudio.c +++ b/audio/fmodaudio.c @@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw) decr = len1 + len2; if (p1 && blen1) { - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); + hw->conv (hw->conv_buf + hw->wpos, p1, len1); } if (p2 && len2) { - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); + hw->conv (hw->conv_buf, p2, len2); } fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2); diff --git a/audio/mixeng.c b/audio/mixeng.c index 9f1d93f..4a9e8eb 100644 --- a/audio/mixeng.c +++ b/audio/mixeng.c @@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int len) { memset (buf, 0, len * sizeof (struct st_sample)); } + +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol) +{ +#ifdef CONFIG_MIXEMU + if (vol->mute) { + mixeng_clear (buf, len); + return; + } + + while (len--) { +#ifdef FLOAT_MIXENG + buf->l = buf->l * vol->l; + buf->r = buf->r * vol->r; +#else + buf->l = (buf->l * vol->l) >> 32; + buf->r = (buf->r * vol->r) >> 32; +#endif + buf += 1; + } +#else + (void) buf; + (void) len; + (void) vol; +#endif +} diff --git a/audio/mixeng.h b/audio/mixeng.h index 4af1dd9..9de443b 100644 --- a/audio/mixeng.h +++ b/audio/mixeng.h @@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t l; }; struct st_sample { int64_t l; int64_t r; }; #endif -typedef void (t_sample) (struct st_sample *dst, const void *src, - int samples, struct mixeng_volume *vol); +typedef void (t_sample) (struct st_sample *dst, const void *src, int samples); typedef void (f_sample) (void *dst, const struct st_sample *src, int samples); extern t_sample *mixeng_conv[2][2][2][3]; @@ -47,5 +46,6 @@ void st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *o int *isamp, int *osamp); void st_rate_stop (void *opaque); void mixeng_clear (struct st_sample *buf, int len); +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol); #endif /* mixeng.h */ diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index 5617705..a2d0ef8 100644 --- a/audio/mixeng_template.h +++ b/audio/mixeng_template.h @@ -31,16 +31,6 @@ #define HALF (IN_MAX >> 1) #endif -#ifdef CONFIG_MIXEMU -#ifdef FLOAT_MIXENG -#define VOL(a, b) ((a) * (b)) -#else -#define VOL(a, b) ((a) * (b)) >> 32 -#endif -#else -#define VOL(a, b) a -#endif - #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T)) #ifdef FLOAT_MIXENG @@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v) #endif static void glue (glue (conv_, ET), _to_stereo) - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) + (struct st_sample *dst, const void *src, int samples) { struct st_sample *out = dst; IN_T *in = (IN_T *) src; -#ifdef CONFIG_MIXEMU - if (vol->mute) { - mixeng_clear (dst, samples); - return; - } -#else - (void) vol; -#endif + while (samples--) { - out->l = VOL (glue (conv_, ET) (*in++), vol->l); - out->r = VOL (glue (conv_, ET) (*in++), vol->r); + out->l = glue (conv_, ET) (*in++); + out->r = glue (conv_, ET) (*in++); out += 1; } } static void glue (glue (conv_, ET), _to_mono) - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) + (struct st_sample *dst, const void *src, int samples) { struct st_sample *out = dst; IN_T *in = (IN_T *) src; -#ifdef CONFIG_MIXEMU - if (vol->mute) { - mixeng_clear (dst, samples); - return; - } -#else - (void) vol; -#endif + while (samples--) { - out->l = VOL (glue (conv_, ET) (in[0]), vol->l); + out->l = glue (conv_, ET) (in[0]); out->r = out->l; out += 1; in += 1; @@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono) #undef ET #undef HALF -#undef VOL diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 0439ef5..1fda519 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw) hw->info.align + 1); } read_samples += nread >> hwshift; - hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift, - &nominal_volume); + hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift); } if (bufs[i].len - nread) { diff --git a/audio/paaudio.c b/audio/paaudio.c index ff71dac..9cf685d 100644 --- a/audio/paaudio.c +++ b/audio/paaudio.c @@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg) return NULL; } - hw->conv (hw->conv_buf + wpos, buf, chunk, &nominal_volume); + hw->conv (hw->conv_buf + wpos, buf, chunk); wpos = (wpos + chunk) % hw->samples; to_grab -= chunk; } diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index 373e4c4..a5c0d6b 100644 --- a/audio/spiceaudio.c +++ b/audio/spiceaudio.c @@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw) len[1] = 0; } - hw->conv (hw->conv_buf + hw->wpos, samples, len[0], &nominal_volume); + hw->conv (hw->conv_buf + hw->wpos, samples, len[0]); if (len[1]) { - hw->conv (hw->conv_buf, samples + len[0], len[1], - &nominal_volume); + hw->conv (hw->conv_buf, samples + len[0], len[1]); } hw->wpos = (hw->wpos + num_samples) % hw->samples; diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c index cdf483b..e5ad3c6 100644 --- a/audio/winwaveaudio.c +++ b/audio/winwaveaudio.c @@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw) int conv = audio_MIN (left, decr); hw->conv (hw->conv_buf + hw->wpos, advance (wave->pcm_buf, wave->rpos << hw->info.shift), - conv, - &nominal_volume); + conv); wave->rpos = (wave->rpos + conv) % hw->samples; hw->wpos = (hw->wpos + conv) % hw->samples; -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing 2011-01-05 0:05 ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle @ 2011-01-10 20:43 ` Jan Kiszka 2011-01-10 20:52 ` malc 2011-01-11 6:09 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang 2011-01-12 15:44 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc 1 sibling, 2 replies; 11+ messages in thread From: Jan Kiszka @ 2011-01-10 20:43 UTC (permalink / raw) To: Michael Walle; +Cc: qemu-devel [-- Attachment #1: Type: text/plain, Size: 11821 bytes --] Am 05.01.2011 01:05, Michael Walle wrote: > Refactor the volume mixing, so it can be reused for capturing devices. > Additionally, it removes superfluous multiplications with the nominal > volume within the hardware voice code path. At least based on tests done with the Musicpal, I see problems with this patch, volume control still fine here. Jan > > Signed-off-by: Michael Walle <michael@walle.cc> > --- > audio/alsaaudio.c | 2 +- > audio/audio.c | 11 ++++++----- > audio/audio_int.h | 2 +- > audio/dsoundaudio.c | 4 ++-- > audio/esdaudio.c | 3 +-- > audio/fmodaudio.c | 4 ++-- > audio/mixeng.c | 25 +++++++++++++++++++++++++ > audio/mixeng.h | 4 ++-- > audio/mixeng_template.h | 39 +++++++-------------------------------- > audio/ossaudio.c | 3 +-- > audio/paaudio.c | 2 +- > audio/spiceaudio.c | 5 ++--- > audio/winwaveaudio.c | 3 +-- > 13 files changed, 52 insertions(+), 55 deletions(-) > > diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c > index fef24f6..301a6af 100644 > --- a/audio/alsaaudio.c > +++ b/audio/alsaaudio.c > @@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw) > } > } > > - hw->conv (dst, src, nread, &nominal_volume); > + hw->conv (dst, src, nread); > > src = advance (src, nread << hwshift); > dst += nread; > diff --git a/audio/audio.c b/audio/audio.c > index 1707446..1729c0b 100644 > --- a/audio/audio.c > +++ b/audio/audio.c > @@ -104,7 +104,7 @@ static struct { > > static AudioState glob_audio_state; > > -struct mixeng_volume nominal_volume = { > +const struct mixeng_volume nominal_volume = { > .mute = 0, > #ifdef FLOAT_MIXENG > .r = 1.0, > @@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len) > /* > * Capture > */ > -static void noop_conv (struct st_sample *dst, const void *src, > - int samples, struct mixeng_volume *vol) > +static void noop_conv (struct st_sample *dst, const void *src, int samples) > { > (void) src; > (void) dst; > (void) samples; > - (void) vol; > } > > static CaptureVoiceOut *audio_pcm_capture_find_specific ( > @@ -956,6 +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size) > total += isamp; > } > > + mixeng_volume (sw->buf, ret, &sw->vol); > + > sw->clip (buf, sw->buf, ret); > sw->total_hw_samples_acquired += total; > return ret << sw->info.shift; > @@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size) > swlim = ((int64_t) dead << 32) / sw->ratio; > swlim = audio_MIN (swlim, samples); > if (swlim) { > - sw->conv (sw->buf, buf, swlim, &sw->vol); > + sw->conv (sw->buf, buf, swlim); > + mixeng_volume (sw->buf, swlim, &sw->vol); > } > > while (swlim) { > diff --git a/audio/audio_int.h b/audio/audio_int.h > index d66f2c3..2003f8b 100644 > --- a/audio/audio_int.h > +++ b/audio/audio_int.h > @@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver; > extern struct audio_driver pa_audio_driver; > extern struct audio_driver spice_audio_driver; > extern struct audio_driver winwave_audio_driver; > -extern struct mixeng_volume nominal_volume; > +extern const struct mixeng_volume nominal_volume; > > void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as); > void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len); > diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c > index e547955..e2d89fd 100644 > --- a/audio/dsoundaudio.c > +++ b/audio/dsoundaudio.c > @@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw) > decr = len1 + len2; > > if (p1 && len1) { > - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, p1, len1); > } > > if (p2 && len2) { > - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); > + hw->conv (hw->conv_buf, p2, len2); > } > > dsound_unlock_in (dscb, p1, p2, blen1, blen2); > diff --git a/audio/esdaudio.c b/audio/esdaudio.c > index 9a1f2f8..ff97b39 100644 > --- a/audio/esdaudio.c > +++ b/audio/esdaudio.c > @@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg) > break; > } > > - hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift, > - &nominal_volume); > + hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift); > wpos = (wpos + chunk) % hw->samples; > to_grab -= chunk; > } > diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c > index 7f08e14..c34cf53 100644 > --- a/audio/fmodaudio.c > +++ b/audio/fmodaudio.c > @@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw) > decr = len1 + len2; > > if (p1 && blen1) { > - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, p1, len1); > } > if (p2 && len2) { > - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); > + hw->conv (hw->conv_buf, p2, len2); > } > > fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2); > diff --git a/audio/mixeng.c b/audio/mixeng.c > index 9f1d93f..4a9e8eb 100644 > --- a/audio/mixeng.c > +++ b/audio/mixeng.c > @@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int len) > { > memset (buf, 0, len * sizeof (struct st_sample)); > } > + > +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol) > +{ > +#ifdef CONFIG_MIXEMU > + if (vol->mute) { > + mixeng_clear (buf, len); > + return; > + } > + > + while (len--) { > +#ifdef FLOAT_MIXENG > + buf->l = buf->l * vol->l; > + buf->r = buf->r * vol->r; > +#else > + buf->l = (buf->l * vol->l) >> 32; > + buf->r = (buf->r * vol->r) >> 32; > +#endif > + buf += 1; > + } > +#else > + (void) buf; > + (void) len; > + (void) vol; > +#endif > +} > diff --git a/audio/mixeng.h b/audio/mixeng.h > index 4af1dd9..9de443b 100644 > --- a/audio/mixeng.h > +++ b/audio/mixeng.h > @@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t l; }; > struct st_sample { int64_t l; int64_t r; }; > #endif > > -typedef void (t_sample) (struct st_sample *dst, const void *src, > - int samples, struct mixeng_volume *vol); > +typedef void (t_sample) (struct st_sample *dst, const void *src, int samples); > typedef void (f_sample) (void *dst, const struct st_sample *src, int samples); > > extern t_sample *mixeng_conv[2][2][2][3]; > @@ -47,5 +46,6 @@ void st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *o > int *isamp, int *osamp); > void st_rate_stop (void *opaque); > void mixeng_clear (struct st_sample *buf, int len); > +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol); > > #endif /* mixeng.h */ > diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h > index 5617705..a2d0ef8 100644 > --- a/audio/mixeng_template.h > +++ b/audio/mixeng_template.h > @@ -31,16 +31,6 @@ > #define HALF (IN_MAX >> 1) > #endif > > -#ifdef CONFIG_MIXEMU > -#ifdef FLOAT_MIXENG > -#define VOL(a, b) ((a) * (b)) > -#else > -#define VOL(a, b) ((a) * (b)) >> 32 > -#endif > -#else > -#define VOL(a, b) a > -#endif > - > #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T)) > > #ifdef FLOAT_MIXENG > @@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v) > #endif > > static void glue (glue (conv_, ET), _to_stereo) > - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) > + (struct st_sample *dst, const void *src, int samples) > { > struct st_sample *out = dst; > IN_T *in = (IN_T *) src; > -#ifdef CONFIG_MIXEMU > - if (vol->mute) { > - mixeng_clear (dst, samples); > - return; > - } > -#else > - (void) vol; > -#endif > + > while (samples--) { > - out->l = VOL (glue (conv_, ET) (*in++), vol->l); > - out->r = VOL (glue (conv_, ET) (*in++), vol->r); > + out->l = glue (conv_, ET) (*in++); > + out->r = glue (conv_, ET) (*in++); > out += 1; > } > } > > static void glue (glue (conv_, ET), _to_mono) > - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) > + (struct st_sample *dst, const void *src, int samples) > { > struct st_sample *out = dst; > IN_T *in = (IN_T *) src; > -#ifdef CONFIG_MIXEMU > - if (vol->mute) { > - mixeng_clear (dst, samples); > - return; > - } > -#else > - (void) vol; > -#endif > + > while (samples--) { > - out->l = VOL (glue (conv_, ET) (in[0]), vol->l); > + out->l = glue (conv_, ET) (in[0]); > out->r = out->l; > out += 1; > in += 1; > @@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono) > > #undef ET > #undef HALF > -#undef VOL > diff --git a/audio/ossaudio.c b/audio/ossaudio.c > index 0439ef5..1fda519 100644 > --- a/audio/ossaudio.c > +++ b/audio/ossaudio.c > @@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw) > hw->info.align + 1); > } > read_samples += nread >> hwshift; > - hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift, > - &nominal_volume); > + hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift); > } > > if (bufs[i].len - nread) { > diff --git a/audio/paaudio.c b/audio/paaudio.c > index ff71dac..9cf685d 100644 > --- a/audio/paaudio.c > +++ b/audio/paaudio.c > @@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg) > return NULL; > } > > - hw->conv (hw->conv_buf + wpos, buf, chunk, &nominal_volume); > + hw->conv (hw->conv_buf + wpos, buf, chunk); > wpos = (wpos + chunk) % hw->samples; > to_grab -= chunk; > } > diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c > index 373e4c4..a5c0d6b 100644 > --- a/audio/spiceaudio.c > +++ b/audio/spiceaudio.c > @@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw) > len[1] = 0; > } > > - hw->conv (hw->conv_buf + hw->wpos, samples, len[0], &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, samples, len[0]); > > if (len[1]) { > - hw->conv (hw->conv_buf, samples + len[0], len[1], > - &nominal_volume); > + hw->conv (hw->conv_buf, samples + len[0], len[1]); > } > > hw->wpos = (hw->wpos + num_samples) % hw->samples; > diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c > index cdf483b..e5ad3c6 100644 > --- a/audio/winwaveaudio.c > +++ b/audio/winwaveaudio.c > @@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw) > int conv = audio_MIN (left, decr); > hw->conv (hw->conv_buf + hw->wpos, > advance (wave->pcm_buf, wave->rpos << hw->info.shift), > - conv, > - &nominal_volume); > + conv); > > wave->rpos = (wave->rpos + conv) % hw->samples; > hw->wpos = (hw->wpos + conv) % hw->samples; [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 259 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing 2011-01-10 20:43 ` [Qemu-devel] " Jan Kiszka @ 2011-01-10 20:52 ` malc 2011-01-10 20:54 ` Jan Kiszka 2011-01-11 6:09 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang 1 sibling, 1 reply; 11+ messages in thread From: malc @ 2011-01-10 20:52 UTC (permalink / raw) To: Jan Kiszka; +Cc: Michael Walle, qemu-devel On Mon, 10 Jan 2011, Jan Kiszka wrote: > Am 05.01.2011 01:05, Michael Walle wrote: > > Refactor the volume mixing, so it can be reused for capturing devices. > > Additionally, it removes superfluous multiplications with the nominal > > volume within the hardware voice code path. > > At least based on tests done with the Musicpal, I see problems with this > patch, volume control still fine here. "I see problems" or "I see _no_ problems". [..snip..] -- mailto:av1474@comtv.ru ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing 2011-01-10 20:52 ` malc @ 2011-01-10 20:54 ` Jan Kiszka 0 siblings, 0 replies; 11+ messages in thread From: Jan Kiszka @ 2011-01-10 20:54 UTC (permalink / raw) To: malc; +Cc: Michael Walle, qemu-devel [-- Attachment #1: Type: text/plain, Size: 543 bytes --] Am 10.01.2011 21:52, malc wrote: > On Mon, 10 Jan 2011, Jan Kiszka wrote: > >> Am 05.01.2011 01:05, Michael Walle wrote: >>> Refactor the volume mixing, so it can be reused for capturing devices. >>> Additionally, it removes superfluous multiplications with the nominal >>> volume within the hardware voice code path. >> >> At least based on tests done with the Musicpal, I see problems with this >> patch, volume control still fine here. > > "I see problems" or "I see _no_ problems". Sorry, "no problem" of course. Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 259 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing 2011-01-10 20:43 ` [Qemu-devel] " Jan Kiszka 2011-01-10 20:52 ` malc @ 2011-01-11 6:09 ` Schildbach, Wolfgang 2011-01-11 22:50 ` Michael Walle 1 sibling, 1 reply; 11+ messages in thread From: Schildbach, Wolfgang @ 2011-01-11 6:09 UTC (permalink / raw) To: Jan Kiszka, Michael Walle; +Cc: qemu-devel The fixed point path for scaling in mixeng_volume() seems to be under by a factor of two, IMHO. The right shift should be by 31, not 32. (Because the volume, which I assume is a signed 32 bit integer, can be 0.5 at most). Does the code work with FLOAT_MIXENG undefined? - Wolfgang Schildbach -----Original Message----- From: qemu-devel-bounces+wschi=dolby.com@nongnu.org [mailto:qemu-devel-bounces+wschi=dolby.com@nongnu.org] On Behalf Of Jan Kiszka Sent: Monday, January 10, 2011 9:44 PM To: Michael Walle Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Am 05.01.2011 01:05, Michael Walle wrote: > Refactor the volume mixing, so it can be reused for capturing devices. > Additionally, it removes superfluous multiplications with the nominal > volume within the hardware voice code path. At least based on tests done with the Musicpal, I see problems with this patch, volume control still fine here. Jan > > Signed-off-by: Michael Walle <michael@walle.cc> > --- > audio/alsaaudio.c | 2 +- > audio/audio.c | 11 ++++++----- > audio/audio_int.h | 2 +- > audio/dsoundaudio.c | 4 ++-- > audio/esdaudio.c | 3 +-- > audio/fmodaudio.c | 4 ++-- > audio/mixeng.c | 25 +++++++++++++++++++++++++ > audio/mixeng.h | 4 ++-- > audio/mixeng_template.h | 39 +++++++-------------------------------- > audio/ossaudio.c | 3 +-- > audio/paaudio.c | 2 +- > audio/spiceaudio.c | 5 ++--- > audio/winwaveaudio.c | 3 +-- > 13 files changed, 52 insertions(+), 55 deletions(-) > > diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index > fef24f6..301a6af 100644 > --- a/audio/alsaaudio.c > +++ b/audio/alsaaudio.c > @@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw) > } > } > > - hw->conv (dst, src, nread, &nominal_volume); > + hw->conv (dst, src, nread); > > src = advance (src, nread << hwshift); > dst += nread; > diff --git a/audio/audio.c b/audio/audio.c index 1707446..1729c0b > 100644 > --- a/audio/audio.c > +++ b/audio/audio.c > @@ -104,7 +104,7 @@ static struct { > > static AudioState glob_audio_state; > > -struct mixeng_volume nominal_volume = { > +const struct mixeng_volume nominal_volume = { > .mute = 0, > #ifdef FLOAT_MIXENG > .r = 1.0, > @@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct > audio_pcm_info *info, void *buf, int len) > /* > * Capture > */ > -static void noop_conv (struct st_sample *dst, const void *src, > - int samples, struct mixeng_volume *vol) > +static void noop_conv (struct st_sample *dst, const void *src, int > +samples) > { > (void) src; > (void) dst; > (void) samples; > - (void) vol; > } > > static CaptureVoiceOut *audio_pcm_capture_find_specific ( @@ -956,6 > +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size) > total += isamp; > } > > + mixeng_volume (sw->buf, ret, &sw->vol); > + > sw->clip (buf, sw->buf, ret); > sw->total_hw_samples_acquired += total; > return ret << sw->info.shift; > @@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size) > swlim = ((int64_t) dead << 32) / sw->ratio; > swlim = audio_MIN (swlim, samples); > if (swlim) { > - sw->conv (sw->buf, buf, swlim, &sw->vol); > + sw->conv (sw->buf, buf, swlim); > + mixeng_volume (sw->buf, swlim, &sw->vol); > } > > while (swlim) { > diff --git a/audio/audio_int.h b/audio/audio_int.h index > d66f2c3..2003f8b 100644 > --- a/audio/audio_int.h > +++ b/audio/audio_int.h > @@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver; > extern struct audio_driver pa_audio_driver; extern struct > audio_driver spice_audio_driver; extern struct audio_driver > winwave_audio_driver; -extern struct mixeng_volume nominal_volume; > +extern const struct mixeng_volume nominal_volume; > > void audio_pcm_init_info (struct audio_pcm_info *info, struct > audsettings *as); void audio_pcm_info_clear_buf (struct > audio_pcm_info *info, void *buf, int len); diff --git > a/audio/dsoundaudio.c b/audio/dsoundaudio.c index e547955..e2d89fd > 100644 > --- a/audio/dsoundaudio.c > +++ b/audio/dsoundaudio.c > @@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw) > decr = len1 + len2; > > if (p1 && len1) { > - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, p1, len1); > } > > if (p2 && len2) { > - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); > + hw->conv (hw->conv_buf, p2, len2); > } > > dsound_unlock_in (dscb, p1, p2, blen1, blen2); diff --git > a/audio/esdaudio.c b/audio/esdaudio.c index 9a1f2f8..ff97b39 100644 > --- a/audio/esdaudio.c > +++ b/audio/esdaudio.c > @@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg) > break; > } > > - hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift, > - &nominal_volume); > + hw->conv (hw->conv_buf + wpos, buf, nread >> > + hw->info.shift); > wpos = (wpos + chunk) % hw->samples; > to_grab -= chunk; > } > diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c index > 7f08e14..c34cf53 100644 > --- a/audio/fmodaudio.c > +++ b/audio/fmodaudio.c > @@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw) > decr = len1 + len2; > > if (p1 && blen1) { > - hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, p1, len1); > } > if (p2 && len2) { > - hw->conv (hw->conv_buf, p2, len2, &nominal_volume); > + hw->conv (hw->conv_buf, p2, len2); > } > > fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2); diff > --git a/audio/mixeng.c b/audio/mixeng.c index 9f1d93f..4a9e8eb 100644 > --- a/audio/mixeng.c > +++ b/audio/mixeng.c > @@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int > len) { > memset (buf, 0, len * sizeof (struct st_sample)); } > + > +void mixeng_volume (struct st_sample *buf, int len, struct > +mixeng_volume *vol) { #ifdef CONFIG_MIXEMU > + if (vol->mute) { > + mixeng_clear (buf, len); > + return; > + } > + > + while (len--) { > +#ifdef FLOAT_MIXENG > + buf->l = buf->l * vol->l; > + buf->r = buf->r * vol->r; > +#else > + buf->l = (buf->l * vol->l) >> 32; > + buf->r = (buf->r * vol->r) >> 32; #endif > + buf += 1; > + } > +#else > + (void) buf; > + (void) len; > + (void) vol; > +#endif > +} > diff --git a/audio/mixeng.h b/audio/mixeng.h index 4af1dd9..9de443b > 100644 > --- a/audio/mixeng.h > +++ b/audio/mixeng.h > @@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t > l; }; struct st_sample { int64_t l; int64_t r; }; #endif > > -typedef void (t_sample) (struct st_sample *dst, const void *src, > - int samples, struct mixeng_volume *vol); > +typedef void (t_sample) (struct st_sample *dst, const void *src, int > +samples); > typedef void (f_sample) (void *dst, const struct st_sample *src, int > samples); > > extern t_sample *mixeng_conv[2][2][2][3]; @@ -47,5 +46,6 @@ void > st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *o > int *isamp, int *osamp); void st_rate_stop > (void *opaque); void mixeng_clear (struct st_sample *buf, int len); > +void mixeng_volume (struct st_sample *buf, int len, struct > +mixeng_volume *vol); > > #endif /* mixeng.h */ > diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index > 5617705..a2d0ef8 100644 > --- a/audio/mixeng_template.h > +++ b/audio/mixeng_template.h > @@ -31,16 +31,6 @@ > #define HALF (IN_MAX >> 1) > #endif > > -#ifdef CONFIG_MIXEMU > -#ifdef FLOAT_MIXENG > -#define VOL(a, b) ((a) * (b)) > -#else > -#define VOL(a, b) ((a) * (b)) >> 32 > -#endif > -#else > -#define VOL(a, b) a > -#endif > - > #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T)) > > #ifdef FLOAT_MIXENG > @@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v) > #endif > > static void glue (glue (conv_, ET), _to_stereo) > - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) > + (struct st_sample *dst, const void *src, int samples) > { > struct st_sample *out = dst; > IN_T *in = (IN_T *) src; > -#ifdef CONFIG_MIXEMU > - if (vol->mute) { > - mixeng_clear (dst, samples); > - return; > - } > -#else > - (void) vol; > -#endif > + > while (samples--) { > - out->l = VOL (glue (conv_, ET) (*in++), vol->l); > - out->r = VOL (glue (conv_, ET) (*in++), vol->r); > + out->l = glue (conv_, ET) (*in++); > + out->r = glue (conv_, ET) (*in++); > out += 1; > } > } > > static void glue (glue (conv_, ET), _to_mono) > - (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol) > + (struct st_sample *dst, const void *src, int samples) > { > struct st_sample *out = dst; > IN_T *in = (IN_T *) src; > -#ifdef CONFIG_MIXEMU > - if (vol->mute) { > - mixeng_clear (dst, samples); > - return; > - } > -#else > - (void) vol; > -#endif > + > while (samples--) { > - out->l = VOL (glue (conv_, ET) (in[0]), vol->l); > + out->l = glue (conv_, ET) (in[0]); > out->r = out->l; > out += 1; > in += 1; > @@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono) > > #undef ET > #undef HALF > -#undef VOL > diff --git a/audio/ossaudio.c b/audio/ossaudio.c index > 0439ef5..1fda519 100644 > --- a/audio/ossaudio.c > +++ b/audio/ossaudio.c > @@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw) > hw->info.align + 1); > } > read_samples += nread >> hwshift; > - hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift, > - &nominal_volume); > + hw->conv (hw->conv_buf + bufs[i].add, p, nread >> > + hwshift); > } > > if (bufs[i].len - nread) { diff --git a/audio/paaudio.c > b/audio/paaudio.c index ff71dac..9cf685d 100644 > --- a/audio/paaudio.c > +++ b/audio/paaudio.c > @@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg) > return NULL; > } > > - hw->conv (hw->conv_buf + wpos, buf, chunk, &nominal_volume); > + hw->conv (hw->conv_buf + wpos, buf, chunk); > wpos = (wpos + chunk) % hw->samples; > to_grab -= chunk; > } > diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index > 373e4c4..a5c0d6b 100644 > --- a/audio/spiceaudio.c > +++ b/audio/spiceaudio.c > @@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw) > len[1] = 0; > } > > - hw->conv (hw->conv_buf + hw->wpos, samples, len[0], &nominal_volume); > + hw->conv (hw->conv_buf + hw->wpos, samples, len[0]); > > if (len[1]) { > - hw->conv (hw->conv_buf, samples + len[0], len[1], > - &nominal_volume); > + hw->conv (hw->conv_buf, samples + len[0], len[1]); > } > > hw->wpos = (hw->wpos + num_samples) % hw->samples; diff --git > a/audio/winwaveaudio.c b/audio/winwaveaudio.c index cdf483b..e5ad3c6 > 100644 > --- a/audio/winwaveaudio.c > +++ b/audio/winwaveaudio.c > @@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw) > int conv = audio_MIN (left, decr); > hw->conv (hw->conv_buf + hw->wpos, > advance (wave->pcm_buf, wave->rpos << hw->info.shift), > - conv, > - &nominal_volume); > + conv); > > wave->rpos = (wave->rpos + conv) % hw->samples; > hw->wpos = (hw->wpos + conv) % hw->samples; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing 2011-01-11 6:09 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang @ 2011-01-11 22:50 ` Michael Walle 2011-01-11 23:15 ` malc 0 siblings, 1 reply; 11+ messages in thread From: Michael Walle @ 2011-01-11 22:50 UTC (permalink / raw) To: Schildbach, Wolfgang; +Cc: Jan Kiszka, qemu-devel Hi Wolfgang, > The fixed point path for scaling in mixeng_volume() seems to be under by > a factor of two, IMHO. The right shift should be by 31, not 32. (Because > the volume, which I assume is a signed 32 bit integer, can be 0.5 at > most). I must admit i just copied the shift from the original define. But the volume and the samples are signed 64bit values. @malc: any comments on this? > Does the code work with FLOAT_MIXENG undefined? At least for my input voice, it works with integer arithmetic. -- Michael ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing 2011-01-11 22:50 ` Michael Walle @ 2011-01-11 23:15 ` malc 2011-01-12 8:24 ` [Qemu-devel] " Schildbach, Wolfgang 0 siblings, 1 reply; 11+ messages in thread From: malc @ 2011-01-11 23:15 UTC (permalink / raw) To: Michael Walle; +Cc: Jan Kiszka, Schildbach, Wolfgang, qemu-devel On Tue, 11 Jan 2011, Michael Walle wrote: > > Hi Wolfgang, > > > The fixed point path for scaling in mixeng_volume() seems to be under by > > a factor of two, IMHO. The right shift should be by 31, not 32. (Because > > the volume, which I assume is a signed 32 bit integer, can be 0.5 at > > most). > I must admit i just copied the shift from the original define. But the volume > and the samples are signed 64bit values. > > @malc: any comments on this? I don't understand the problem, the result of multiplication is converted from 32.32 fixed point to integer by shifting right by 32.. It escapes me how 31 fits here. > > > Does the code work with FLOAT_MIXENG undefined? > At least for my input voice, it works with integer arithmetic. > > -- mailto:av1474@comtv.ru ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] RE: [PATCH] audio: split sample conversion and volumemixing 2011-01-11 23:15 ` malc @ 2011-01-12 8:24 ` Schildbach, Wolfgang 0 siblings, 0 replies; 11+ messages in thread From: Schildbach, Wolfgang @ 2011-01-12 8:24 UTC (permalink / raw) To: malc, Michael Walle; +Cc: Jan Kiszka, qemu-devel Ah, I assumed that the volume would be stored in a 32 bit integer, and be represented as a signed Q31 fixed point. Sorry for the noise. - Wolfgang -----Original Message----- From: malc [mailto:av1474@comtv.ru] Sent: Wednesday, January 12, 2011 12:15 AM To: Michael Walle Cc: Schildbach, Wolfgang; Jan Kiszka; qemu-devel@nongnu.org Subject: Re: [PATCH] audio: split sample conversion and volumemixing On Tue, 11 Jan 2011, Michael Walle wrote: > > Hi Wolfgang, > > > The fixed point path for scaling in mixeng_volume() seems to be > > under by a factor of two, IMHO. The right shift should be by 31, not > > 32. (Because the volume, which I assume is a signed 32 bit integer, > > can be 0.5 at most). > I must admit i just copied the shift from the original define. But the > volume and the samples are signed 64bit values. > > @malc: any comments on this? I don't understand the problem, the result of multiplication is converted from 32.32 fixed point to integer by shifting right by 32.. It escapes me how 31 fits here. > > > Does the code work with FLOAT_MIXENG undefined? > At least for my input voice, it works with integer arithmetic. > > -- mailto:av1474@comtv.ru ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing 2011-01-05 0:05 ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle 2011-01-10 20:43 ` [Qemu-devel] " Jan Kiszka @ 2011-01-12 15:44 ` malc 1 sibling, 0 replies; 11+ messages in thread From: malc @ 2011-01-12 15:44 UTC (permalink / raw) To: Michael Walle; +Cc: qemu-devel On Wed, 5 Jan 2011, Michael Walle wrote: > Refactor the volume mixing, so it can be reused for capturing devices. > Additionally, it removes superfluous multiplications with the nominal > volume within the hardware voice code path. Thanks, applied. [..snip..] -- mailto:av1474@comtv.ru ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-01-12 15:44 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-01-03 23:05 [Qemu-devel] audio: Mixing engine and mixer emulation Michael Walle 2011-01-04 0:08 ` [Qemu-devel] " malc 2011-01-05 0:05 ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle 2011-01-10 20:43 ` [Qemu-devel] " Jan Kiszka 2011-01-10 20:52 ` malc 2011-01-10 20:54 ` Jan Kiszka 2011-01-11 6:09 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang 2011-01-11 22:50 ` Michael Walle 2011-01-11 23:15 ` malc 2011-01-12 8:24 ` [Qemu-devel] " Schildbach, Wolfgang 2011-01-12 15:44 ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.