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);
    }
}
Exemplo n.º 2
0
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);
  }
}