Fluidsynth MIDI路由器示例无法正常工作问题求助
问题:FluidSynth MIDI路由器回调未触发
你的核心问题是只初始化了MIDI路由器,但没有创建MIDI驱动——FluidSynth的MIDI事件由驱动负责从系统端口捕获,单独的路由器无法主动获取输入事件,因此回调函数不会被触发。
以下是修复后的完整代码:
#include <fluidsynth.h> #include <signal.h> #include <unistd.h> // 用于usleep #define FPS 30 static volatile int running = 1; void intHandler(int value) { running = 0; printf("Exitting loop!\n"); } int handle_midi_event(void *data, fluid_midi_event_t *event) { printf("event type: %d\n", fluid_midi_event_get_type(event) >> 4); return 1; } int main(int argc, char **argv) { fluid_settings_t *settings; fluid_midi_router_t *router; fluid_midi_driver_t *driver; // 新增MIDI驱动变量 settings = new_fluid_settings(); fluid_settings_setint(settings, "midi.autoconnect", 1); // 创建MIDI路由器,绑定自定义回调 router = new_fluid_midi_router(settings, handle_midi_event, NULL); // 创建MIDI驱动,将捕获的事件转发给路由器处理 driver = new_fluid_midi_driver(settings, fluid_midi_router_handle_midi_event, router); signal(SIGINT, intHandler); while (running) { usleep(1000000 / FPS); // 休眠避免CPU满载,同时留时间处理MIDI事件 } // 按创建顺序反向销毁资源 delete_fluid_midi_driver(driver); delete_fluid_midi_router(router); delete_fluid_settings(settings); return 0; }
关键修复说明
- 添加MIDI驱动:
fluid_midi_driver_t是FluidSynth用于捕获系统MIDI输入的核心组件,路由器仅负责事件处理,无法独立获取输入。 - 关联驱动与路由器:使用
fluid_midi_router_handle_midi_event作为驱动的回调函数,驱动会将捕获到的MIDI事件传递给路由器,进而触发你定义的handle_midi_event。 - 优化主循环:空循环会导致CPU占用100%,添加
usleep让程序周期性休眠,既降低资源消耗,也让FluidSynth有时间处理事件队列。
内容的提问来源于stack exchange,提问作者Brick Sigma
相关产品推荐
相关产品推荐

