示例#1
0
/** Destructor.
 *
 *  Releases the underlying Vulkan Event instance and signs the wrapper object out from
 *  the Object Tracker.
 **/
Anvil::Event::~Event()
{
    Anvil::ObjectTracker::get()->unregister_object(Anvil::OBJECT_TYPE_EVENT,
                                                    this);

    release_event();
}
示例#2
0
// * Must be called when deleting a patch or track. (why?)
// * Can't there be hanging notes, or other undefined behaviors, when the event callback is not called?
// Returns true if everything was cleared.
bool SCHEDULER_clear(void){
  //printf("TODO: Implermnet SCHEDULER_clear\n");

  const int max_to_remove = 20; // 2048/20 = 102.4. 102.4 * 64 frames / (48000 frames / seconds) = 0.1365 seconds. I.e. we should never wait more than approx. 0.14 seconds for all events to be cleared.
  int num_removed = 0;
  
  while(g_queue_size>0 && num_removed < max_to_remove){
    event_t *event = get_first_event();
    remove_first_event();
    release_event(event);
    num_removed++;
  }

  if (g_queue_size > 0)
    return false;
  else
    return true;
}
示例#3
0
void SCHEDULER_called_per_block(int64_t reltime){
  int64_t end_time = g_current_time + reltime;

  while(g_queue_size>0){
    event_t *event = get_first_event();
    int64_t event_time = event->time >> SCHEDULER_NUM_PRIORITY_BITS;  // remove priority bits.
    if(event_time < end_time){
      remove_first_event();
      {
        event->callback(scheduler_to_seq_time(event_time), &event->args[0]); // note that the callback can also schedule new events
      }
      release_event(event);
    }else
      break;
  }

  g_current_time = end_time;
}