From: "Kővágó, Zoltán" <dirty.ice.hu@gmail.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH v2 18/24] audio: support more than two channels in volume setting
Date: Sun, 8 Sep 2019 23:22:18 +0200 [thread overview]
Message-ID: <4b9119f77e671bf3a74b64e851514ef4bf56a9ba.1567965065.git.DirtY.iCE.hu@gmail.com> (raw)
In-Reply-To: <cover.1567965065.git.DirtY.iCE.hu@gmail.com>
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
---
audio/audio.c | 30 ++++++++++++++++++++++--------
audio/audio.h | 10 ++++++++++
audio/audio_int.h | 4 ++--
audio/paaudio.c | 20 ++++++++++++--------
audio/spiceaudio.c | 14 ++++++++------
5 files changed, 54 insertions(+), 24 deletions(-)
diff --git a/audio/audio.c b/audio/audio.c
index b7d14d0ef7..1284ae4d8f 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -1886,31 +1886,45 @@ void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
}
void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol)
+{
+ Volume vol = { .mute = mute, .channels = 2, .vol = { lvol, rvol } };
+ audio_set_volume_out(sw, &vol);
+}
+
+void audio_set_volume_out(SWVoiceOut *sw, Volume *vol)
{
if (sw) {
HWVoiceOut *hw = sw->hw;
- sw->vol.mute = mute;
- sw->vol.l = nominal_volume.l * lvol / 255;
- sw->vol.r = nominal_volume.r * rvol / 255;
+ sw->vol.mute = vol->mute;
+ sw->vol.l = nominal_volume.l * vol->vol[0] / 255;
+ sw->vol.r = nominal_volume.l * vol->vol[vol->channels > 1 ? 1 : 0] /
+ 255;
if (hw->pcm_ops->volume_out) {
- hw->pcm_ops->volume_out(hw, &sw->vol);
+ hw->pcm_ops->volume_out(hw, vol);
}
}
}
void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol)
+{
+ Volume vol = { .mute = mute, .channels = 2, .vol = { lvol, rvol } };
+ audio_set_volume_in(sw, &vol);
+}
+
+void audio_set_volume_in(SWVoiceIn *sw, Volume *vol)
{
if (sw) {
HWVoiceIn *hw = sw->hw;
- sw->vol.mute = mute;
- sw->vol.l = nominal_volume.l * lvol / 255;
- sw->vol.r = nominal_volume.r * rvol / 255;
+ sw->vol.mute = vol->mute;
+ sw->vol.l = nominal_volume.l * vol->vol[0] / 255;
+ sw->vol.r = nominal_volume.r * vol->vol[vol->channels > 1 ? 1 : 0] /
+ 255;
if (hw->pcm_ops->volume_in) {
- hw->pcm_ops->volume_in(hw, &sw->vol);
+ hw->pcm_ops->volume_in(hw, vol);
}
}
}
diff --git a/audio/audio.h b/audio/audio.h
index c74abb8c47..0db3c7dd5e 100644
--- a/audio/audio.h
+++ b/audio/audio.h
@@ -124,6 +124,16 @@ uint64_t AUD_get_elapsed_usec_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol);
void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol);
+#define AUDIO_MAX_CHANNELS 16
+typedef struct Volume {
+ bool mute;
+ int channels;
+ uint8_t vol[AUDIO_MAX_CHANNELS];
+} Volume;
+
+void audio_set_volume_out(SWVoiceOut *sw, Volume *vol);
+void audio_set_volume_in(SWVoiceIn *sw, Volume *vol);
+
SWVoiceIn *AUD_open_in (
QEMUSoundCard *card,
SWVoiceIn *sw,
diff --git a/audio/audio_int.h b/audio/audio_int.h
index 22a703c13e..9176db249b 100644
--- a/audio/audio_int.h
+++ b/audio/audio_int.h
@@ -166,7 +166,7 @@ struct audio_pcm_ops {
*/
size_t (*put_buffer_out)(HWVoiceOut *hw, void *buf, size_t size);
void (*enable_out)(HWVoiceOut *hw, bool enable);
- void (*volume_out)(HWVoiceOut *hw, struct mixeng_volume *vol);
+ void (*volume_out)(HWVoiceOut *hw, Volume *vol);
int (*init_in) (HWVoiceIn *hw, audsettings *as, void *drv_opaque);
void (*fini_in) (HWVoiceIn *hw);
@@ -174,7 +174,7 @@ struct audio_pcm_ops {
void *(*get_buffer_in)(HWVoiceIn *hw, size_t *size);
void (*put_buffer_in)(HWVoiceIn *hw, void *buf, size_t size);
void (*enable_in)(HWVoiceIn *hw, bool enable);
- void (*volume_in)(HWVoiceIn *hw, struct mixeng_volume *vol);
+ void (*volume_in)(HWVoiceIn *hw, Volume *vol);
};
void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t *size);
diff --git a/audio/paaudio.c b/audio/paaudio.c
index 6ccdf31415..d195b1caa8 100644
--- a/audio/paaudio.c
+++ b/audio/paaudio.c
@@ -531,20 +531,22 @@ static void qpa_fini_in (HWVoiceIn *hw)
}
}
-static void qpa_volume_out(HWVoiceOut *hw, struct mixeng_volume *vol)
+static void qpa_volume_out(HWVoiceOut *hw, Volume *vol)
{
PAVoiceOut *pa = (PAVoiceOut *) hw;
pa_operation *op;
pa_cvolume v;
PAConnection *c = pa->g->conn;
+ int i;
#ifdef PA_CHECK_VERSION /* macro is present in 0.9.16+ */
pa_cvolume_init (&v); /* function is present in 0.9.13+ */
#endif
- v.channels = 2;
- v.values[0] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->l) / UINT32_MAX;
- v.values[1] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->r) / UINT32_MAX;
+ v.channels = vol->channels;
+ for (i = 0; i < vol->channels; ++i) {
+ v.values[i] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->vol[i]) / 255;
+ }
pa_threaded_mainloop_lock(c->mainloop);
@@ -571,20 +573,22 @@ static void qpa_volume_out(HWVoiceOut *hw, struct mixeng_volume *vol)
pa_threaded_mainloop_unlock(c->mainloop);
}
-static void qpa_volume_in(HWVoiceIn *hw, struct mixeng_volume *vol)
+static void qpa_volume_in(HWVoiceIn *hw, Volume *vol)
{
PAVoiceIn *pa = (PAVoiceIn *) hw;
pa_operation *op;
pa_cvolume v;
PAConnection *c = pa->g->conn;
+ int i;
#ifdef PA_CHECK_VERSION
pa_cvolume_init (&v);
#endif
- v.channels = 2;
- v.values[0] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->l) / UINT32_MAX;
- v.values[1] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->r) / UINT32_MAX;
+ v.channels = vol->channels;
+ for (i = 0; i < vol->channels; ++i) {
+ v.values[i] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->vol[i]) / 255;
+ }
pa_threaded_mainloop_lock(c->mainloop);
diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
index 5fff0b7653..71af90ec56 100644
--- a/audio/spiceaudio.c
+++ b/audio/spiceaudio.c
@@ -175,13 +175,14 @@ static void line_out_enable(HWVoiceOut *hw, bool enable)
}
#if ((SPICE_INTERFACE_PLAYBACK_MAJOR >= 1) && (SPICE_INTERFACE_PLAYBACK_MINOR >= 2))
-static void line_out_volume(HWVoiceOut *hw, struct mixeng_volume *vol)
+static void line_out_volume(HWVoiceOut *hw, Volume *vol)
{
SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw);
uint16_t svol[2];
- svol[0] = vol->l / ((1ULL << 16) + 1);
- svol[1] = vol->r / ((1ULL << 16) + 1);
+ assert(vol->channels == 2);
+ svol[0] = vol->vol[0] * 257;
+ svol[1] = vol->vol[1] * 257;
spice_server_playback_set_volume(&out->sin, 2, svol);
spice_server_playback_set_mute(&out->sin, vol->mute);
}
@@ -258,13 +259,14 @@ static void line_in_enable(HWVoiceIn *hw, bool enable)
}
#if ((SPICE_INTERFACE_RECORD_MAJOR >= 2) && (SPICE_INTERFACE_RECORD_MINOR >= 2))
-static void line_in_volume(HWVoiceIn *hw, struct mixeng_volume *vol)
+static void line_in_volume(HWVoiceIn *hw, Volume *vol)
{
SpiceVoiceIn *in = container_of(hw, SpiceVoiceIn, hw);
uint16_t svol[2];
- svol[0] = vol->l / ((1ULL << 16) + 1);
- svol[1] = vol->r / ((1ULL << 16) + 1);
+ assert(vol->channels == 2);
+ svol[0] = vol->vol[0] * 257;
+ svol[1] = vol->vol[1] * 257;
spice_server_record_set_volume(&in->sin, 2, svol);
spice_server_record_set_mute(&in->sin, vol->mute);
}
--
2.23.0
next prev parent reply other threads:[~2019-09-08 21:45 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-08 21:22 [Qemu-devel] [PATCH v2 00/24] Audio: Mixeng-free 5.1/7.1 audio support Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 01/24] audio: api for mixeng code free backends Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 02/24] alsaaudio: port to the new audio backend api Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 03/24] coreaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 04/24] dsoundaudio: " Kővágó, Zoltán
2019-09-11 7:00 ` Gerd Hoffmann
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 05/24] noaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 06/24] ossaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 07/24] paaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 08/24] sdlaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 10/24] wavaudio: " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 11/24] audio: remove remains of the old " Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 12/24] audio: unify input and output mixeng buffer management Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 13/24] audio: common rate control code for timer based outputs Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 14/24] audio: split ctl_* functions into enable_* and volume_* Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 15/24] audio: add mixeng option (documentation) Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 16/24] audio: make mixeng optional Kővágó, Zoltán
2019-09-08 21:22 ` Kővágó, Zoltán [this message]
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 19/24] audio: replace shift in audio_pcm_info with bytes_per_frame Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 20/24] audio: basic support for multichannel audio Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 21/24] paaudio: channel-map option Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 22/24] usb-audio: do not count on avail bytes actually available Kővágó, Zoltán
2019-09-08 21:22 ` [Qemu-devel] [PATCH v2 24/24] usbaudio: change playback counters to 64 bit Kővágó, Zoltán
2019-09-12 10:20 ` [Qemu-devel] [PATCH v2 00/24] Audio: Mixeng-free 5.1/7.1 audio support Gerd Hoffmann
2019-09-15 1:08 ` Zoltán Kővágó
2019-09-17 11:38 ` Gerd Hoffmann
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=4b9119f77e671bf3a74b64e851514ef4bf56a9ba.1567965065.git.DirtY.iCE.hu@gmail.com \
--to=dirty.ice.hu@gmail.com \
--cc=kraxel@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).