Added playUntil support to live stream buffer, fixing segmented protocols.

This commit is contained in:
Thulinma 2013-07-11 15:57:23 +02:00
parent dfa329f6ed
commit 82b5f9ef59
3 changed files with 17 additions and 11 deletions

View file

@ -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

View file

@ -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();

View file

@ -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.