X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fsession.cpp;h=e187a4d35245aecefe25b344433346595664c1f4;hb=8524a597c3625c49cb42436c25fd9b06d9b5b06a;hp=d5126660f56b140d2337d64b1df625a4ea44b148;hpb=3084ed4b15663dd717ff656745db305f377ab215;p=pulseview.git diff --git a/pv/session.cpp b/pv/session.cpp index d512666..e187a4d 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -60,6 +60,7 @@ using std::lock_guard; using std::list; using std::map; using std::mutex; +using std::recursive_mutex; using std::set; using std::shared_ptr; using std::string; @@ -133,7 +134,7 @@ void Session::set_device(shared_ptr device) (shared_ptr device, shared_ptr packet) { data_feed_in(device, packet); }); - update_signals(device_); + update_signals(); decode_traces_.clear(); @@ -301,13 +302,20 @@ void Session::set_capture_state(capture_state state) capture_state_changed(state); } -void Session::update_signals(shared_ptr device) +void Session::update_signals() { - assert(device); + assert(device_); assert(capture_state_ == Stopped); + const shared_ptr sr_dev = device_->device(); + if (!sr_dev) { + signals_.clear(); + logic_data_.reset(); + return; + } + // Detect what data types we will receive - auto channels = device->device()->channels(); + auto channels = sr_dev->channels(); unsigned int logic_channel_count = std::count_if( channels.begin(), channels.end(), [] (shared_ptr channel) { @@ -315,7 +323,7 @@ void Session::update_signals(shared_ptr device) // Create data containers for the logic data segments { - lock_guard data_lock(data_mutex_); + lock_guard data_lock(data_mutex_); if (logic_channel_count == 0) { logic_data_.reset(); @@ -334,7 +342,7 @@ void Session::update_signals(shared_ptr device) unordered_set< shared_ptr > prev_sigs(signals_); signals_.clear(); - for (auto channel : device->device()->channels()) { + for (auto channel : sr_dev->channels()) { shared_ptr signal; // Find the channel in the old signals @@ -357,7 +365,7 @@ void Session::update_signals(shared_ptr device) case SR_CHANNEL_LOGIC: signal = shared_ptr( new view::LogicSignal(*this, - device, channel, + device_, channel, logic_data_)); break; @@ -400,7 +408,12 @@ shared_ptr Session::signal_from_channel( void Session::read_sample_rate(shared_ptr device) { assert(device); - const auto keys = device->config_keys(ConfigKey::DEVICE_OPTIONS); + map< const ConfigKey*, set > keys; + + try { + keys = device->config_keys(ConfigKey::DEVICE_OPTIONS); + } catch (const Error) {} + const auto iter = keys.find(ConfigKey::SAMPLERATE); cur_samplerate_ = (iter != keys.end() && (*iter).second.find(sigrok::GET) != (*iter).second.end()) ? @@ -468,7 +481,7 @@ void Session::feed_in_frame_begin() void Session::feed_in_logic(shared_ptr logic) { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); if (!logic_data_) { @@ -518,7 +531,7 @@ void Session::feed_in_logic(shared_ptr logic) void Session::feed_in_analog(shared_ptr analog) { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); const vector> channels = analog->channels(); const unsigned int channel_count = channels.size(); @@ -622,7 +635,7 @@ void Session::data_feed_in(shared_ptr device, case SR_DF_END: { { - lock_guard lock(data_mutex_); + lock_guard lock(data_mutex_); cur_logic_segment_.reset(); cur_analog_segments_.clear(); }