livoxGen1🐛 Call stop() on all producers before deleting in _exit

This commit is contained in:
2026-06-14 15:34:07 -04:00
parent 24eee2d240
commit acb684ad35
5 changed files with 204 additions and 109 deletions
+56 -27
View File
@@ -14,7 +14,47 @@ namespace smo::stim_buff::lcamera_buff {
const SmoCallbacks *lcameraBuffSmoHooksPtr = nullptr;
SmoThreadingModelDesc lcameraBuffThreadingModelDesc;
LcameraDevDllState lcameraDevDll;
std::vector<std::shared_ptr<YuvStimProducer>> attachedStimulusProducers;
std::vector<std::shared_ptr<YuvStimProducer>> managedStimulusProducers;
void addManagedStimulusProducer(
const std::shared_ptr<YuvStimProducer>& producer)
{
managedStimulusProducers.push_back(producer);
producer->start();
}
sscl::co::ViralNonPostingInvoker<void> removeManagedStimulusProducerIfUnused(
const std::shared_ptr<YuvStimProducer>& producer)
{
if (!producer) {
co_return;
}
if (!producer->attachedStimulusBuffers.empty()) {
co_return;
}
producer->stop();
managedStimulusProducers.erase(
std::remove_if(
managedStimulusProducers.begin(),
managedStimulusProducers.end(),
[&producer](const std::shared_ptr<YuvStimProducer>& candidate)
{
return candidate == producer;
}),
managedStimulusProducers.end());
const std::shared_ptr<lcamera_dev::CameraSession> deviceSession =
producer->deviceSession;
if (deviceSession) {
co_await (*lcameraDevDll.lcameraDev_releaseDeviceCReq)(deviceSession);
}
producer->deviceSession.reset();
}
void LcameraDevDllState::DlCloser::operator()(void *handle)
{
@@ -37,7 +77,7 @@ std::shared_ptr<YuvStimProducer> findStimProducerByCameraId(
const std::string& resolvedCameraId)
{
for (const std::shared_ptr<YuvStimProducer>& producer :
attachedStimulusProducers)
managedStimulusProducers)
{
assert(producer != nullptr);
if (producer->resolvedCameraId == resolvedCameraId) {
@@ -83,6 +123,16 @@ bool validateAttachRequest(
namespace {
void stopAllManagedProducersBeforeFinalize()
{
for (const std::shared_ptr<YuvStimProducer>& producer :
managedStimulusProducers)
{
assert(producer != nullptr);
producer->stop();
}
}
void loadLcameraDevSymbols()
{
lcameraDevDll.lcameraDev_main = reinterpret_cast<lcameraDev_mainFn *>(
@@ -171,7 +221,7 @@ attachByCreatingProducer(
parsedParams,
configuredMode);
attachedStimulusProducers.push_back(producer);
addManagedStimulusProducer(producer);
co_return co_await attachChannelBufferToProducer(desc, producer);
}
@@ -212,14 +262,8 @@ sscl::co::ViralNonPostingInvoker<int> lcameraBuff_initializeCInd()
sscl::co::ViralNonPostingInvoker<int> lcameraBuff_finalizeCInd()
{
for (const std::shared_ptr<YuvStimProducer>& producer :
attachedStimulusProducers)
{
assert(producer != nullptr);
producer->deviceSession.reset();
}
attachedStimulusProducers.clear();
stopAllManagedProducersBeforeFinalize();
managedStimulusProducers.clear();
if (lcameraDevDll.lcameraDev_exit) {
(*lcameraDevDll.lcameraDev_exit)();
@@ -284,26 +328,11 @@ lcameraBuff_detachDeviceCReq(
producer->destroyAttachedStimulusBuffer(stimBuffer);
const std::shared_ptr<lcamera_dev::CameraSession> deviceSession =
producer->deviceSession;
co_await (*lcameraDevDll.lcameraDev_releaseDeviceCReq)(deviceSession);
if (!producer->attachedStimulusBuffers.empty()) {
co_return StimBuffDeviceOpResult{true, desc};
}
attachedStimulusProducers.erase(
std::remove_if(
attachedStimulusProducers.begin(),
attachedStimulusProducers.end(),
[&producer](const std::shared_ptr<YuvStimProducer>& candidate)
{
return candidate == producer;
}),
attachedStimulusProducers.end());
producer->deviceSession.reset();
co_await removeManagedStimulusProducerIfUnused(producer);
co_return StimBuffDeviceOpResult{true, desc};
}