@@ -35,9 +35,15 @@ osn::Output::~Output() {}
3535
3636void osn::Output::InitOutput (obs_output_t *output)
3737{
38+ {
39+ std::unique_lock lock (m_mtxOutputStop);
40+ m_outputStopped = false ;
41+ }
42+
3843 auto onStopped = [](void *data, calldata_t *) {
3944 osn::Output *context = reinterpret_cast <osn::Output *>(data);
4045 std::unique_lock lock (context->m_mtxOutputStop );
46+ context->m_outputStopped = true ;
4147 context->m_cvStop .notify_one ();
4248 };
4349
@@ -69,10 +75,16 @@ void osn::Output::DeleteOutput()
6975
7076 blog (LOG_INFO , " osn::Output::DeleteOutput" );
7177
72- if (obs_output_active (m_output)) {
78+ bool shouldWaitForStop = false ;
79+ {
80+ std::unique_lock lock (m_mtxOutputStop);
81+ shouldWaitForStop = obs_output_active (m_output) && !m_outputStopped;
82+ }
83+
84+ if (shouldWaitForStop) {
7385 obs_output_stop (m_output);
7486 std::unique_lock lock (m_mtxOutputStop);
75- m_cvStop.wait_for (lock, std::chrono::seconds (20 ));
87+ m_cvStop.wait_for (lock, std::chrono::seconds (20 ), [ this ] { return m_outputStopped; } );
7688 }
7789 obs_output_release (m_output);
7890 m_output = nullptr ;
@@ -116,6 +128,11 @@ void osn::Output::StartOutput()
116128 if (!m_output)
117129 return ;
118130
131+ {
132+ std::unique_lock lock (m_mtxOutputStop);
133+ m_outputStopped = false ;
134+ }
135+
119136 outdated_driver_error::instance ()->set_active (true );
120137 bool result = obs_output_start (m_output);
121138 outdated_driver_error::instance ()->set_active (false );
@@ -179,4 +196,4 @@ obs_output_t *osn::Output::GetOutput()
179196const obs_output_t *osn::Output::GetOutput () const
180197{
181198 return m_output;
182- }
199+ }
0 commit comments