livoxGen1🐛 Call stop() on all producers before deleting in _exit
This commit is contained in:
@@ -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};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user