|
|
a547b4 |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
a547b4 |
From: Victor Toso <victortoso@redhat.com>
|
|
|
a547b4 |
Date: Fri, 6 Mar 2015 18:15:35 +0100
|
|
|
a547b4 |
Subject: [PATCH] vdagent: volume synchronization from client.
|
|
|
a547b4 |
|
|
|
a547b4 |
Include the capability of volume sync to set volume or mute to default
|
|
|
a547b4 |
sink-input/source-output of guest.
|
|
|
a547b4 |
---
|
|
|
a547b4 |
src/vdagent.c | 11 +++++++++++
|
|
|
a547b4 |
src/vdagentd-proto.h | 1 +
|
|
|
a547b4 |
src/vdagentd.c | 21 +++++++++++++++++++++
|
|
|
a547b4 |
3 files changed, 33 insertions(+)
|
|
|
a547b4 |
|
|
|
a547b4 |
diff --git a/src/vdagent.c b/src/vdagent.c
|
|
|
a547b4 |
index c5e09ff..a26af73 100644
|
|
|
a547b4 |
--- a/src/vdagent.c
|
|
|
a547b4 |
+++ b/src/vdagent.c
|
|
|
a547b4 |
@@ -39,6 +39,7 @@
|
|
|
a547b4 |
#include "udscs.h"
|
|
|
a547b4 |
#include "vdagentd-proto.h"
|
|
|
a547b4 |
#include "vdagentd-proto-strings.h"
|
|
|
a547b4 |
+#include "vdagent-audio.h"
|
|
|
a547b4 |
#include "vdagent-x11.h"
|
|
|
a547b4 |
#include "vdagent-file-xfers.h"
|
|
|
a547b4 |
|
|
|
a547b4 |
@@ -97,6 +98,16 @@ void daemon_read_complete(struct udscs_connection **connp,
|
|
|
a547b4 |
(VDAgentFileXferStatusMessage *)data);
|
|
|
a547b4 |
free(data);
|
|
|
a547b4 |
break;
|
|
|
a547b4 |
+ case VDAGENTD_AUDIO_VOLUME_SYNC: {
|
|
|
a547b4 |
+ VDAgentAudioVolumeSync *avs = (VDAgentAudioVolumeSync *)data;
|
|
|
a547b4 |
+ if (avs->is_playback) {
|
|
|
a547b4 |
+ vdagent_audio_playback_sync(avs->mute, avs->nchannels, avs->volume);
|
|
|
a547b4 |
+ } else {
|
|
|
a547b4 |
+ vdagent_audio_record_sync(avs->mute, avs->nchannels, avs->volume);
|
|
|
a547b4 |
+ }
|
|
|
a547b4 |
+ free(data);
|
|
|
a547b4 |
+ break;
|
|
|
a547b4 |
+ }
|
|
|
a547b4 |
case VDAGENTD_FILE_XFER_DATA:
|
|
|
a547b4 |
vdagent_file_xfers_data(vdagent_file_xfers,
|
|
|
a547b4 |
(VDAgentFileXferDataMessage *)data);
|
|
|
a547b4 |
diff --git a/src/vdagentd-proto.h b/src/vdagentd-proto.h
|
|
|
a547b4 |
index 25e6a36..0dbaaea 100644
|
|
|
a547b4 |
--- a/src/vdagentd-proto.h
|
|
|
a547b4 |
+++ b/src/vdagentd-proto.h
|
|
|
a547b4 |
@@ -36,6 +36,7 @@ enum {
|
|
|
a547b4 |
VDAGENTD_CLIPBOARD_DATA, /* arg1: sel, arg 2: type, data: data */
|
|
|
a547b4 |
VDAGENTD_CLIPBOARD_RELEASE, /* arg1: selection */
|
|
|
a547b4 |
VDAGENTD_VERSION, /* daemon -> client, data: version string */
|
|
|
a547b4 |
+ VDAGENTD_AUDIO_VOLUME_SYNC,
|
|
|
a547b4 |
VDAGENTD_FILE_XFER_START,
|
|
|
a547b4 |
VDAGENTD_FILE_XFER_STATUS,
|
|
|
a547b4 |
VDAGENTD_FILE_XFER_DATA,
|
|
|
a547b4 |
diff --git a/src/vdagentd.c b/src/vdagentd.c
|
|
|
a547b4 |
index 6280dfa..594f36b 100644
|
|
|
a547b4 |
--- a/src/vdagentd.c
|
|
|
a547b4 |
+++ b/src/vdagentd.c
|
|
|
a547b4 |
@@ -96,6 +96,7 @@ static void send_capabilities(struct vdagent_virtio_port *vport,
|
|
|
a547b4 |
VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_CLIPBOARD_SELECTION);
|
|
|
a547b4 |
VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_SPARSE_MONITORS_CONFIG);
|
|
|
a547b4 |
VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_GUEST_LINEEND_LF);
|
|
|
a547b4 |
+ VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_AUDIO_VOLUME_SYNC);
|
|
|
a547b4 |
|
|
|
a547b4 |
vdagent_virtio_port_write(vport, VDP_CLIENT_PORT,
|
|
|
a547b4 |
VD_AGENT_ANNOUNCE_CAPABILITIES, 0,
|
|
|
a547b4 |
@@ -151,6 +152,19 @@ static void do_client_monitors(struct vdagent_virtio_port *vport, int port_nr,
|
|
|
a547b4 |
(uint8_t *)&reply, sizeof(reply));
|
|
|
a547b4 |
}
|
|
|
a547b4 |
|
|
|
a547b4 |
+static void do_client_volume_sync(struct vdagent_virtio_port *vport, int port_nr,
|
|
|
a547b4 |
+ VDAgentMessage *message_header,
|
|
|
a547b4 |
+ VDAgentAudioVolumeSync *avs)
|
|
|
a547b4 |
+{
|
|
|
a547b4 |
+ if (active_session_conn == NULL) {
|
|
|
a547b4 |
+ syslog(LOG_DEBUG, "No active session - Can't volume-sync");
|
|
|
a547b4 |
+ return;
|
|
|
a547b4 |
+ }
|
|
|
a547b4 |
+
|
|
|
a547b4 |
+ udscs_write(active_session_conn, VDAGENTD_AUDIO_VOLUME_SYNC, 0, 0,
|
|
|
a547b4 |
+ (uint8_t *)avs, message_header->size);
|
|
|
a547b4 |
+}
|
|
|
a547b4 |
+
|
|
|
a547b4 |
static void do_client_capabilities(struct vdagent_virtio_port *vport,
|
|
|
a547b4 |
VDAgentMessage *message_header,
|
|
|
a547b4 |
VDAgentAnnounceCapabilities *caps)
|
|
|
a547b4 |
@@ -366,6 +380,13 @@ int virtio_port_read_complete(
|
|
|
a547b4 |
vdagent_virtio_port_reset(vport, VDP_CLIENT_PORT);
|
|
|
a547b4 |
do_client_disconnect();
|
|
|
a547b4 |
break;
|
|
|
a547b4 |
+ case VD_AGENT_AUDIO_VOLUME_SYNC:
|
|
|
a547b4 |
+ if (message_header->size < sizeof(VDAgentAudioVolumeSync))
|
|
|
a547b4 |
+ goto size_error;
|
|
|
a547b4 |
+
|
|
|
a547b4 |
+ do_client_volume_sync(vport, port_nr, message_header,
|
|
|
a547b4 |
+ (VDAgentAudioVolumeSync *)data);
|
|
|
a547b4 |
+ break;
|
|
|
a547b4 |
default:
|
|
|
a547b4 |
syslog(LOG_WARNING, "unknown message type %d, ignoring",
|
|
|
a547b4 |
message_header->type);
|