Emscripten 和 sdl2_mixer 错误:Mix_Init:不支持声音/音乐加载器 ()

问题描述 投票:0回答:1

我一直在尝试使用 emscripten 和 sdl2 在 C 中创建一个小型 Web 应用程序。我想将 sdl2_mixer 包含到程序中以便播放声音,但控制台一直给我错误:

Mix_Init: no sound/music loaders supported ()
。我能够很好地使用 SDL2 和 SDL2_image,但是一旦我开始导入 SDL2_mixer(甚至不使用它),它就会向我抛出此错误。任何帮助将非常感激。我试图找到使用 emscripten 和 sdl2 的示例和教程,但他们似乎很少使用 sdl2_mixer。

我尝试了很多不同的命令来编译它(例如包括 -sUSE_VORBIS=1 或 -sUSE_OGG=1),但这是我当前正在使用的命令:

emcc source/main.c -o main.html -s USE_SDL=2 -s USE_SDL_IMAGE=2 -s USE_SDL_MIXER=2  -s  SDL2_IMAGE_FORMATS=["png"] -s ALLOW_MEMORY_GROWTH=1 --preload-file assets

这是该项目的代码(请注意,我并没有尝试在项目中播放声音。只需包含它即可。):

#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <emscripten.h>
#include <stdlib.h>


SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Rect destinationRect = {100, 100, 0, 0};


void render_loop() {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT) {
            emscripten_cancel_main_loop();
            break;
        }
    }
    
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, texture, NULL, &destinationRect);
    SDL_RenderPresent(renderer);
}

int main() {

    SDL_Init(SDL_INIT_VIDEO);
    IMG_Init(IMG_INIT_PNG);
       

    window = SDL_CreateWindow("SDL2_image Example",
                              SDL_WINDOWPOS_CENTERED,
                              SDL_WINDOWPOS_CENTERED,
                              800, 600,
                              0);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    
    SDL_Surface *surface = IMG_Load("assets/triangle.png");
    if (!surface) {
        printf("Failed to load image: %s\n", IMG_GetError());
        return 1;
    }
    
    destinationRect.w = surface->w;
    destinationRect.h = surface->h;
    
    texture = SDL_CreateTextureFromSurface(renderer, surface);
    if (!texture) {
        printf("Failed to create texture: %s\n", SDL_GetError());
        return 1;
    }
    
    SDL_FreeSurface(surface);

    emscripten_set_main_loop(render_loop, 0, 1);
    
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    IMG_Quit();
    SDL_Quit();
    
    return 0;
}


c sdl-2 emscripten sdl-mixer
1个回答
0
投票

我能够让它工作。我不得不恢复到旧版本的emsdk(我使用的是3.1.44)。我认为一定存在某种错误。

© www.soinside.com 2019 - 2024. All rights reserved.