void AmMediaProcessorThread::run() { struct timeval now,next_tick,diff,tick; unsigned int ts = 0; tick.tv_sec = 0; tick.tv_usec = 10000; // 10 ms gettimeofday(&now,NULL); timeradd(&tick,&now,&next_tick); while(true){ gettimeofday(&now,NULL); if(timercmp(&now,&next_tick,<)){ struct timespec sdiff,rem; timersub(&next_tick,&now,&diff); sdiff.tv_sec = diff.tv_sec; sdiff.tv_nsec = diff.tv_usec * 1000; if(sdiff.tv_nsec > 2000) // 2 ms nanosleep(&sdiff,&rem); } processAudio(ts); events.processEvents(); processDtmfEvents(); ts += 80; // 10 ms timeradd(&tick,&next_tick,&next_tick); } }
void AmMediaProcessorThread::run() { stop_requested = false; struct timeval now,next_tick,diff,tick; // wallclock time unsigned long long ts = 0;//4294417296; tick.tv_sec = 0; tick.tv_usec = 1000*WC_INC_MS; gettimeofday(&now,NULL); timeradd(&tick,&now,&next_tick); while(!stop_requested.get()){ gettimeofday(&now,NULL); if(timercmp(&now,&next_tick,<)){ struct timespec sdiff,rem; timersub(&next_tick,&now,&diff); sdiff.tv_sec = diff.tv_sec; sdiff.tv_nsec = diff.tv_usec * 1000; if(sdiff.tv_nsec > 2000000) // 2 ms nanosleep(&sdiff,&rem); } processAudio(ts); events.processEvents(); processDtmfEvents(); ts = (ts + WC_INC) & WALLCLOCK_MASK; timeradd(&tick,&next_tick,&next_tick); } }