static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer data)
{
    struct spice_context *ctx = data;
    int id;

    g_object_get(channel, "channel-id", &id, NULL);
    ctx->channels++;
    SPICE_DEBUG("new channel (#%d)", id);

    g_signal_connect(channel, "open-fd",
                     G_CALLBACK(channel_open_fd), ctx);

    if (SPICE_IS_MAIN_CHANNEL(channel)) {
        SPICE_DEBUG("new main channel");
        g_signal_connect(channel, "channel-event",
                         G_CALLBACK(main_channel_event), ctx);
    }

    if (SPICE_IS_DISPLAY_CHANNEL(channel)) {
        if (ctx->display != NULL)
            return;
        SPICE_DEBUG("new display channel (#%d)", id);
        ctx->display = spice_display_new(ctx, id);
        ctx->display_channel = id;
    }

    if (SPICE_IS_PLAYBACK_CHANNEL(channel)) {
        SPICE_DEBUG("new audio channel");
        spice_audio_get(s, NULL);
    }
}
QSpiceAudio::QSpiceAudio(QObject *parent, void *_session) :
    QSpiceObject(parent)
{
#if USE_SPICE_AUDIO
    // deprecated since 0.8
    // spice_audio_new(session, context, name);
    SpiceSession *session =
            static_cast<SpiceSession*>(_session);
    gobject = spice_audio_get(session, nullptr);
    state = (gobject)? true : false;
#else
    Q_UNUSED(_session);
    state = false;
#endif
}
static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer data)
{
    spice_connection *conn = data;
    int id;

    g_object_get(channel, "channel-id", &id, NULL);
    conn->channels++;
    SPICE_DEBUG("new channel (#%d)", id);

    if (SPICE_IS_MAIN_CHANNEL(channel)) {
        SPICE_DEBUG("new main channel");
        conn->main = SPICE_MAIN_CHANNEL(channel);
        g_signal_connect(channel, "channel-event",
                         G_CALLBACK(main_channel_event), conn);
        //g_signal_connect(channel, "main-mouse-update",
        //                 G_CALLBACK(main_mouse_update), conn);
        //g_signal_connect(channel, "main-agent-update",
        //                 G_CALLBACK(main_agent_update), conn);
        //main_mouse_update(channel, conn);
        //main_agent_update(channel, conn);
    }

    if (SPICE_IS_DISPLAY_CHANNEL(channel)) {
        if (id >= SPICE_N_ELEMENTS(conn->wins))
            return;
        if (conn->wins[id] != NULL)
            return;
        SPICE_DEBUG("new display channel (#%d)", id);
        conn->wins[id] = create_spice_window(conn, channel, id);
        //g_signal_connect(channel, "display-mark",
        //                 G_CALLBACK(display_mark), conn->wins[id]);
        //update_auto_usbredir_sensitive(conn);
    }

    if (SPICE_IS_INPUTS_CHANNEL(channel)) {
        SPICE_DEBUG("new inputs channel");
        //g_signal_connect(channel, "inputs-modifiers",
        //                 G_CALLBACK(inputs_modifiers), conn);
    }

    if (soundEnabled && SPICE_IS_PLAYBACK_CHANNEL(channel)) {
        SPICE_DEBUG("new audio channel");
        conn->audio = spice_audio_get(s, NULL);
    }

    if (SPICE_IS_USBREDIR_CHANNEL(channel)) {
        __android_log_write(ANDROID_LOG_INFO, "android-spice", "Created USB channel, attempting to add devices");
        SpiceUsbDeviceManager *manager = spice_usb_device_manager_get(s, NULL);
        GPtrArray *devices = spice_usb_device_manager_get_devices(manager);
        if (devices) {
            for (int i = 0; i < devices->len; i++) {
                __android_log_write(ANDROID_LOG_INFO, "android-spicy", "Devices found, connecting...");
                usb_device_added(manager, g_ptr_array_index(devices, i), NULL);
            }
            g_ptr_array_unref(devices);
        }
    }

    //if (SPICE_IS_PORT_CHANNEL(channel)) {
    //    g_signal_connect(channel, "notify::port-opened",
    //                     G_CALLBACK(port_opened), conn);
    //    g_signal_connect(channel, "port-data",
    //                     G_CALLBACK(port_data), conn);
    //    spice_channel_connect(channel);
    //}
}