From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kővágó@redhat.com, Zoltán <DirtY.iCE.hu@gmail.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>
Subject: [PULL 05/13] audio: make mixeng optional
Date: Fri, 18 Oct 2019 09:41:36 +0200 [thread overview]
Message-ID: <20191018074144.24071-6-kraxel@redhat.com> (raw)
In-Reply-To: <20191018074144.24071-1-kraxel@redhat.com>
From: Kővágó, Zoltán <dirty.ice.hu@gmail.com>
Implementation of the previously added mixing-engine option.
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Message-id: c05bc258889ed289e8ee1bdbcc5e84174ec221e7.1570996490.git.DirtY.iCE.hu@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
audio/audio_template.h | 24 ++++++++++-----
audio/audio.c | 70 ++++++++++++++++++++++++++++++++++++++----
2 files changed, 80 insertions(+), 14 deletions(-)
diff --git a/audio/audio_template.h b/audio/audio_template.h
index 1006d6b1eb8a..3287d7075e6a 100644
--- a/audio/audio_template.h
+++ b/audio/audio_template.h
@@ -78,13 +78,17 @@ static void glue (audio_pcm_hw_free_resources_, TYPE) (HW *hw)
static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw)
{
- size_t samples = hw->samples;
- if (audio_bug(__func__, samples == 0)) {
- dolog("Attempted to allocate empty buffer\n");
- }
+ if (glue(audio_get_pdo_, TYPE)(hw->s->dev)->mixing_engine) {
+ size_t samples = hw->samples;
+ if (audio_bug(__func__, samples == 0)) {
+ dolog("Attempted to allocate empty buffer\n");
+ }
- HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample) * samples);
- HWBUF->size = samples;
+ HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample) * samples);
+ HWBUF->size = samples;
+ } else {
+ HWBUF = NULL;
+ }
}
static void glue (audio_pcm_sw_free_resources_, TYPE) (SW *sw)
@@ -103,6 +107,10 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)
{
int samples;
+ if (!glue(audio_get_pdo_, TYPE)(sw->s->dev)->mixing_engine) {
+ return 0;
+ }
+
samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio;
sw->buf = audio_calloc(__func__, samples, sizeof(struct st_sample));
@@ -328,9 +336,9 @@ static HW *glue(audio_pcm_hw_add_, TYPE)(AudioState *s, struct audsettings *as)
HW *hw;
AudiodevPerDirectionOptions *pdo = glue(audio_get_pdo_, TYPE)(s->dev);
- if (pdo->fixed_settings) {
+ if (!pdo->mixing_engine || pdo->fixed_settings) {
hw = glue(audio_pcm_hw_add_new_, TYPE)(s, as);
- if (hw) {
+ if (!pdo->mixing_engine || hw) {
return hw;
}
}
diff --git a/audio/audio.c b/audio/audio.c
index 7128ee98dc97..d616a4af98bd 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -838,32 +838,46 @@ static void audio_timer (void *opaque)
*/
size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)
{
+ HWVoiceOut *hw;
+
if (!sw) {
/* XXX: Consider options */
return size;
}
+ hw = sw->hw;
- if (!sw->hw->enabled) {
+ if (!hw->enabled) {
dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
return 0;
}
- return audio_pcm_sw_write(sw, buf, size);
+ if (audio_get_pdo_out(hw->s->dev)->mixing_engine) {
+ return audio_pcm_sw_write(sw, buf, size);
+ } else {
+ return hw->pcm_ops->write(hw, buf, size);
+ }
}
size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
{
+ HWVoiceIn *hw;
+
if (!sw) {
/* XXX: Consider options */
return size;
}
+ hw = sw->hw;
- if (!sw->hw->enabled) {
+ if (!hw->enabled) {
dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
return 0;
}
- return audio_pcm_sw_read(sw, buf, size);
+ if (audio_get_pdo_in(hw->s->dev)->mixing_engine) {
+ return audio_pcm_sw_read(sw, buf, size);
+ } else {
+ return hw->pcm_ops->read(hw, buf, size);
+ }
}
int AUD_get_buffer_size_out (SWVoiceOut *sw)
@@ -1090,6 +1104,26 @@ static void audio_run_out (AudioState *s)
HWVoiceOut *hw = NULL;
SWVoiceOut *sw;
+ if (!audio_get_pdo_out(s->dev)->mixing_engine) {
+ while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
+ /* there is exactly 1 sw for each hw with no mixeng */
+ sw = hw->sw_head.lh_first;
+
+ if (hw->pending_disable) {
+ hw->enabled = 0;
+ hw->pending_disable = 0;
+ if (hw->pcm_ops->enable_out) {
+ hw->pcm_ops->enable_out(hw, false);
+ }
+ }
+
+ if (sw->active) {
+ sw->callback.fn(sw->callback.opaque, INT_MAX);
+ }
+ }
+ return;
+ }
+
while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
size_t played, live, prev_rpos, free;
int nb_live, cleanup_required;
@@ -1227,6 +1261,17 @@ static void audio_run_in (AudioState *s)
{
HWVoiceIn *hw = NULL;
+ if (!audio_get_pdo_in(s->dev)->mixing_engine) {
+ while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
+ /* there is exactly 1 sw for each hw with no mixeng */
+ SWVoiceIn *sw = hw->sw_head.lh_first;
+ if (sw->active) {
+ sw->callback.fn(sw->callback.opaque, INT_MAX);
+ }
+ }
+ return;
+ }
+
while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
SWVoiceIn *sw;
size_t captured = 0, min;
@@ -1751,6 +1796,11 @@ CaptureVoiceOut *AUD_add_capture(
s = audio_init(NULL, NULL);
}
+ if (!audio_get_pdo_out(s->dev)->mixing_engine) {
+ dolog("Can't capture with mixeng disabled\n");
+ return NULL;
+ }
+
if (audio_validate_settings (as)) {
dolog ("Invalid settings were passed when trying to add capture\n");
audio_print_settings (as);
@@ -1905,9 +1955,13 @@ void audio_create_pdos(Audiodev *dev)
static void audio_validate_per_direction_opts(
AudiodevPerDirectionOptions *pdo, Error **errp)
{
+ if (!pdo->has_mixing_engine) {
+ pdo->has_mixing_engine = true;
+ pdo->mixing_engine = true;
+ }
if (!pdo->has_fixed_settings) {
pdo->has_fixed_settings = true;
- pdo->fixed_settings = true;
+ pdo->fixed_settings = pdo->mixing_engine;
}
if (!pdo->fixed_settings &&
(pdo->has_frequency || pdo->has_channels || pdo->has_format)) {
@@ -1915,6 +1969,10 @@ static void audio_validate_per_direction_opts(
"You can't use frequency, channels or format with fixed-settings=off");
return;
}
+ if (!pdo->mixing_engine && pdo->fixed_settings) {
+ error_setg(errp, "You can't use fixed-settings without mixeng");
+ return;
+ }
if (!pdo->has_frequency) {
pdo->has_frequency = true;
@@ -1926,7 +1984,7 @@ static void audio_validate_per_direction_opts(
}
if (!pdo->has_voices) {
pdo->has_voices = true;
- pdo->voices = 1;
+ pdo->voices = pdo->mixing_engine ? 1 : INT_MAX;
}
if (!pdo->has_format) {
pdo->has_format = true;
--
2.18.1
next prev parent reply other threads:[~2019-10-18 7:48 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-18 7:41 [PULL 00/13] Audio 20191018 patches Gerd Hoffmann
2019-10-18 7:41 ` [PULL 01/13] audio: fix parameter dereference before NULL check Gerd Hoffmann
2019-10-18 7:41 ` [PULL 02/13] audio: paaudio: fix connection and stream name Gerd Hoffmann
2019-10-18 7:41 ` [PULL 03/13] audio: paaudio: ability to specify " Gerd Hoffmann
2019-10-18 7:41 ` [PULL 04/13] audio: add mixing-engine option (documentation) Gerd Hoffmann
2019-10-18 7:41 ` Gerd Hoffmann [this message]
2019-10-18 7:41 ` [PULL 06/13] paaudio: get/put_buffer functions Gerd Hoffmann
2019-10-18 7:41 ` [PULL 07/13] audio: support more than two channels in volume setting Gerd Hoffmann
2019-10-18 7:41 ` [PULL 08/13] audio: replace shift in audio_pcm_info with bytes_per_frame Gerd Hoffmann
2019-10-18 7:41 ` [PULL 09/13] audio: basic support for multichannel audio Gerd Hoffmann
2019-10-18 7:41 ` [PULL 10/13] usb-audio: do not count on avail bytes actually available Gerd Hoffmann
2019-10-18 7:41 ` [PULL 11/13] usb-audio: support more than two channels of audio Gerd Hoffmann
2019-10-18 7:41 ` [PULL 12/13] usbaudio: change playback counters to 64 bit Gerd Hoffmann
2019-10-18 7:41 ` [PULL 13/13] paaudio: fix channel order for usb-audio 5.1 and 7.1 streams Gerd Hoffmann
2019-10-18 15:36 ` [PULL 00/13] Audio 20191018 patches Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191018074144.24071-6-kraxel@redhat.com \
--to=kraxel@redhat.com \
--cc=DirtY.iCE.hu@gmail.com \
--cc=Kővágó@redhat.com \
--cc=armbru@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).