|
@@ -71,6 +71,7 @@ void Worker::addStream(VideoStream *stream)
|
|
|
{
|
|
|
love::thread::Lock l(mutex);
|
|
|
streams.push_back(stream);
|
|
|
+ cond->broadcast();
|
|
|
}
|
|
|
|
|
|
void Worker::stop()
|
|
@@ -78,6 +79,7 @@ void Worker::stop()
|
|
|
{
|
|
|
love::thread::Lock l(mutex);
|
|
|
stopping = true;
|
|
|
+ cond->broadcast();
|
|
|
}
|
|
|
|
|
|
owner->wait();
|
|
@@ -85,34 +87,39 @@ void Worker::stop()
|
|
|
|
|
|
void Worker::threadFunction()
|
|
|
{
|
|
|
- double lastFrame = love::timer::Timer::getTimeSinceEpoch();
|
|
|
+ double lastFrame = love::timer::Timer::getTime();
|
|
|
+
|
|
|
while (true)
|
|
|
{
|
|
|
- double curFrame = love::timer::Timer::getTimeSinceEpoch();
|
|
|
- double dt = curFrame-lastFrame;
|
|
|
- lastFrame = curFrame;
|
|
|
+ love::sleep(2);
|
|
|
|
|
|
+ love::thread::Lock l(mutex);
|
|
|
+
|
|
|
+ while (!stopping && streams.empty())
|
|
|
{
|
|
|
- love::thread::Lock l(mutex);
|
|
|
+ cond->wait(mutex);
|
|
|
+ lastFrame = love::timer::Timer::getTime();
|
|
|
+ }
|
|
|
|
|
|
- if (stopping)
|
|
|
- return;
|
|
|
+ if (stopping)
|
|
|
+ return;
|
|
|
|
|
|
- for (auto it = streams.begin(); it != streams.end(); ++it)
|
|
|
+ double curFrame = love::timer::Timer::getTime();
|
|
|
+ double dt = curFrame-lastFrame;
|
|
|
+ lastFrame = curFrame;
|
|
|
+
|
|
|
+ for (auto it = streams.begin(); it != streams.end(); ++it)
|
|
|
+ {
|
|
|
+ VideoStream *stream = *it;
|
|
|
+ if (stream->getReferenceCount() == 1)
|
|
|
{
|
|
|
- VideoStream *stream = *it;
|
|
|
- if (stream->getReferenceCount() == 1)
|
|
|
- {
|
|
|
- // We're the only ones left
|
|
|
- streams.erase(it);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- stream->threadedFillBackBuffer(dt);
|
|
|
+ // We're the only ones left
|
|
|
+ streams.erase(it);
|
|
|
+ break;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- love::sleep(2);
|
|
|
+ stream->threadedFillBackBuffer(dt);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|