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();
}