00001
00029 #include <PlaybackControl.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032
00033
00034
00035 using namespace WURDE;
00036
00037 PlaybackControl::PlaybackControl(const std::string & streamname){
00038 init(streamname,STRAT_NORMAL,"Any");
00039
00040
00041 m_haveGlobalname=false;
00042 }
00043
00044 PlaybackControl::PlaybackControl(const ConnectionStrategy & strategy,const std::string & gblName){
00045 init("Any",strategy,gblName);
00046
00047 if(strategy==STRAT_NORMAL){
00048
00049
00050
00051 m_haveGlobalname=false;
00052 }
00053
00054 m_haveStream=false;
00055
00056 }
00057
00058 PlaybackControl::PlaybackControl(const std::string &streamname,const std::string &gblName){
00059 init(streamname,STRAT_NORMAL,gblName);
00060 }
00061
00062 void PlaybackControl::init(const std::string &streamname,const ConnectionStrategy &strategy,const std::string &gblName){
00063 m_globalname=gblName;
00064 m_streamname=streamname;
00065
00066 myCOMObject=NULL;
00067
00068
00069 requests=info;
00070
00071 m_queue=false;
00072 m_supplier=false;
00073 m_doTimestamp=true;
00074 m_doTag=true;
00075
00076 m_doPublishData=false;
00077 m_doPublishInfo=false;
00078
00079 m_initialize=false;
00080 m_strategy=strategy;
00081
00082 m_haveStream=true;
00083 m_haveGlobalname=true;
00084 m_doPublishData=false;
00085 m_doPublishInfo=false;
00086
00087 m_doAutoPing=true;
00088
00089 info.source=streamname;
00090 requests.source=m_globalname;
00091 info.target="Any";
00092 requests.target=streamname;
00093 info.timestamp.now();
00094 requests.timestamp.now();
00095
00096 m_streamRequest=STAT_NULL;
00097
00098 m_sourceModule="Unknown";
00099 }
00100
00101
00102 PlaybackControl::~PlaybackControl(){
00103 myManager=NULL;
00104 if(myCOMObject){
00105
00106
00107 }
00108 }
00109
00110
00111 void PlaybackControl::activateSupplier(){
00112 if(m_haveStream){
00113 m_supplier=true;
00114 m_globalname=m_streamname;
00115 m_haveGlobalname=true;
00116 m_initialize=false;
00117 if(myCOMObject){
00118
00119 myCOMObject->setGlobalName(m_globalname);
00120 myCOMObject->setStreamName(m_streamname);
00121 myCOMObject->setInfo(&requests);
00122 myCOMObject->setRequests(&info);
00123 myCOMObject->setStaging(&data);
00124 myCOMObject->activateSupplier();
00125 myCOMObject->setAutoPing(m_doAutoPing);
00126 myCOMObject->setInfoVector(&m_requestVector);
00127 myCOMObject->setRequestVector(&m_infoVector);
00128 myCOMObject->setDataVector(&m_dataVector);
00129
00130 data.source=m_streamname;
00131 info.source=m_streamname;
00132
00133 if(m_queue){
00134 myCOMObject->setQueueMode(true);
00135 }
00136
00137 }else{
00138 g_fatal("Attempted to activateSupplier before setting a COMObject Please just use registerSupplier.");
00139 exit(-1);
00140 }
00141 if(m_supplier){
00142 info.playbackControl.setCMode(C_SUPPLIER);
00143 }else{
00144 info.playbackControl.setCMode(C_CONSUMER);
00145 }
00146 if(m_supplier){
00147 info.fakeTimeOffset.setCMode(C_SUPPLIER);
00148 }else{
00149 info.fakeTimeOffset.setCMode(C_CONSUMER);
00150 }
00151 if(m_supplier){
00152 info.duration.setCMode(C_SUPPLIER);
00153 }else{
00154 info.duration.setCMode(C_CONSUMER);
00155 }
00156 if(m_supplier){
00157 info.zeroTime.setCMode(C_SUPPLIER);
00158 }else{
00159 info.zeroTime.setCMode(C_CONSUMER);
00160 }
00161 if(m_supplier){
00162 info.loop.setCMode(C_SUPPLIER);
00163 }else{
00164 info.loop.setCMode(C_CONSUMER);
00165 }
00166 if(m_supplier){
00167 info.localFakeTime.setCMode(C_SUPPLIER);
00168 }else{
00169 info.localFakeTime.setCMode(C_CONSUMER);
00170 }
00171 if(m_supplier){
00172 info.multiplier.setCMode(C_SUPPLIER);
00173 }else{
00174 info.multiplier.setCMode(C_CONSUMER);
00175 }
00176 }else{
00177
00178
00179 m_initialize=true;
00180 m_supplier=true;
00181 }
00182
00183 requests=info;
00184
00185 }
00186
00187 void PlaybackControl::activateConsumer(){
00188 std::string localname;
00189
00190 if(m_haveStream){
00191 m_initialize=false;
00192 m_supplier=false;
00193 if(myCOMObject&&myManager){
00194
00195 if(!m_haveGlobalname&&m_strategy==STRAT_NORMAL){
00196 m_globalname=myManager->getName()+PLAYBACKCONTROL+m_streamname+"Consumer";
00197 m_haveGlobalname=true;
00198 }
00199
00200 myCOMObject->setGlobalName(m_globalname);
00201 myCOMObject->setStreamName(m_streamname);
00202 requests.source=m_globalname;
00203 data.source=m_streamname;
00204 info.source=m_streamname;
00205 myCOMObject->setInfo(&info);
00206 myCOMObject->setRequests(&requests);
00207 myCOMObject->setStaging(&data);
00208 myCOMObject->setAutoPing(m_doAutoPing);
00209 myCOMObject->activateConsumer();
00210 myCOMObject->setInfoVector(&m_infoVector);
00211 myCOMObject->setRequestVector(&m_requestVector);
00212 myCOMObject->setDataVector(&m_dataVector);
00213
00214 if(m_queue){
00215 myCOMObject->setQueueMode(true);
00216 }
00217 }else{
00218 g_fatal("Attempted to activateConsumer before setting a COMObject and CommsManager. Please use registerConsumer instead.");
00219 exit(-1);
00220 }
00221
00222 if(m_supplier){
00223 info.playbackControl.setCMode(C_SUPPLIER);
00224 }else{
00225 info.playbackControl.setCMode(C_CONSUMER);
00226 }
00227 if(m_supplier){
00228 info.fakeTimeOffset.setCMode(C_SUPPLIER);
00229 }else{
00230 info.fakeTimeOffset.setCMode(C_CONSUMER);
00231 }
00232 if(m_supplier){
00233 info.duration.setCMode(C_SUPPLIER);
00234 }else{
00235 info.duration.setCMode(C_CONSUMER);
00236 }
00237 if(m_supplier){
00238 info.zeroTime.setCMode(C_SUPPLIER);
00239 }else{
00240 info.zeroTime.setCMode(C_CONSUMER);
00241 }
00242 if(m_supplier){
00243 info.loop.setCMode(C_SUPPLIER);
00244 }else{
00245 info.loop.setCMode(C_CONSUMER);
00246 }
00247 if(m_supplier){
00248 info.localFakeTime.setCMode(C_SUPPLIER);
00249 }else{
00250 info.localFakeTime.setCMode(C_CONSUMER);
00251 }
00252 if(m_supplier){
00253 info.multiplier.setCMode(C_SUPPLIER);
00254 }else{
00255 info.multiplier.setCMode(C_CONSUMER);
00256 }
00257 }else{
00258
00259
00260 m_initialize=true;
00261 }
00262
00263 }
00264
00265 void PlaybackControl::runUpdate(){
00266 if(myCOMObject){
00267
00268 myCOMObject->runUpdate(m_doPublishData,m_doPublishInfo);
00269
00270 m_doPublishData=false;
00271 m_doPublishInfo=false;
00272
00273 }
00274 }
00275
00276 void PlaybackControl::setManager(CommsManager *myManager_){
00277
00278 if(!myCOMObject){
00279 myManager=myManager_;
00280 }
00281
00282 }
00283
00284 void PlaybackControl::setQueueMode(const bool & val){
00285
00286 if(!myCOMObject){
00287 m_queue=val;
00288 }else if(!m_queue&&val){
00289 m_queue=val;
00290 myCOMObject->setDataVector(&m_dataVector);
00291 myCOMObject->setQueueMode(true);
00292
00293 }else if(!val&&m_queue){
00294 m_queue=val;
00295 myCOMObject->setQueueMode(false);
00296 while(!m_dataVector.empty()){
00297 m_dataVector.pop();
00298 }
00299 while(!m_infoVector.empty()){
00300 m_infoVector.pop();
00301 }
00302 while(!m_requestVector.empty()){
00303 m_requestVector.pop();
00304 }
00305 }
00306 }
00307
00308 bool PlaybackControl::newData(){
00309 if(m_queue){
00310 return !m_dataVector.empty();
00311 }else{
00312 if(myCOMObject){
00313 return myCOMObject->newData();
00314 }
00315 }
00316
00317 return false;
00318 }
00319
00320 bool PlaybackControl::newInfo(){
00321 if(m_queue){
00322 if(m_supplier){
00323 return !m_requestVector.empty();
00324 }
00325
00326 return !m_infoVector.empty();
00327 }else{
00328 if(myCOMObject){
00329 return myCOMObject->newInfo();
00330 }
00331 }
00332
00333
00334 return false;
00335 }
00336
00337 void PlaybackControl::publishData(){
00338 if(m_supplier){
00339 if(m_doTimestamp){
00340 data.timestamp.now();
00341 }
00342 if(m_doTag){
00343 data.source=m_globalname;
00344 }
00345 if(m_queue){
00346 PlaybackControlDataStruct temp;
00347 temp.source=data.source;
00348 temp.timestamp=data.timestamp;
00349
00350 m_dataVector.push(temp);
00351
00352 }
00353 m_doPublishData=true;
00354 }
00355 }
00356
00357 void PlaybackControl::publishInfo(){
00358 if(m_supplier){
00359
00360 info.mType=MESSAGE_INFO;
00361 if(m_doTimestamp){
00362 info.timestamp.now();
00363 }
00364
00365 if(m_doTag){
00366 info.source=m_globalname;
00367 info.target="Any";
00368 }
00369
00370 if(m_queue){
00371 PlaybackControlInfoStruct temp;
00372
00373
00374 temp.source=info.source;
00375 temp.playbackControl=info.playbackControl;
00376 temp.fakeTimeOffset=info.fakeTimeOffset;
00377 temp.duration=info.duration;
00378 temp.zeroTime=info.zeroTime;
00379 temp.loop=info.loop;
00380 temp.mType=info.mType;
00381 temp.target=info.target;
00382 temp.timestamp=info.timestamp;
00383 temp.localFakeTime=info.localFakeTime;
00384 temp.multiplier=info.multiplier;
00385
00386 m_infoVector.push(temp);
00387
00388
00389 }
00390
00391 m_doPublishInfo=true;
00392 }else{
00393
00394 requests.mType=MESSAGE_REQUEST;
00395
00396 if(m_doTimestamp){
00397 requests.timestamp.now();
00398 }
00399
00400 if(m_doTag){
00401 requests.source=m_globalname;
00402 requests.target=m_streamname;
00403 }
00404
00405 if(m_queue){
00406 PlaybackControlInfoStruct temp;
00407 if(m_supplier){
00408 temp.playbackControl.setCMode(C_SUPPLIER);
00409 }else{
00410 temp.playbackControl.setCMode(C_CONSUMER);
00411 }
00412 if(m_supplier){
00413 temp.fakeTimeOffset.setCMode(C_SUPPLIER);
00414 }else{
00415 temp.fakeTimeOffset.setCMode(C_CONSUMER);
00416 }
00417 if(m_supplier){
00418 temp.duration.setCMode(C_SUPPLIER);
00419 }else{
00420 temp.duration.setCMode(C_CONSUMER);
00421 }
00422 if(m_supplier){
00423 temp.zeroTime.setCMode(C_SUPPLIER);
00424 }else{
00425 temp.zeroTime.setCMode(C_CONSUMER);
00426 }
00427 if(m_supplier){
00428 temp.loop.setCMode(C_SUPPLIER);
00429 }else{
00430 temp.loop.setCMode(C_CONSUMER);
00431 }
00432 if(m_supplier){
00433 temp.localFakeTime.setCMode(C_SUPPLIER);
00434 }else{
00435 temp.localFakeTime.setCMode(C_CONSUMER);
00436 }
00437 if(m_supplier){
00438 temp.multiplier.setCMode(C_SUPPLIER);
00439 }else{
00440 temp.multiplier.setCMode(C_CONSUMER);
00441 }
00442 temp.source=requests.source;
00443 temp.playbackControl=requests.playbackControl;
00444 temp.fakeTimeOffset=requests.fakeTimeOffset;
00445 temp.duration=requests.duration;
00446 temp.zeroTime=requests.zeroTime;
00447 temp.loop=requests.loop;
00448 temp.mType=requests.mType;
00449 temp.target=requests.target;
00450 temp.timestamp=requests.timestamp;
00451 temp.localFakeTime=requests.localFakeTime;
00452 temp.multiplier=requests.multiplier;
00453
00454 m_requestVector.push(temp);
00455
00456
00457 }
00458
00459 m_doPublishInfo=true;
00460 }
00461 }
00462
00463 PlaybackControlDataStruct PlaybackControl::getNextData(){
00464 if(m_queue){
00465 PlaybackControlDataStruct retval;
00466 retval.source="NULL";
00467 if(m_dataVector.empty()){
00468 return data;
00469 }
00470
00471 retval.source=m_dataVector.front().source;
00472 retval.timestamp=m_dataVector.front().timestamp;
00473
00474
00475 m_dataVector.pop();
00476 data=retval;
00477
00478 return retval;
00479 }else{
00480 myCOMObject->resetData();
00481 return data;
00482 }
00483 }
00484
00485 PlaybackControlInfoStruct PlaybackControl::getNextInfo(){
00486 if(m_queue){
00487 PlaybackControlInfoStruct retval;
00488 if(m_supplier){
00489 retval.playbackControl.setCMode(C_SUPPLIER);
00490 }else{
00491 retval.playbackControl.setCMode(C_CONSUMER);
00492 }
00493 if(m_supplier){
00494 retval.fakeTimeOffset.setCMode(C_SUPPLIER);
00495 }else{
00496 retval.fakeTimeOffset.setCMode(C_CONSUMER);
00497 }
00498 if(m_supplier){
00499 retval.duration.setCMode(C_SUPPLIER);
00500 }else{
00501 retval.duration.setCMode(C_CONSUMER);
00502 }
00503 if(m_supplier){
00504 retval.zeroTime.setCMode(C_SUPPLIER);
00505 }else{
00506 retval.zeroTime.setCMode(C_CONSUMER);
00507 }
00508 if(m_supplier){
00509 retval.loop.setCMode(C_SUPPLIER);
00510 }else{
00511 retval.loop.setCMode(C_CONSUMER);
00512 }
00513 if(m_supplier){
00514 retval.localFakeTime.setCMode(C_SUPPLIER);
00515 }else{
00516 retval.localFakeTime.setCMode(C_CONSUMER);
00517 }
00518 if(m_supplier){
00519 retval.multiplier.setCMode(C_SUPPLIER);
00520 }else{
00521 retval.multiplier.setCMode(C_CONSUMER);
00522 }
00523 retval.source="NULL";
00524 if(m_supplier){
00525 if(m_requestVector.empty()){
00526 return requests;
00527 }
00528 retval.source=m_requestVector.front().source;
00529 retval.playbackControl=m_requestVector.front().playbackControl;
00530 retval.fakeTimeOffset=m_requestVector.front().fakeTimeOffset;
00531 retval.duration=m_requestVector.front().duration;
00532 retval.zeroTime=m_requestVector.front().zeroTime;
00533 retval.loop=m_requestVector.front().loop;
00534 retval.mType=m_requestVector.front().mType;
00535 retval.target=m_requestVector.front().target;
00536 retval.timestamp=m_requestVector.front().timestamp;
00537 retval.localFakeTime=m_requestVector.front().localFakeTime;
00538 retval.multiplier=m_requestVector.front().multiplier;
00539
00540
00541 if(m_supplier){
00542 retval.playbackControl.setCMode(C_SUPPLIER);
00543 }else{
00544 retval.playbackControl.setCMode(C_CONSUMER);
00545 }
00546 if(m_supplier){
00547 retval.fakeTimeOffset.setCMode(C_SUPPLIER);
00548 }else{
00549 retval.fakeTimeOffset.setCMode(C_CONSUMER);
00550 }
00551 if(m_supplier){
00552 retval.duration.setCMode(C_SUPPLIER);
00553 }else{
00554 retval.duration.setCMode(C_CONSUMER);
00555 }
00556 if(m_supplier){
00557 retval.zeroTime.setCMode(C_SUPPLIER);
00558 }else{
00559 retval.zeroTime.setCMode(C_CONSUMER);
00560 }
00561 if(m_supplier){
00562 retval.loop.setCMode(C_SUPPLIER);
00563 }else{
00564 retval.loop.setCMode(C_CONSUMER);
00565 }
00566 if(m_supplier){
00567 retval.localFakeTime.setCMode(C_SUPPLIER);
00568 }else{
00569 retval.localFakeTime.setCMode(C_CONSUMER);
00570 }
00571 if(m_supplier){
00572 retval.multiplier.setCMode(C_SUPPLIER);
00573 }else{
00574 retval.multiplier.setCMode(C_CONSUMER);
00575 }
00576 m_requestVector.pop();
00577 requests=retval;
00578 return retval;
00579 }else{
00580 if(m_infoVector.empty()){
00581 return info;
00582 }
00583 retval.source=m_infoVector.front().source;
00584 retval.playbackControl=m_infoVector.front().playbackControl;
00585 retval.fakeTimeOffset=m_infoVector.front().fakeTimeOffset;
00586 retval.duration=m_infoVector.front().duration;
00587 retval.zeroTime=m_infoVector.front().zeroTime;
00588 retval.loop=m_infoVector.front().loop;
00589 retval.mType=m_infoVector.front().mType;
00590 retval.target=m_infoVector.front().target;
00591 retval.timestamp=m_infoVector.front().timestamp;
00592 retval.localFakeTime=m_infoVector.front().localFakeTime;
00593 retval.multiplier=m_infoVector.front().multiplier;
00594
00595 if(m_supplier){
00596 retval.playbackControl.setCMode(C_SUPPLIER);
00597 }else{
00598 retval.playbackControl.setCMode(C_CONSUMER);
00599 }
00600 if(m_supplier){
00601 retval.fakeTimeOffset.setCMode(C_SUPPLIER);
00602 }else{
00603 retval.fakeTimeOffset.setCMode(C_CONSUMER);
00604 }
00605 if(m_supplier){
00606 retval.duration.setCMode(C_SUPPLIER);
00607 }else{
00608 retval.duration.setCMode(C_CONSUMER);
00609 }
00610 if(m_supplier){
00611 retval.zeroTime.setCMode(C_SUPPLIER);
00612 }else{
00613 retval.zeroTime.setCMode(C_CONSUMER);
00614 }
00615 if(m_supplier){
00616 retval.loop.setCMode(C_SUPPLIER);
00617 }else{
00618 retval.loop.setCMode(C_CONSUMER);
00619 }
00620 if(m_supplier){
00621 retval.localFakeTime.setCMode(C_SUPPLIER);
00622 }else{
00623 retval.localFakeTime.setCMode(C_CONSUMER);
00624 }
00625 if(m_supplier){
00626 retval.multiplier.setCMode(C_SUPPLIER);
00627 }else{
00628 retval.multiplier.setCMode(C_CONSUMER);
00629 }
00630 m_infoVector.pop();
00631 info=retval;
00632
00633
00634 requests=info;
00635
00636 return retval;
00637 }
00638 }else{
00639 myCOMObject->resetInfo();
00640 if(m_supplier){
00641 if(m_supplier){
00642 requests.playbackControl.setCMode(C_SUPPLIER);
00643 }else{
00644 requests.playbackControl.setCMode(C_CONSUMER);
00645 }
00646 if(m_supplier){
00647 requests.fakeTimeOffset.setCMode(C_SUPPLIER);
00648 }else{
00649 requests.fakeTimeOffset.setCMode(C_CONSUMER);
00650 }
00651 if(m_supplier){
00652 requests.duration.setCMode(C_SUPPLIER);
00653 }else{
00654 requests.duration.setCMode(C_CONSUMER);
00655 }
00656 if(m_supplier){
00657 requests.zeroTime.setCMode(C_SUPPLIER);
00658 }else{
00659 requests.zeroTime.setCMode(C_CONSUMER);
00660 }
00661 if(m_supplier){
00662 requests.loop.setCMode(C_SUPPLIER);
00663 }else{
00664 requests.loop.setCMode(C_CONSUMER);
00665 }
00666 if(m_supplier){
00667 requests.localFakeTime.setCMode(C_SUPPLIER);
00668 }else{
00669 requests.localFakeTime.setCMode(C_CONSUMER);
00670 }
00671 if(m_supplier){
00672 requests.multiplier.setCMode(C_SUPPLIER);
00673 }else{
00674 requests.multiplier.setCMode(C_CONSUMER);
00675 }
00676 return requests;
00677 }else{
00678 if(m_supplier){
00679 info.playbackControl.setCMode(C_SUPPLIER);
00680 }else{
00681 info.playbackControl.setCMode(C_CONSUMER);
00682 }
00683 if(m_supplier){
00684 info.fakeTimeOffset.setCMode(C_SUPPLIER);
00685 }else{
00686 info.fakeTimeOffset.setCMode(C_CONSUMER);
00687 }
00688 if(m_supplier){
00689 info.duration.setCMode(C_SUPPLIER);
00690 }else{
00691 info.duration.setCMode(C_CONSUMER);
00692 }
00693 if(m_supplier){
00694 info.zeroTime.setCMode(C_SUPPLIER);
00695 }else{
00696 info.zeroTime.setCMode(C_CONSUMER);
00697 }
00698 if(m_supplier){
00699 info.loop.setCMode(C_SUPPLIER);
00700 }else{
00701 info.loop.setCMode(C_CONSUMER);
00702 }
00703 if(m_supplier){
00704 info.localFakeTime.setCMode(C_SUPPLIER);
00705 }else{
00706 info.localFakeTime.setCMode(C_CONSUMER);
00707 }
00708 if(m_supplier){
00709 info.multiplier.setCMode(C_SUPPLIER);
00710 }else{
00711 info.multiplier.setCMode(C_CONSUMER);
00712 }
00713
00714
00715 requests=info;
00716 return info;
00717 }
00718 }
00719 }
00720
00721 void PlaybackControl::setStreamName(const std::string & name){
00722
00723 if(m_supplier&&name=="Any"){
00724 return;
00725 }
00726
00727 m_streamname=name;
00728 m_haveStream=true;
00729
00730 if(m_supplier){
00731 m_globalname=name;
00732 }
00733
00734 if(myCOMObject){
00735 myCOMObject->setStreamName(name);
00736 }
00737
00738 if(m_initialize){
00739 if(m_supplier){
00740 activateSupplier();
00741 }else{
00742 activateConsumer();
00743 }
00744 }
00745
00746 m_streamRequest=STAT_OKAY;
00747 }
00748
00749 void PlaybackControl::setGlobalName(const std::string & name){
00750
00751 if(name=="Any"){
00752 return;
00753 }
00754
00755 m_globalname=name;
00756 m_haveGlobalname=true;
00757 if(m_supplier){
00758 m_streamname=name;
00759 }
00760
00761 if(myCOMObject){
00762 myCOMObject->setGlobalName(name);
00763 }
00764 }
00765
00766 void PlaybackControl::doPing(){
00767 if(myCOMObject){
00768 myCOMObject->doPing();
00769 }
00770 }
00771
00772 void PlaybackControl::setAutoPing(const bool & val){
00773 m_doAutoPing=val;
00774 if(myCOMObject){
00775 myCOMObject->setAutoPing(val);
00776 }
00777 }
00778
00779