You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:07:10