void SignalDataSource::setSamples(float *samples, qint64 count, double sampleRate) { clean(); m_samples = samples; m_count = count; m_sampleRate = sampleRate; qint64 spp = 2; while (m_count / spp > 0) { qint64 count = m_count / spp + ((m_count % spp) ? (1) : (0)); float *maximums; float *minimums; { QTemporaryFile *file = new QTemporaryFile(); if (!file->open()) return ; file->resize(count * sizeof(float)); maximums = (float *)(file->map(0, count * sizeof(float))); } { QTemporaryFile *file = new QTemporaryFile(); if (!file->open()) return ; file->resize(count * sizeof(float)); minimums = (float *)(file->map(0, count * sizeof(float))); } for (qint64 arrIndex = 0; arrIndex < count; ++arrIndex) { qint64 sampleFirstIndex = arrIndex * spp; qint64 sampleLastIndex = sampleFirstIndex + spp - 1; if (sampleLastIndex >= m_count) sampleLastIndex = m_count - 1; double min; double max; min = max = m_samples[sampleFirstIndex]; for (int i = sampleFirstIndex + 1; i <= sampleLastIndex; ++i) { if (m_samples[i] < min) min = m_samples[i]; else if (m_samples[i] > max) max = m_samples[i]; } minimums[arrIndex] = min; maximums[arrIndex] = max; } m_peakMaximums[spp] = maximums; m_peakMinimums[spp] = minimums; m_peakCount[spp] = count; spp *= 2; } emit dataChanged(); }