#include <cassert>
#include <fstream>
+#include <vector>
#include <QString>
using std::string;
using std::ifstream;
using std::ios;
+using std::vector;
namespace pv {
namespace devices {
-const streamsize InputFile::BufferSize = 16384;
+// Use a 4MB chunk size for reading a file into memory. Larger values don't
+// seem to provide any substancial performance improvements, but can cause
+// UI lag and a visually "stuttering" display of the data currently loading.
+const streamsize InputFile::BufferSize = (4 * 1024 * 1024);
InputFile::InputFile(const shared_ptr<sigrok::Context> &context,
const string &file_name,
// we can't open the device without sending some data first
f = new ifstream(file_name_, ios::binary);
- char buffer[BufferSize];
- f->read(buffer, BufferSize);
+ vector<char> buffer(BufferSize);
+
+ f->read(buffer.data(), BufferSize);
const streamsize size = f->gcount();
if (size == 0)
return;
- input_->send(buffer, size);
+ input_->send(buffer.data(), size);
try {
device_ = input_->device();
- } catch (sigrok::Error) {
+ } catch (sigrok::Error&) {
return;
}
void InputFile::run()
{
- char buffer[BufferSize];
-
if (!f) {
// Previous call to run() processed the entire file already
f = new ifstream(file_name_, ios::binary);
input_->reset();
}
+ vector<char> buffer(BufferSize);
+
interrupt_ = false;
while (!interrupt_ && !f->eof()) {
- f->read(buffer, BufferSize);
+ f->read(buffer.data(), BufferSize);
const streamsize size = f->gcount();
if (size == 0)
break;
- input_->send(buffer, size);
+ input_->send(buffer.data(), size);
if (size != BufferSize)
break;