「已注销」 2023-03-01 08:59 采纳率: 71.4%
浏览 28
已结题

Maui如何使用miniaudio库

想使用miniaudio这个c库(音频相关,可录音和播放等)封装到自己的c++动态链接库中,让后由自己的Maui程序来调用库中的方法。这样做的目的是利用这个库的跨平台特性,让自己的Maui程序写一次就能运行到win、ios、android、Mac上。但是目前我封装的库是VS写的 C++库, 能被C#控制台应用调用,但是集成到Maui中就不行。请问有什么思路吗?

void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
{
    ma_encoder* pEncoder = (ma_encoder*)pDevice->pUserData;
    MA_ASSERT(pEncoder != NULL);

    ma_encoder_write_pcm_frames(pEncoder, pInput, frameCount, NULL);

    (void)pOutput;
}


int RecordSong(wchar_t* outFileName)
{
    ma_result result;
    ma_encoder_config encoderConfig;
    ma_encoder encoder;
    ma_device_config deviceConfig;
    ma_device device;

    encoderConfig = ma_encoder_config_init(ma_encoding_format_wav, ma_format_f32, 2, 44100);

    if (ma_encoder_init_file((char*)outFileName, &encoderConfig, &encoder) != MA_SUCCESS) {
        printf("Failed to initialize output file.\n");
        return -1;
    }

    deviceConfig = ma_device_config_init(ma_device_type_capture);
    deviceConfig.capture.format = encoder.config.format;
    deviceConfig.capture.channels = encoder.config.channels;
    deviceConfig.sampleRate = encoder.config.sampleRate;
    deviceConfig.dataCallback = data_callback;
    deviceConfig.pUserData = &encoder;

    result = ma_device_init(NULL, &deviceConfig, &device);
    if (result != MA_SUCCESS) {
        printf("Failed to initialize capture device.\n");
        return -2;
    }

    result = ma_device_start(&device);
    if (result != MA_SUCCESS) {
        ma_device_uninit(&device);
        printf("Failed to start device.\n");
        return -3;
    }
    

    printf("Press Enter to stop recording...\n");
    getchar();

    ma_device_uninit(&device);
    ma_encoder_uninit(&encoder);

    return 0;

}

int PlaySong(wchar_t* fileName) {

    ma_result result;
    ma_engine engine;

    result = ma_engine_init(NULL, &engine);
    if (result != MA_SUCCESS) {

        printf("%d", result);
        return result;
    }

    ma_sound sound;

    result = ma_sound_init_from_file(&engine, (char*)fileName, 0, NULL, NULL, &sound);
    if (result != MA_SUCCESS) {
        printf("%d", result);
        return result;
    }

    ma_sound_start(&sound);
    
    getchar();
    return 0;

}

[DllImport("miniaudioapi.dll", EntryPoint = "HelloWorld", CallingConvention = CallingConvention.Cdecl)]
          public static extern void HelloWorld(string name);

        [DllImport("miniaudioapi.dll", EntryPoint = "PlaySong", CallingConvention = CallingConvention.Cdecl)]
        public static extern void PlaySong(string fileName);

        [DllImport("miniaudioapi.dll", EntryPoint = "RecordSong", CallingConvention = CallingConvention.Cdecl)]
        public static extern void RecordSong(string outFileName);

  • 写回答

1条回答 默认 最新

  • Web Security Loop 2023-03-02 14:23
    关注

    你的代码部分,我是没有看出来有什么问题。你的C++库可以被C#控制台应用程序调用,那么它应该可以被使用Maui调用的呀。

    • 你看看C++库有没有和Maui应用程序一起打包。文件名、路径和文件格式(.dll)正确。

    • 检查函数的签名是否正确。P/Invoke函数的签名应与C++库中的函数签名匹配。

    • C++库中的所有指针和内存分配调用正确的释放函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月4日
  • 已采纳回答 3月4日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号