Fixed DTSC input bug with ping commands

This commit is contained in:
Thulinma 2017-01-06 19:18:03 +01:00
parent ba2ef09a7e
commit 8f38872ffc

View file

@ -233,68 +233,79 @@ namespace Mist {
void inputDTSC::getNext(bool smart) { void inputDTSC::getNext(bool smart) {
if (!needsLock()){ if (!needsLock()){
thisPacket.reInit(srcConn); thisPacket.reInit(srcConn);
if (thisPacket.getVersion() == DTSC::DTCM){ while (config->is_active){
nProxy.userClient.keepAlive(); if (thisPacket.getVersion() == DTSC::DTCM){
std::string cmd; nProxy.userClient.keepAlive();
thisPacket.getString("cmd", cmd); std::string cmd;
if (cmd == "reset"){ thisPacket.getString("cmd", cmd);
//Read next packet if (cmd == "reset"){
thisPacket.reInit(srcConn); //Read next packet
if (thisPacket.getVersion() == DTSC::DTSC_HEAD){ thisPacket.reInit(srcConn);
DTSC::Meta newMeta; if (thisPacket.getVersion() == DTSC::DTSC_HEAD){
newMeta.reinit(thisPacket); DTSC::Meta newMeta;
//Detect new tracks newMeta.reinit(thisPacket);
std::set<unsigned int> newTracks; //Detect new tracks
for (std::map<unsigned int, DTSC::Track>::iterator it = newMeta.tracks.begin(); it != newMeta.tracks.end(); it++){ std::set<unsigned int> newTracks;
if (!myMeta.tracks.count(it->first)){ for (std::map<unsigned int, DTSC::Track>::iterator it = newMeta.tracks.begin(); it != newMeta.tracks.end(); it++){
newTracks.insert(it->first); if (!myMeta.tracks.count(it->first)){
newTracks.insert(it->first);
}
} }
}
for (std::set<unsigned int>::iterator it = newTracks.begin(); it != newTracks.end(); it++){ for (std::set<unsigned int>::iterator it = newTracks.begin(); it != newTracks.end(); it++){
INFO_MSG("Reset: adding track %d", *it); INFO_MSG("Reset: adding track %d", *it);
myMeta.tracks[*it] = newMeta.tracks[*it]; myMeta.tracks[*it] = newMeta.tracks[*it];
continueNegotiate(*it, true); continueNegotiate(*it, true);
}
//Detect removed tracks
std::set<unsigned int> deletedTracks;
for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){
if (!newMeta.tracks.count(it->first)){
deletedTracks.insert(it->first);
} }
}
for(std::set<unsigned int>::iterator it = deletedTracks.begin(); it != deletedTracks.end(); it++){ //Detect removed tracks
INFO_MSG("Reset: deleting track %d", *it); std::set<unsigned int> deletedTracks;
myMeta.tracks.erase(*it); for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){
} if (!newMeta.tracks.count(it->first)){
deletedTracks.insert(it->first);
}
}
//Read next packet before returning for(std::set<unsigned int>::iterator it = deletedTracks.begin(); it != deletedTracks.end(); it++){
return getNext(smart); INFO_MSG("Reset: deleting track %d", *it);
myMeta.tracks.erase(*it);
}
thisPacket.reInit(srcConn);//read the next packet before continuing
}else{
myMeta = DTSC::Meta();
}
}else{ }else{
myMeta = DTSC::Meta(); thisPacket.reInit(srcConn);//read the next packet before continuing
} }
}else{ continue;//parse the next packet before returning
//Read next packet before returning }else if (thisPacket.getVersion() == DTSC::DTSC_HEAD){
thisPacket.reInit(srcConn); DTSC::Meta newMeta;
} newMeta.reinit(thisPacket);
}else if (thisPacket.getVersion() == DTSC::DTSC_HEAD){ std::set<unsigned int> newTracks;
DTSC::Meta newMeta; for (std::map<unsigned int, DTSC::Track>::iterator it = newMeta.tracks.begin(); it != newMeta.tracks.end(); it++){
newMeta.reinit(thisPacket); if (!myMeta.tracks.count(it->first)){
std::set<unsigned int> newTracks; newTracks.insert(it->first);
for (std::map<unsigned int, DTSC::Track>::iterator it = newMeta.tracks.begin(); it != newMeta.tracks.end(); it++){ }
if (!myMeta.tracks.count(it->first)){
newTracks.insert(it->first);
} }
}
for (std::set<unsigned int>::iterator it = newTracks.begin(); it != newTracks.end(); it++){ for (std::set<unsigned int>::iterator it = newTracks.begin(); it != newTracks.end(); it++){
INFO_MSG("New header: adding track %d (%s)", *it, newMeta.tracks[*it].type.c_str()); INFO_MSG("New header: adding track %d (%s)", *it, newMeta.tracks[*it].type.c_str());
myMeta.tracks[*it] = newMeta.tracks[*it]; myMeta.tracks[*it] = newMeta.tracks[*it];
continueNegotiate(*it, true); continueNegotiate(*it, true);
}
thisPacket.reInit(srcConn);//read the next packet before continuing
continue;//parse the next packet before returning
} }
return getNext(smart); //We now know we have either a data packet, or an error.
if (!thisPacket.getTrackId()){
if (thisPacket.getVersion() == DTSC::DTSC_V2){
WARN_MSG("Received bad packet for stream %s: %llu@%llu", streamName.c_str(), thisPacket.getTrackId(), thisPacket.getTime());
}else{
//All types except data packets are handled above, so if it's not a V2 data packet, we assume corruption
WARN_MSG("Invalid packet header for stream %s", streamName.c_str());
}
}
return;//we have a packet
} }
}else{ }else{
if (smart) { if (smart) {