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

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 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里