128 lines
4.5 KiB
C++
128 lines
4.5 KiB
C++
#include "ovtkISignalTrial.h"
|
|
|
|
namespace OpenViBE {
|
|
namespace Toolkit {
|
|
|
|
ISignalTrial& copyHeader(ISignalTrial& trial, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
|
|
if (srcTrial != &trial)
|
|
{
|
|
const size_t nChannel = srcTrial->getChannelCount();
|
|
trial.setChannelCount(nChannel);
|
|
for (size_t i = 0; i < nChannel; ++i) { trial.setChannelName(i, srcTrial->getChannelName(i)); }
|
|
trial.setSamplingRate(srcTrial->getSamplingRate());
|
|
}
|
|
|
|
return trial;
|
|
}
|
|
|
|
ISignalTrial& copy(ISignalTrial& trial, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
|
|
// copyHeader(trial, srcTrial);
|
|
|
|
if (srcTrial != &trial)
|
|
{
|
|
const size_t nChannel = srcTrial->getChannelCount();
|
|
const size_t nSample = srcTrial->getSampleCount();
|
|
trial.setSampleCount(nSample, false);
|
|
for (size_t i = 0; i < nChannel; ++i) { memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), nSample * sizeof(double)); }
|
|
}
|
|
|
|
return trial;
|
|
}
|
|
|
|
ISignalTrial& selectSamples(ISignalTrial& trial, const size_t sampleStart, const size_t sampleEnd, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED
|
|
|
|
// copyHeader(trial, srcTrial);
|
|
|
|
const size_t nChannel = srcTrial->getChannelCount();
|
|
const size_t nSample = sampleEnd - sampleStart;
|
|
|
|
trial.setSampleCount(nSample, false);
|
|
for (size_t i = 0; i < nChannel; ++i)
|
|
{
|
|
memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i) + sampleStart, nSample * sizeof(double));
|
|
}
|
|
|
|
return trial;
|
|
}
|
|
|
|
ISignalTrial& selectTime(ISignalTrial& trial, const uint64_t timeStart, const uint64_t timeEnd, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED
|
|
|
|
const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32);
|
|
const size_t sampleEnd = size_t((timeEnd * srcTrial->getSamplingRate()) >> 32);
|
|
return selectSamples(trial, sampleStart, sampleEnd, srcTrial);
|
|
}
|
|
|
|
ISignalTrial& removeSamples(ISignalTrial& trial, const size_t sampleStart, const size_t sampleEnd, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED
|
|
|
|
// copyHeader(trial, srcTrial);
|
|
|
|
const size_t srcNChannel = srcTrial->getChannelCount();
|
|
const size_t srcNSample = srcTrial->getSampleCount() - (sampleEnd - sampleStart);
|
|
|
|
trial.setSampleCount(srcNSample, false);
|
|
for (size_t i = 0; i < srcNChannel; ++i)
|
|
{
|
|
memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), sampleStart * sizeof(double));
|
|
memcpy(trial.getChannelSampleBuffer(i) + sampleStart, srcTrial->getChannelSampleBuffer(i) + sampleEnd, (srcNSample - sampleStart) * sizeof(double));
|
|
}
|
|
|
|
return trial;
|
|
}
|
|
|
|
ISignalTrial& removeTime(ISignalTrial& trial, const uint64_t timeStart, const uint64_t timeEnd, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED
|
|
|
|
const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32);
|
|
const size_t sampleEnd = size_t((timeEnd * srcTrial->getSamplingRate()) >> 32);
|
|
return removeSamples(trial, sampleStart, sampleEnd, srcTrial);
|
|
}
|
|
|
|
ISignalTrial& insertBufferSamples(ISignalTrial& trial, const size_t sampleStart, const size_t nSample, const double* buffer, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
|
|
// copyHeader(trial, srcTrial);
|
|
|
|
const size_t srcNChannel = srcTrial->getChannelCount();
|
|
const size_t srcNSample = srcTrial->getSampleCount();
|
|
|
|
trial.setSampleCount(srcNSample + nSample, true);
|
|
for (size_t i = 0; i < srcNChannel; ++i)
|
|
{
|
|
if (&trial != srcTrial) { memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), sampleStart * sizeof(double)); }
|
|
|
|
memcpy(trial.getChannelSampleBuffer(i) + sampleStart + nSample, srcTrial->getChannelSampleBuffer(i), (srcNSample - sampleStart) * sizeof(double));
|
|
memcpy(trial.getChannelSampleBuffer(i) + sampleStart, buffer + nSample * i, nSample * sizeof(double));
|
|
}
|
|
|
|
return trial;
|
|
}
|
|
|
|
ISignalTrial& insertBufferTime(ISignalTrial& trial, const uint64_t timeStart, const size_t nSample, const double* buffer, const ISignalTrial* srcTrial)
|
|
{
|
|
if (srcTrial == nullptr) { srcTrial = &trial; }
|
|
|
|
const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32);
|
|
return insertBufferSamples(trial, sampleStart, nSample, buffer, srcTrial);
|
|
}
|
|
|
|
} // namespace Toolkit
|
|
} // namespace OpenViBE
|