- if (_sdi)
- _device_manager.release_device(_sdi);
- if (sdi)
- _device_manager.use_device(sdi, this);
- _sdi = sdi;
- update_signals(sdi);
+ // Ensure we are not capturing before setting the device
+ stop_capture();
+
+ // Are we setting a session device?
+ auto session_device = dynamic_pointer_cast<SessionDevice>(device);
+ // Did we have a session device selected previously?
+ auto prev_session_device = dynamic_pointer_cast<SessionDevice>(_device);
+
+ if (_device) {
+ _sr_session->remove_datafeed_callbacks();
+ if (!prev_session_device) {
+ _device->close();
+ _sr_session->remove_devices();
+ }
+ }
+
+ if (session_device)
+ _sr_session = session_device->parent();
+
+ _device = device;
+ _decode_traces.clear();
+
+ if (device) {
+ if (!session_device)
+ {
+ _sr_session = _device_manager.context()->create_session();
+ device->open();
+ _sr_session->add_device(device);
+ }
+ _sr_session->add_datafeed_callback([=]
+ (shared_ptr<Device> device, shared_ptr<Packet> packet) {
+ data_feed_in(device, packet);
+ });
+ update_signals(device);
+ }