[RFC PATCH spice-server v4 16/22] stream-device: Create channel when needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This allows a better id allocation as devices are created after
fixed ones.
Also will allow to support more easily multiple monitor.

Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx>
---
 server/stream-device.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/server/stream-device.c b/server/stream-device.c
index 8909c9ba..f72140ab 100644
--- a/server/stream-device.c
+++ b/server/stream-device.c
@@ -67,7 +67,7 @@ stream_device_read_msg_from_dev(RedCharDevice *self, SpiceCharDeviceInstance *si
     SpiceCharDeviceInterface *sif;
     int n;
 
-    if (dev->has_error) {
+    if (dev->has_error || !dev->stream_channel) {
         return NULL;
     }
 
@@ -223,11 +223,7 @@ stream_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin)
 {
     SpiceCharDeviceInterface *sif;
 
-    StreamChannel *stream_channel = stream_channel_new(reds, 1); // TODO id
-
     StreamDevice *dev = stream_device_new(sin, reds);
-    dev->stream_channel = stream_channel;
-    stream_channel_register_start_cb(stream_channel, stream_device_stream_start, dev);
 
     sif = spice_char_device_get_interface(sin);
     if (sif->state) {
@@ -250,6 +246,25 @@ stream_device_dispose(GObject *object)
 }
 
 static void
+allocate_channels(StreamDevice *dev)
+{
+    if (dev->stream_channel) {
+        return;
+    }
+
+    SpiceServer* reds = red_char_device_get_server(RED_CHAR_DEVICE(dev));
+
+    int id = reds_get_free_channel_id(reds, SPICE_CHANNEL_DISPLAY);
+    g_return_if_fail(id >= 0);
+
+    StreamChannel *stream_channel = stream_channel_new(reds, id);
+
+    dev->stream_channel = stream_channel;
+
+    stream_channel_register_start_cb(stream_channel, stream_device_stream_start, dev);
+}
+
+static void
 stream_device_port_event(RedCharDevice *char_dev, uint8_t event)
 {
     if (event != SPICE_PORT_EVENT_OPENED && event != SPICE_PORT_EVENT_CLOSED) {
@@ -260,10 +275,15 @@ stream_device_port_event(RedCharDevice *char_dev, uint8_t event)
 
     // reset device and channel on close/open
     device->opened = (event == SPICE_PORT_EVENT_OPENED);
+    if (device->opened) {
+        allocate_channels(device);
+    }
     device->hdr_pos = 0;
     device->has_error = false;
     red_char_device_reset(char_dev);
-    stream_channel_reset(device->stream_channel);
+    if (device->stream_channel) {
+        stream_channel_reset(device->stream_channel);
+    }
 }
 
 static void
-- 
2.13.5

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]