fluidsynth修改midi播放的通道为ring

fluidsynth修改midi播放的通道为ring

在前面一篇文章中,记录了FluidSynth编译的各种小坑。现在进行一个实践操作。修改midi播放通道为ring

fluidsynth中用于播放声音的库由很多,即,audio.driver有很多,默认是oboe的。现在我们希望当midi播放时,选在opensles作为播放驱动。并将其声音,该为ring通道。

查看代码可以知道,opensles的创建在文件:/src/drivers/fluid_opensles.c文件中。

翻越android NDK文档,关于OPENGLES的介绍,点击此处查看

在CreateAudioPlayer之后,realize之前,进行声音通道的配置。

结合fluid_opensles.c文件中的结构,在fluid_opensles_audio_driver_t结构体中,增加如下代码:

typedef struct
{
    fluid_audio_driver_t driver;
    SLObjectItf engine;
    SLObjectItf output_mix_object;
    SLObjectItf audio_player;
    SLPlayItf audio_player_interface;
    SLAndroidSimpleBufferQueueItf player_buffer_queue_interface;
    SLAndroidConfigurationItf playerConfig;//注意,此处是我们增加的代码,看看命名规范的差异

    void *synth;
    int period_frames;

    int is_sample_format_float;

    /* used only by callback mode */
    short *sles_buffer_short;
    float *sles_buffer_float;

    int cont;

    double sample_rate;
} fluid_opensles_audio_driver_t;

然后在创建player时,指示需要配置接口,因此,修改如下代码:

const SLInterfaceID ids1[] = {SL_IID_ANDROIDCONFIGURATION,SL_IID_ANDROIDSIMPLEBUFFERQUEUE};
        const SLboolean req1[] = {SL_BOOLEAN_TRUE,SL_BOOLEAN_TRUE };
        result = (*engine_interface)->CreateAudioPlayer(engine_interface,
                &(dev->audio_player), &audio_src, &audio_sink, 2, ids1, req1);

即ids1和req1数组,分别增加SL_IID_ANDROIDCONFIGURATION,SL_BOOLEAN_TRUE。否则后面无法获取到正确的配置对象。

现在player支持配置了,那么接下来就是进行配置,配置一个发生在Realize调用之前。因此在Realize调用前增加如下代码:

 // Force the use of the ring
 //获取配置对象
    result = (*dev->audio_player)->GetInterface(dev->audio_player,
            SL_IID_ANDROIDCONFIGURATION, &(dev->playerConfig));

    if(result != SL_RESULT_SUCCESS)
    {
        goto error_recovery;
    }

//修改配置
    SLint32 streamType = SL_ANDROID_STREAM_RING;
    result = (*dev->playerConfig)->SetConfiguration(dev->playerConfig,
            SL_ANDROID_KEY_STREAM_TYPE,&streamType, sizeof(SLint32));

    if(result != SL_RESULT_SUCCESS)
    {
        goto error_recovery;
    }

至此,一切修改完毕,重新编译,放入app中,即可运行。现在我的midi播放器可以通过ring通道来调节音量,而mp3可以通过media通道来调节音量了。

为了便于有需要的伙伴,现将所有代码附上,见链接点击此处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、这两个虚拟MIDI通道软件是5大教程里要用到的软件,且不太容易找到。5教程中提到的其它软件(freepiano+ EveryonePiano+Addictive Keys+EOP简谱大师),百度搜索都很容易可以得到。 二、5个PDF教程为本人原创,后期如有空,会上传百度经验(百度经验ID:morzate),但是百度经验的通过率不是太高,对图片、对标题、对正文的要求太多了)。 三、本付费附件包的内容包括以下三个方面,PDF教程的核心文字下面也会列出。 1、虚拟MIDI通道软件MidiYoke 2、虚拟MIDI通道软件loopMIDI 3、5大PDF教程 四、 第1个PDF教程《01键盘侠用PC电脑键盘虚拟MIDI键盘弹模拟钢琴并另存为MIDI教程——freepiano(免费软件)》,主要内容简介如下: 4.1下载freepiano 4.2解压后双击freepiano.exe打开它,全默认设置 4.3点击录制,PC键盘弹奏,再点停止。 4.4点左上角的菜单“录音”导出MIDI ,wav,MP4 五、 第2个PDF教程 《02实体MIDI键盘弹模拟钢琴并另存为MIDI教程——freepiano(免费软件)》,主要内容简介如下: 5.1下载freepiano解压后双击freepiano.exe打开它 5.2点击 设置,设备,MIDI输入,选你的实体MIDI键盘 5.3点击录制,用MIDI键盘弹奏,再点停止 5.4再点左上角的菜单“录音” ,导出MIDI ,wav,MP4 六、 第3个PDF教程 《03键盘侠用PC电脑键盘虚拟MIDI键盘弹钢琴EOP格式转MIDI格式教程(WIN10)》,主要内容简介如下: 6.1、安装2个虚拟MIDI通道软件( Midi Yoke(虚拟MIDI接口) + loopMIDISetup) 期间需要重启, loopMIDI中增加2个midi虚拟端口loopMIDI+loopMIDI1; Midi Yoke增加16个端口后) ——一般这两个loopmidi是默认随开机启动的,运后续步骤都必须开启这两个虚拟软件。 6.2、安装虚拟PC键盘钢琴软件 EveryonePiano. (因为EveryonePiano 不能将内录另存为MIDI,只能存为eop) 6.3、安装能内录弹出的PC键盘音乐,并能另存为MIDI的软件Addictive Keys(因为EveryonePiano 不能将内录另存为MIDI,只能存为eop) 6.4、 第一步,将EveryonePiano的音源设置为虚拟端口loopMIDI;同时设置里,勾选“音源自身独立控制通道”; 第二步,再将Addictive Keys的输入选择为虚拟端口loopMIDI。 6.5、打开Addictive Keys的录音功能,再点开EveryonePiano进行弹奏或者播放EOP或者EOPN文件(需要用“EOP简谱跟我弹插件”播放EOPN),关闭Addictive Keys的录音功能,另存为MIDI。结束。 七、 第4个PDF教程 《04实体MIDI键盘弹模拟钢琴EOP格式转midi格式教程(WIN10)》,主要内容简介如下: 7.1、安装钢琴模拟软件 EveryonePiano. (因为EveryonePiano 不能将内录另存为MIDI,只能存为eop) 7.2、安装能内录弹出的PC键盘音乐,并能另存为MIDI的软件Addictive Keys(因为EveryonePiano 不能将内录另存为MIDI,只能存为eop) 7.3、第一步,将EveryonePiano的音源设置为Addictive Keys ;同时设置里,勾选“音源自身独立控制通道”;Everyone piano设置里,MIDI输入中选择你的实体MIDI键盘;第二步,将Addictive Keys的输入选择为端口-你的实体MIDI键盘。 7.4、打开Addictive Keys的录音功能,再点开EveryonePiano,后在实体MIDI键盘上弹奏,弹完关闭Addictive Keys的录音功能,另存为MIDI。结束。 八、 最后第5个PDF教程《05打开MIDI转简谱教程——EOP简谱大师(免费软件)》,主要内容简介如下: 1.1、下载EOP简谱大师 1.2、双击EopNMNMaster打开它,安装它 1.3、安装后找到桌面EOPNMNMaster图标, 双击打开。 1.4、在菜单“文件”→打开→格式下拉选MID,选择你的MIDI 文件输入,简谱就出来了,如果你机器上有PDF虚拟打印机(如果装有福昕pdf阅读器,会自动出现一个虚拟PDF打印机Foxit Reader PDF Printer),还可以把简谱打印成pdf。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值