int sequencer_play(midi_file_t *mf, int tag, int pitch, int volume) { aev_client("sequencer_play()"); if(!midiplayer) return -1; midiplayer->pitch = pitch - (60 << 16); mp_select(midiplayer, mf); return 0; }
/** * mul_route_apsp_get_mp_sp - * * Get shortest path between src_sw and dest_sw. If multiple paths exists * it will select a path based of user provided mp_select function or the * first avaialbe route if mp_select is not provided */ static GSList * mul_route_apsp_get_mp_sp(void *rt_service, int src_sw, int dest_sw, void *u_arg, size_t (*mp_select)(void *u_arg, size_t max_routes)) { unsigned int lock, max_retries = 0; rt_apsp_t *rt_apsp_info = rt_service; GSList *route = NULL; rt_list_t *route_list = NULL; size_t mp_rt_hint = 0, num_mp_routes = 0; lweight_pair_t last_hop = { NEIGH_NO_LINK, NEIGH_NO_LINK, NEIGH_NO_PATH, false }; if (src_sw == dest_sw) { goto route_same_node; } retry: if (max_retries++ >= RT_MAX_GET_RETRIES) { c_log_err("Too much writer contention or service died"); return NULL; } lock = c_seq_rd_lock(&rt_apsp_info->state_info->lock); if (!rt_apsp_converged(rt_apsp_info)) { if (c_seq_rd_unlock(&rt_apsp_info->state_info->lock, lock)) { goto retry; } c_log_err("%s: Routes not yet converged", FN); return NULL; } if (rt_apsp_get_weight(rt_apsp_info, src_sw, dest_sw) == NEIGH_NO_PATH) { if (c_seq_rd_unlock(&rt_apsp_info->state_info->lock, lock)) { goto retry; } c_log_err("%s: Not a neigbour (%d:%d) %d", FN, src_sw, dest_sw, rt_apsp_get_weight(rt_apsp_info, src_sw, dest_sw)); return NULL; } route_list = mul_route_apsp_get_subp(rt_apsp_info, src_sw, dest_sw); if (mp_select) { num_mp_routes = mul_route_list_size(route_list); mp_rt_hint = mp_select(u_arg, num_mp_routes); if (mp_rt_hint >= num_mp_routes) { /* Silently ignore any user advice on multi-path selection */ mp_rt_hint = 0; } } route = mul_route_select_single_and_purge_list(route_list, mp_rt_hint); if (c_seq_rd_unlock(&rt_apsp_info->state_info->lock, lock)) { mul_destroy_route(route); goto retry; } route_same_node: add_route_path_elem(&route, dest_sw, &last_hop, true); mul_route_prep_out(route); return route; }