PcloudStimProducer,OClCollMeshEngn: Produce ambience stim feature
The collation kernel now also produces the ambience stim feature values into the ambience stimbuff frames.
This commit is contained in:
@@ -56,7 +56,7 @@ static StagingBuffer::IOEngineConstraints openClAmbienceInputConstraints(
|
||||
// slotStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// slotPadToNBytes: This is dynamically calculated based on the return mode.
|
||||
sizeof(float),
|
||||
sizeof(uint32_t),
|
||||
// frameStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// framePadToNBytes (pointer size)
|
||||
@@ -295,18 +295,29 @@ std::cout << __func__ << ": $$$$$$$ Created PcloudIntensityStimulusBuffer" << st
|
||||
}
|
||||
else if (qualeIfaceApi == "pcloudAmbience")
|
||||
{
|
||||
// Parse ambienceHighVal from stimBuffApiParams
|
||||
const std::vector<std::string> ambienceHighValParamNames = {
|
||||
"high-value",
|
||||
"high-val"
|
||||
};
|
||||
int ambienceHighValInt = device::DeviceAttachmentSpec
|
||||
::parseOptionalParamAsIntWithSynonyms(
|
||||
deviceAttachmentSpec->stimBuffApiParams,
|
||||
ambienceHighValParamNames, 116);
|
||||
uint32_t ambienceHighVal = static_cast<uint32_t>(ambienceHighValInt);
|
||||
|
||||
/* Calculate slotStrideNBytes:
|
||||
* nDgramsPerStagingBufferFrame * sizeof(float)
|
||||
* nDgramsPerStagingBufferFrame * sizeof(uint32_t)
|
||||
*/
|
||||
size_t slotStrideNBytes = this->nDgramsPerStagingBufferFrame
|
||||
* sizeof(float);
|
||||
* sizeof(uint32_t);
|
||||
// Reuse openClAmbienceInputConstraints, only modify slotPadToNBytes
|
||||
openClAmbienceInputConstraints.slotPadToNBytes = slotStrideNBytes;
|
||||
|
||||
auto ambienceBuffer = std::make_shared<PcloudAmbienceStimulusBuffer>(
|
||||
*this, deviceAttachmentSpec, histbuffMs,
|
||||
openClAmbienceInputConstraints, openClAmbienceInputConstraints,
|
||||
*smoHooksPtr, CL_MEM_READ_WRITE);
|
||||
*smoHooksPtr, CL_MEM_READ_WRITE, ambienceHighVal);
|
||||
|
||||
std::cout << __func__ << ": $$$$$$$ Created PcloudAmbienceStimulusBuffer" << std::endl;
|
||||
this->stop();
|
||||
@@ -337,6 +348,7 @@ private:
|
||||
AsynchronousLoop frameAssemblyResult;
|
||||
StimulusFrame& stimulusFrame;
|
||||
std::optional<std::reference_wrapper<StimulusFrame>> intensityStimFrame;
|
||||
std::optional<std::reference_wrapper<StimulusFrame>> ambienceStimFrame;
|
||||
|
||||
public:
|
||||
ProduceFrameReq(
|
||||
@@ -412,8 +424,27 @@ public:
|
||||
context->intensityStimFrame = std::nullopt;
|
||||
}
|
||||
|
||||
// Check if ambience buffer is attached and acquire frame if so
|
||||
if (pcloudProducer.ambienceStimulusBuffer)
|
||||
{
|
||||
size_t ambienceRingbuffIndex = pcloudProducer
|
||||
.ambienceStimulusBuffer->ringBuffer.getIndexToProduceInto();
|
||||
|
||||
StimulusFrame& ambienceStimFrame = pcloudProducer
|
||||
.ambienceStimulusBuffer->ringBuffer.getDataAtSlot(
|
||||
ambienceRingbuffIndex);
|
||||
|
||||
ambienceStimFrame.lock.writeAcquire();
|
||||
context->ambienceStimFrame = std::make_optional(
|
||||
std::ref(ambienceStimFrame));
|
||||
}
|
||||
else {
|
||||
context->ambienceStimFrame = std::nullopt;
|
||||
}
|
||||
|
||||
pcloudProducer.openClCollatingAndMeshingEngine.compactCollateAndMeshFrameReq(
|
||||
loop, stimulusFrame, context->intensityStimFrame,
|
||||
loop, stimulusFrame,
|
||||
context->intensityStimFrame, context->ambienceStimFrame,
|
||||
{context, std::bind(
|
||||
&ProduceFrameReq::produceFrameReq3_compactCollateDone,
|
||||
context.get(), context,
|
||||
@@ -428,6 +459,10 @@ public:
|
||||
if (context->intensityStimFrame.has_value()) {
|
||||
context->intensityStimFrame->get().lock.writeRelease();
|
||||
}
|
||||
// Release ambience frame if it was used
|
||||
if (context->ambienceStimFrame.has_value()) {
|
||||
context->ambienceStimFrame->get().lock.writeRelease();
|
||||
}
|
||||
|
||||
SpinLock::Guard lock(pcloudProducer.shouldContinueLock);
|
||||
if (!pcloudProducer.shouldContinue)
|
||||
|
||||
Reference in New Issue
Block a user