diff --git a/src/buffer/buffer.cpp b/src/buffer/buffer.cpp index 909e8d15..575074ea 100644 --- a/src/buffer/buffer.cpp +++ b/src/buffer/buffer.cpp @@ -132,6 +132,11 @@ namespace Buffer { } case 'p': { //play usr->myRing->playCount = -1; + if (usr->S.Received().get().size() >= 2){ + usr->playUntil = atoi(usr->S.Received().get().substr(2).c_str()); + }else{ + usr->playUntil = 0; + } break; } case 'o': { //once-play @@ -203,20 +208,18 @@ namespace Buffer { while (buffer_running){ if (thisStream->getIPInput().connected()){ if (thisStream->getIPInput().spool()){ - bool packed_parsed = false; - do{ + while (true){ thisStream->getWriteLock(); if (thisStream->getStream()->parsePacket(thisStream->getIPInput().Received())){ thisStream->dropWriteLock(true); - packed_parsed = true; }else{ thisStream->dropWriteLock(false); - packed_parsed = false; - Util::sleep(1); //1ms wait + Util::sleep(10); //10ms wait + break; } - }while (packed_parsed); + } }else{ - Util::sleep(1); //1ms wait + Util::sleep(10); //10ms wait } }else{ Util::sleep(1000); //1s wait diff --git a/src/buffer/buffer_user.cpp b/src/buffer/buffer_user.cpp index 3b70be6c..d3d7d693 100644 --- a/src/buffer/buffer_user.cpp +++ b/src/buffer/buffer_user.cpp @@ -81,9 +81,10 @@ namespace Buffer { myRing->waiting = false; Stream::get()->getReadLock(); myRing->b = Stream::get()->getStream()->getNext(myRing->b, allowedTracks); - if (Stream::get()->getStream()->getPacket(myRing->b).isMember("keyframe") && myRing->playCount > 0){ + if ((Stream::get()->getStream()->getPacket(myRing->b).isMember("keyframe") && (myRing->playCount > 0)) || (playUntil && playUntil <= Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt())){ myRing->playCount--; - if ( !myRing->playCount){ + if (myRing->playCount < 1 || playUntil <= Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt()){ + myRing->playCount = 0; JSON::Value pausemark; pausemark["datatype"] = "pause_marker"; pausemark["time"] = Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt(); @@ -113,9 +114,10 @@ namespace Buffer { return false; } myRing->b = Stream::get()->getStream()->getNext(myRing->b, allowedTracks); - if (Stream::get()->getStream()->getPacket(myRing->b).isMember("keyframe") && myRing->playCount > 0){ + if ((Stream::get()->getStream()->getPacket(myRing->b).isMember("keyframe") && (myRing->playCount > 0)) || (playUntil && playUntil <= Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt())){ myRing->playCount--; - if ( !myRing->playCount){ + if (myRing->playCount < 1 || playUntil <= Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt()){ + myRing->playCount = 0; JSON::Value pausemark; pausemark["datatype"] = "pause_marker"; pausemark["time"] = Stream::get()->getStream()->getPacket(myRing->b)["time"].asInt(); diff --git a/src/buffer/buffer_user.h b/src/buffer/buffer_user.h index 0e41ea16..23008c33 100644 --- a/src/buffer/buffer_user.h +++ b/src/buffer/buffer_user.h @@ -28,6 +28,7 @@ namespace Buffer { public: DTSC::Ring * myRing; ///< Ring of the buffer for this user. int MyNum; ///< User ID of this user. + unsigned int playUntil; ///< Time until where is being played or zero if undefined. std::string MyStr; ///< User ID of this user as a string. std::string inbuffer; ///< Used to buffer input data. int currsend; ///< Current amount of bytes sent.