+ _decode_traces.erase(i);
+ signals_changed();
+ return;
+ }
+}
+#endif
+
+void SigSession::set_capture_state(capture_state state)
+{
+ lock_guard<mutex> lock(_sampling_mutex);
+ const bool changed = _capture_state != state;
+ _capture_state = state;
+ if(changed)
+ capture_state_changed(state);
+}
+
+void SigSession::update_signals(shared_ptr<Device> device)
+{
+ assert(device);
+ assert(_capture_state == Stopped);
+
+ // Clear the decode traces
+ _decode_traces.clear();
+
+ // Detect what data types we will receive
+ auto channels = device->channels();
+ unsigned int logic_channel_count = std::count_if(
+ channels.begin(), channels.end(),
+ [] (shared_ptr<Channel> channel) {
+ return channel->type() == ChannelType::LOGIC; });
+
+ // Create data containers for the logic data snapshots
+ {
+ lock_guard<mutex> data_lock(_data_mutex);
+
+ _logic_data.reset();
+ if (logic_channel_count != 0) {
+ _logic_data.reset(new data::Logic(
+ logic_channel_count));
+ assert(_logic_data);
+ }
+ }
+
+ // Make the Signals list
+ do {
+ lock_guard<mutex> lock(_signals_mutex);
+
+ _signals.clear();
+
+ for (auto channel : device->channels()) {
+ shared_ptr<view::Signal> signal;
+
+ switch(channel->type()->id()) {
+ case SR_CHANNEL_LOGIC:
+ signal = shared_ptr<view::Signal>(
+ new view::LogicSignal(device, channel, _logic_data));
+ break;
+
+ case SR_CHANNEL_ANALOG: