| 591 | } |
| 592 | |
| 593 | void SMS :: render(int c, list<SBSMSRenderer*> &renderers) |
| 594 | { |
| 595 | #ifdef MULTITHREADED |
| 596 | pthread_mutex_lock(&renderMutex[c]); |
| 597 | #endif |
| 598 | int n = nRender[c].front(); nRender[c].pop(); |
| 599 | #ifdef MULTITHREADED |
| 600 | pthread_mutex_unlock(&renderMutex[c]); |
| 601 | #endif |
| 602 | TimeType time = synthtime[c]; |
| 603 | for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) { |
| 604 | SBSMSRenderer *renderer = *i; |
| 605 | renderer->startTime(c,time,n); |
| 606 | } |
| 607 | #ifdef MULTITHREADED |
| 608 | pthread_mutex_lock(&trackMutex[c]); |
| 609 | #endif |
| 610 | for(list<Track*>::iterator tt = renderTracks[c].begin(); |
| 611 | tt != renderTracks[c].end();) { |
| 612 | Track *t = (*tt); |
| 613 | if(t->bEnded && time > t->last) { |
| 614 | list<Track*>::iterator eraseMe = tt; |
| 615 | ++tt; |
| 616 | renderTracks[c].erase(eraseMe); |
| 617 | delete t; |
| 618 | } else if(time >= t->start) { |
| 619 | if(time <= t->last) { |
| 620 | t->updateM(time,synthModeOutput); |
| 621 | for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) { |
| 622 | SBSMSRenderer *renderer = *i; |
| 623 | renderer->render(c,t); |
| 624 | } |
| 625 | t->step(time); |
| 626 | } |
| 627 | ++tt; |
| 628 | } else { |
| 629 | break; |
| 630 | } |
| 631 | } |
| 632 | #ifdef MULTITHREADED |
| 633 | pthread_mutex_unlock(&trackMutex[c]); |
| 634 | #endif |
| 635 | for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) { |
| 636 | SBSMSRenderer *renderer = *i; |
| 637 | renderer->endTime(c); |
| 638 | } |
| 639 | synthtime[c]++; |
| 640 | } |
| 641 | |
| 642 | TrackPoint *SMS :: nearestForward(TrackPoint **begin, TrackPoint *tp0, float *minCost2, float maxCost2, float maxDF, float dMCoeff2, float dNCoeff2) |
| 643 | { |