[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 45/50] audio: replace shift in audio_pcm_info wit
From: |
Kővágó, Zoltán |
Subject: |
[Qemu-devel] [PATCH v3 45/50] audio: replace shift in audio_pcm_info with bytes_per_frame |
Date: |
Thu, 17 Jan 2019 00:37:18 +0100 |
The bit shifting trick worked because the number of bytes per frame was
always a power-of-two (since QEMU only supports mono, stereo and 8, 16
and 32 bit samples). But if we want to add support for surround sound,
this no longer holds true.
Signed-off-by: Kővágó, Zoltán <address@hidden>
---
audio/audio_int.h | 3 +-
audio/dsound_template.h | 10 +++---
audio/alsaaudio.c | 10 +++---
audio/audio.c | 76 ++++++++++++++++++++---------------------
audio/coreaudio.c | 4 +--
audio/dsoundaudio.c | 4 +--
audio/noaudio.c | 2 +-
audio/ossaudio.c | 14 ++++----
audio/spiceaudio.c | 5 +--
audio/wavaudio.c | 6 ++--
10 files changed, 67 insertions(+), 67 deletions(-)
diff --git a/audio/audio_int.h b/audio/audio_int.h
index cef749d647..925552a2f7 100644
--- a/audio/audio_int.h
+++ b/audio/audio_int.h
@@ -43,8 +43,7 @@ struct audio_pcm_info {
int sign;
int freq;
int nchannels;
- int align;
- int shift;
+ int bytes_per_frame;
int bytes_per_second;
int swap_endianness;
};
diff --git a/audio/dsound_template.h b/audio/dsound_template.h
index 6a10b6751b..31d356d084 100644
--- a/audio/dsound_template.h
+++ b/audio/dsound_template.h
@@ -98,8 +98,8 @@ static int glue (dsound_lock_, TYPE) (
goto fail;
}
- if ((p1p && *p1p && (*blen1p & info->align)) ||
- (p2p && *p2p && (*blen2p & info->align))) {
+ if ((p1p && *p1p && (*blen1p % info->bytes_per_frame)) ||
+ (p2p && *p2p && (*blen2p % info->bytes_per_frame))) {
dolog ("DirectSound returned misaligned buffer %ld %ld\n",
*blen1p, *blen2p);
glue (dsound_unlock_, TYPE) (buf, *p1p, p2p ? *p2p : NULL, *blen1p,
@@ -247,14 +247,14 @@ static int dsound_init_out(HWVoiceOut *hw, struct
audsettings *as,
obt_as.endianness = 0;
audio_pcm_init_info (&hw->info, &obt_as);
- if (bc.dwBufferBytes & hw->info.align) {
+ if (bc.dwBufferBytes % hw->info.bytes_per_frame) {
dolog (
"GetCaps returned misaligned buffer size %ld, alignment %d\n",
- bc.dwBufferBytes, hw->info.align + 1
+ bc.dwBufferBytes, hw->info.bytes_per_frame
);
}
hw->size_emul = bc.dwBufferBytes;
- ds->samples = bc.dwBufferBytes >> hw->info.shift;
+ ds->samples = bc.dwBufferBytes / hw->info.bytes_per_frame;
ds->s = s;
#ifdef DEBUG_DSOUND
diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
index 446bb90ceb..3e5c800d38 100644
--- a/audio/alsaaudio.c
+++ b/audio/alsaaudio.c
@@ -611,7 +611,7 @@ static size_t alsa_write(HWVoiceOut *hw, void *buf, size_t
len)
{
ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
size_t pos = 0;
- size_t len_frames = len >> hw->info.shift;
+ size_t len_frames = len / hw->info.bytes_per_frame;
while (len_frames) {
char *src = advance(buf, pos);
@@ -655,7 +655,7 @@ static size_t alsa_write(HWVoiceOut *hw, void *buf, size_t
len)
}
}
- pos += written << hw->info.shift;
+ pos += written * hw->info.bytes_per_frame;
if (written < len_frames) {
break;
}
@@ -821,7 +821,7 @@ static size_t alsa_read(HWVoiceIn *hw, void *buf, size_t
len)
void *dst = advance(buf, pos);
snd_pcm_sframes_t nread;
- nread = snd_pcm_readi(alsa->handle, dst, len >> hw->info.shift);
+ nread = snd_pcm_readi(alsa->handle, dst, len /
hw->info.bytes_per_frame);
if (nread <= 0) {
switch (nread) {
@@ -847,8 +847,8 @@ static size_t alsa_read(HWVoiceIn *hw, void *buf, size_t
len)
}
}
- pos += nread << hw->info.shift;
- len -= nread << hw->info.shift;
+ pos += nread * hw->info.bytes_per_frame;
+ len -= nread * hw->info.bytes_per_frame;
}
return pos;
diff --git a/audio/audio.c b/audio/audio.c
index a5ee0c4324..c89e82443d 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -297,26 +297,27 @@ static int audio_pcm_info_eq (struct audio_pcm_info
*info, struct audsettings *a
void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as)
{
- int bits = 8, sign = 0, shift = 0;
+ int bits = 8, sign = 0, mul;
switch (as->fmt) {
case AUDIO_FORMAT_S8:
sign = 1;
case AUDIO_FORMAT_U8:
+ mul = 1;
break;
case AUDIO_FORMAT_S16:
sign = 1;
case AUDIO_FORMAT_U16:
bits = 16;
- shift = 1;
+ mul = 2;
break;
case AUDIO_FORMAT_S32:
sign = 1;
case AUDIO_FORMAT_U32:
bits = 32;
- shift = 2;
+ mul = 4;
break;
default:
@@ -327,9 +328,8 @@ void audio_pcm_init_info (struct audio_pcm_info *info,
struct audsettings *as)
info->bits = bits;
info->sign = sign;
info->nchannels = as->nchannels;
- info->shift = (as->nchannels == 2) + shift;
- info->align = (1 << info->shift) - 1;
- info->bytes_per_second = info->freq << info->shift;
+ info->bytes_per_frame = as->nchannels * mul;
+ info->bytes_per_second = info->freq * info->bytes_per_frame;
info->swap_endianness = (as->endianness != AUDIO_HOST_ENDIANNESS);
}
@@ -340,26 +340,25 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info
*info, void *buf, int len)
}
if (info->sign) {
- memset (buf, 0x00, len << info->shift);
+ memset (buf, 0x00, len * info->bytes_per_frame);
}
else {
switch (info->bits) {
case 8:
- memset (buf, 0x80, len << info->shift);
+ memset (buf, 0x80, len * info->bytes_per_frame);
break;
case 16:
{
int i;
uint16_t *p = buf;
- int shift = info->nchannels - 1;
short s = INT16_MAX;
if (info->swap_endianness) {
s = bswap16 (s);
}
- for (i = 0; i < len << shift; i++) {
+ for (i = 0; i < len * info->nchannels; i++) {
p[i] = s;
}
}
@@ -369,14 +368,13 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info
*info, void *buf, int len)
{
int i;
uint32_t *p = buf;
- int shift = info->nchannels - 1;
int32_t s = INT32_MAX;
if (info->swap_endianness) {
s = bswap32 (s);
}
- for (i = 0; i < len << shift; i++) {
+ for (i = 0; i < len * info->nchannels; i++) {
p[i] = s;
}
}
@@ -559,7 +557,7 @@ static void audio_pcm_hw_clip_out(HWVoiceOut *hw, void
*pcm_buf, size_t len)
while (len) {
st_sample *src = hw->mix_buf->samples + pos;
- uint8_t *dst = advance (pcm_buf, clipped << hw->info.shift);
+ uint8_t *dst = advance(pcm_buf, clipped * hw->info.bytes_per_frame);
size_t samples_till_end_of_buf = hw->mix_buf->size - pos;
size_t samples_to_clip = MIN(len, samples_till_end_of_buf);
@@ -608,7 +606,7 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf,
size_t size)
return 0;
}
- samples = size >> sw->info.shift;
+ samples = size / sw->info.bytes_per_frame;
if (!live) {
return 0;
}
@@ -643,7 +641,7 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf,
size_t size)
sw->clip (buf, sw->buf, ret);
sw->total_hw_samples_acquired += total;
- return ret << sw->info.shift;
+ return ret * sw->info.bytes_per_frame;
}
/*
@@ -716,7 +714,7 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf,
size_t size)
}
wpos = (sw->hw->mix_buf->pos + live) % hwsamples;
- samples = size >> sw->info.shift;
+ samples = size / sw->info.bytes_per_frame;
dead = hwsamples - live;
swlim = ((int64_t) dead << 32) / sw->ratio;
@@ -760,13 +758,13 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void
*buf, size_t size)
dolog (
"%s: write size %zu ret %zu total sw %zu\n",
SW_NAME (sw),
- size >> sw->info.shift,
+ size / sw->info.bytes_per_frame,
ret,
sw->total_hw_samples_mixed
);
#endif
- return ret << sw->info.shift;
+ return ret * sw->info.bytes_per_frame;
}
#ifdef DEBUG_AUDIO
@@ -883,7 +881,7 @@ size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
int AUD_get_buffer_size_out (SWVoiceOut *sw)
{
- return sw->hw->mix_buf->size << sw->hw->info.shift;
+ return sw->hw->mix_buf->size * sw->hw->info.bytes_per_frame;
}
void AUD_set_active_out (SWVoiceOut *sw, int on)
@@ -999,10 +997,10 @@ static size_t audio_get_avail (SWVoiceIn *sw)
ldebug (
"%s: get_avail live %d ret %" PRId64 "\n",
SW_NAME (sw),
- live, (((int64_t) live << 32) / sw->ratio) << sw->info.shift
+ live, (((int64_t) live << 32) / sw->ratio) * sw->info.bytes_per_frame
);
- return (((int64_t) live << 32) / sw->ratio) << sw->info.shift;
+ return (((int64_t) live << 32) / sw->ratio) * sw->info.bytes_per_frame;
}
static size_t audio_get_free(SWVoiceOut *sw)
@@ -1026,10 +1024,11 @@ static size_t audio_get_free(SWVoiceOut *sw)
#ifdef DEBUG_OUT
dolog ("%s: get_free live %d dead %d ret %" PRId64 "\n",
SW_NAME (sw),
- live, dead, (((int64_t) dead << 32) / sw->ratio) << sw->info.shift);
+ live, dead, (((int64_t) dead << 32) / sw->ratio) *
+ sw->info.bytes_per_frame);
#endif
- return (((int64_t) dead << 32) / sw->ratio) << sw->info.shift;
+ return (((int64_t) dead << 32) / sw->ratio) * sw->info.bytes_per_frame;
}
static void audio_capture_mix_and_clear(HWVoiceOut *hw, size_t rpos,
@@ -1048,7 +1047,7 @@ static void audio_capture_mix_and_clear(HWVoiceOut *hw,
size_t rpos,
while (n) {
size_t till_end_of_hw = hw->mix_buf->size - rpos2;
size_t to_write = MIN(till_end_of_hw, n);
- size_t bytes = to_write << hw->info.shift;
+ size_t bytes = to_write * hw->info.bytes_per_frame;
size_t written;
sw->buf = hw->mix_buf->samples + rpos2;
@@ -1078,10 +1077,11 @@ static size_t audio_pcm_hw_run_out(HWVoiceOut *hw,
size_t live)
size_t size, decr, proc;
void *buf = hw->pcm_ops->get_buffer_out(hw, &size);
- decr = MIN(size >> hw->info.shift, live);
+ decr = MIN(size / hw->info.bytes_per_frame, live);
audio_pcm_hw_clip_out(hw, buf, decr);
- proc = hw->pcm_ops->put_buffer_out(hw, buf, decr << hw->info.shift) >>
- hw->info.shift;
+ proc = hw->pcm_ops->put_buffer_out(hw, buf,
+ decr * hw->info.bytes_per_frame) /
+ hw->info.bytes_per_frame;
live -= proc;
clipped += proc;
@@ -1230,16 +1230,16 @@ static size_t audio_pcm_hw_run_in(HWVoiceIn *hw, size_t
samples)
while (samples) {
size_t proc;
- size_t size = samples << hw->info.shift;
+ size_t size = samples * hw->info.bytes_per_frame;
void *buf = hw->pcm_ops->get_buffer_in(hw, &size);
- assert((size & hw->info.align) == 0);
+ assert(size % hw->info.bytes_per_frame == 0);
if (size == 0) {
hw->pcm_ops->put_buffer_in(hw, buf, size);
break;
}
- proc = MIN(size >> hw->info.shift,
+ proc = MIN(size / hw->info.bytes_per_frame,
conv_buf->size - conv_buf->pos);
hw->conv(conv_buf->samples + conv_buf->pos, buf, proc);
@@ -1247,7 +1247,7 @@ static size_t audio_pcm_hw_run_in(HWVoiceIn *hw, size_t
samples)
samples -= proc;
conv += proc;
- hw->pcm_ops->put_buffer_in(hw, buf, proc << hw->info.shift);
+ hw->pcm_ops->put_buffer_in(hw, buf, proc * hw->info.bytes_per_frame);
}
return conv;
@@ -1321,7 +1321,7 @@ static void audio_run_capture (AudioState *s)
for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
cb->ops.capture (cb->opaque, cap->buf,
- to_capture << hw->info.shift);
+ to_capture * hw->info.bytes_per_frame);
}
rpos = (rpos + to_capture) % hw->mix_buf->size;
live -= to_capture;
@@ -1374,7 +1374,7 @@ void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t
*size)
ssize_t start;
if (unlikely(!hw->buf_emul)) {
- size_t calc_size = hw->conv_buf->size << hw->info.shift;
+ size_t calc_size = hw->conv_buf->size * hw->info.bytes_per_frame;
hw->buf_emul = g_malloc(calc_size);
hw->size_emul = calc_size;
hw->pos_emul = hw->pending_emul = 0;
@@ -1410,7 +1410,7 @@ void audio_generic_put_buffer_in(HWVoiceIn *hw, void
*buf, size_t size)
void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size)
{
if (unlikely(!hw->buf_emul)) {
- size_t calc_size = hw->mix_buf->size << hw->info.shift;
+ size_t calc_size = hw->mix_buf->size * hw->info.bytes_per_frame;
hw->buf_emul = g_malloc(calc_size);
hw->size_emul = calc_size;
@@ -1829,11 +1829,11 @@ CaptureVoiceOut *AUD_add_capture(
audio_pcm_init_info (&hw->info, as);
cap->buf = audio_calloc(__func__, hw->mix_buf->size,
- 1 << hw->info.shift);
+ hw->info.bytes_per_frame);
if (!cap->buf) {
dolog ("Could not allocate capture buffer "
"(%zu samples, each %d bytes)\n",
- hw->mix_buf->size, 1 << hw->info.shift);
+ hw->mix_buf->size, hw->info.bytes_per_frame);
goto err3;
}
@@ -2132,14 +2132,14 @@ size_t audio_rate_get_bytes(struct audio_pcm_info
*info, RateCtl *rate,
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
ticks = now - rate->start_ticks;
bytes = muldiv64(ticks, info->bytes_per_second, NANOSECONDS_PER_SECOND);
- samples = (bytes - rate->bytes_sent) >> info->shift;
+ samples = (bytes - rate->bytes_sent) / info->bytes_per_frame;
if (samples < 0 || samples > 65536) {
AUD_log(NULL, "Resetting rate control (%" PRId64 " samples)", samples);
audio_rate_start(rate);
samples = 0;
}
- ret = MIN(samples << info->shift, bytes_avail);
+ ret = MIN(samples * info->bytes_per_frame, bytes_avail);
rate->bytes_sent += ret;
return ret;
}
diff --git a/audio/coreaudio.c b/audio/coreaudio.c
index 508bee19d4..f011f4db59 100644
--- a/audio/coreaudio.c
+++ b/audio/coreaudio.c
@@ -441,7 +441,7 @@ static OSStatus audioDeviceIOProc(
}
frameCount = core->audioDevicePropertyBufferFrameSize;
- pending_frames = hw->pending_emul >> hw->info.shift;
+ pending_frames = hw->pending_emul / hw->info.bytes_per_frame;
/* if there are not enough samples, set signal and return */
if (pending_frames < frameCount) {
@@ -450,7 +450,7 @@ static OSStatus audioDeviceIOProc(
return 0;
}
- len = frameCount << hw->info.shift;
+ len = frameCount * hw->info.bytes_per_frame;
while (len) {
size_t write_len;
ssize_t start = ((ssize_t) hw->pos_emul) - hw->pending_emul;
diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c
index da9276c268..4bf2be74c1 100644
--- a/audio/dsoundaudio.c
+++ b/audio/dsoundaudio.c
@@ -322,8 +322,8 @@ static void dsound_clear_sample (HWVoiceOut *hw,
LPDIRECTSOUNDBUFFER dsb,
return;
}
- len1 = blen1 >> hw->info.shift;
- len2 = blen2 >> hw->info.shift;
+ len1 = blen1 / hw->info.bytes_per_frame;
+ len2 = blen2 / hw->info.bytes_per_frame;
#ifdef DEBUG_DSOUND
dolog ("clear %p,%ld,%ld %p,%ld,%ld\n",
diff --git a/audio/noaudio.c b/audio/noaudio.c
index c8bcfa9bca..65ef953104 100644
--- a/audio/noaudio.c
+++ b/audio/noaudio.c
@@ -88,7 +88,7 @@ static size_t no_read(HWVoiceIn *hw, void *buf, size_t size)
NoVoiceIn *no = (NoVoiceIn *) hw;
int64_t bytes = audio_rate_get_bytes(&hw->info, &no->rate, size);
- audio_pcm_info_clear_buf(&hw->info, buf, bytes >> hw->info.shift);
+ audio_pcm_info_clear_buf(&hw->info, buf, bytes / hw->info.bytes_per_frame);
return bytes;
}
diff --git a/audio/ossaudio.c b/audio/ossaudio.c
index f12d8a95bd..2afa7fbfa1 100644
--- a/audio/ossaudio.c
+++ b/audio/ossaudio.c
@@ -507,16 +507,16 @@ static int oss_init_out(HWVoiceOut *hw, struct
audsettings *as,
oss->nfrags = obt.nfrags;
oss->fragsize = obt.fragsize;
- if (obt.nfrags * obt.fragsize & hw->info.align) {
+ if (obt.nfrags * obt.fragsize % hw->info.bytes_per_frame) {
dolog ("warning: Misaligned DAC buffer, size %d, alignment %d\n",
- obt.nfrags * obt.fragsize, hw->info.align + 1);
+ obt.nfrags * obt.fragsize, hw->info.bytes_per_frame);
}
- oss->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+ oss->samples = (obt.nfrags * obt.fragsize) / hw->info.bytes_per_frame;
oss->mmapped = 0;
if (oopts->has_try_mmap && oopts->try_mmap) {
- hw->size_emul = oss->samples << hw->info.shift;
+ hw->size_emul = oss->samples * hw->info.bytes_per_frame;
hw->buf_emul = mmap (
NULL,
hw->size_emul,
@@ -651,12 +651,12 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings
*as, void *drv_opaque)
oss->nfrags = obt.nfrags;
oss->fragsize = obt.fragsize;
- if (obt.nfrags * obt.fragsize & hw->info.align) {
+ if (obt.nfrags * obt.fragsize % hw->info.bytes_per_frame) {
dolog ("warning: Misaligned ADC buffer, size %d, alignment %d\n",
- obt.nfrags * obt.fragsize, hw->info.align + 1);
+ obt.nfrags * obt.fragsize, hw->info.bytes_per_frame);
}
- oss->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+ oss->samples = (obt.nfrags * obt.fragsize) / hw->info.bytes_per_frame;
oss->fd = fd;
oss->dev = dev;
diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
index b26d10434b..a1c80ff92a 100644
--- a/audio/spiceaudio.c
+++ b/audio/spiceaudio.c
@@ -133,8 +133,9 @@ static void *line_out_get_buffer(HWVoiceOut *hw, size_t
*size)
out->fpos = 0;
}
- *size = audio_rate_get_bytes(&hw->info, &out->rate,
- (out->fsize - out->fpos) << hw->info.shift);
+ *size = audio_rate_get_bytes(
+ &hw->info, &out->rate,
+ (out->fsize - out->fpos) * hw->info.bytes_per_frame);
return out->frame + out->fpos;
}
diff --git a/audio/wavaudio.c b/audio/wavaudio.c
index 672d5fc337..a23f6e710b 100644
--- a/audio/wavaudio.c
+++ b/audio/wavaudio.c
@@ -41,14 +41,14 @@ static size_t wav_write_out(HWVoiceOut *hw, void *buf,
size_t len)
{
WAVVoiceOut *wav = (WAVVoiceOut *) hw;
int64_t bytes = audio_rate_get_bytes(&hw->info, &wav->rate, len);
- assert(bytes >> hw->info.shift << hw->info.shift == bytes);
+ assert(bytes % hw->info.bytes_per_frame == 0);
if (bytes && fwrite(buf, bytes, 1, wav->f) != 1) {
dolog("wav_write_out: fwrite of %zu bytes failed\nReaons: %s\n",
bytes, strerror(errno));
}
- wav->total_samples += bytes >> hw->info.shift;
+ wav->total_samples += bytes / hw->info.bytes_per_frame;
return bytes;
}
@@ -131,7 +131,7 @@ static void wav_fini_out (HWVoiceOut *hw)
WAVVoiceOut *wav = (WAVVoiceOut *) hw;
uint8_t rlen[4];
uint8_t dlen[4];
- uint32_t datalen = wav->total_samples << hw->info.shift;
+ uint32_t datalen = wav->total_samples * hw->info.bytes_per_frame;
uint32_t rifflen = datalen + 36;
if (!wav->f) {
--
2.20.1
- [Qemu-devel] [PATCH v3 02/50] audio: use qapi AudioFormat instead of audfmt_e, (continued)
- [Qemu-devel] [PATCH v3 02/50] audio: use qapi AudioFormat instead of audfmt_e, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 28/50] coreaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 36/50] audio: remove remains of the old backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 04/50] audio: -audiodev command line option basic implementation, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 32/50] paaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 43/50] paaudio: get/put_buffer functions, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 35/50] wavaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 46/50] audio: basic support for multichannel audio, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 44/50] audio: support more than two channels in volume setting, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 24/50] audio: remove read and write pcm_ops, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 45/50] audio: replace shift in audio_pcm_info with bytes_per_frame,
Kővágó, Zoltán <=
- [Qemu-devel] [PATCH v3 37/50] audio: unify input and output mixeng buffer management, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 33/50] sdlaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 26/50] audio: api for mixeng code free backends, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 48/50] usb-audio: do not count on avail bytes actually available, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 41/50] audio: add mixeng option (documentation), Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 27/50] alsaaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 40/50] audio: split ctl_* functions into enable_* and volume_*, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 34/50] spiceaudio: port to the new audio backend api, Kővágó, Zoltán, 2019/01/16
- [Qemu-devel] [PATCH v3 42/50] audio: make mixeng optional, Kővágó, Zoltán, 2019/01/16