/** 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(); }
// * 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; }
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; }