0

所以我有一个存档,正在将我的 .wav 文件加载到内存中,我正在尝试从 void* 播放 .WAV 或在内存中处理。

II 不能在目录中包含所有 .wav 文件,并且我有一个将它们加载到内存中的函数。

这是我正在尝试的一些代码,我已经尝试了很多东西,但很多似乎都不起作用,我认为 SDL 库正在寻找要加载的物理文件,但我无法确认。

void *MusicTrack;

void Load_andPlay_music(ntrack){

OpenFileFromMPQ( MusicTracks[ntrack], &MusicTrack) // Opens Audio track from MPQ.
Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096);
music = Mix_LoadMUS(MusicTracks[ntrack]);

// I thought that once the file is loaded it might be available as part of $PATH. This is not the case.

Mix_PlayMusic(music, -1);
}

> 如果我试试这个,......

Mix_PlayMusic(MusicTrack, -1); 

我遇到错误 'int Mix_PlayMusic(Mix_Music *,int)': cannot convert argument 1 from 'void *' to 'Mix_Music *'

如果您使用 SDL2 有更好的解决方案,那么我也愿意看看。

谢谢。

4

2 回答 2

2

将(奇怪的是未记录的)Mix_LoadMUS_RW()SDL_RWopsfrom一起使用SDL_RWFromMem()

于 2018-09-25T16:10:29.107 回答
1

我想通了,它工作正常

你可以简单地做这样的事情。当然,您可能必须更改 Mix_openAudio 参数以满足您的需求。

void  snd_init()
{
    printf("SND INIT\n\n");
    // Initialize SDL.
    if (SDL_Init(SDL_INIT_AUDIO) < 0) {

        printf("ERROR : %s\n\n", SDL_GetError());
    }

    if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) < 0) {
        printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
    }
    SoundInited = 1;
}

//either some function or something to read the .WAV file into memory and have it gpbuffer point to it. 

void * gpbuffer;

void playmusic(){


Mix_Chunk * Music = Mix_QuickLoad_WAV((Uint8* )gpbuffer); 
Mix_PlayChannel(2, Music, 0);


}

编辑我遇到了其他问题和频道重叠。因此,如果您需要同时运行 SFX 和音乐,请尝试一下。

    Mix_OpenAudio(22050, AUDIO_S8, 1, 1024);

    SDL_RWops* rw = SDL_RWFromMem(buffer, bytestoread);

    Mix_Music* Song =  Mix_LoadMUS_RW(rw,1);

    Mix_PlayMusic(Song, -1);
于 2018-09-26T20:45:03.210 回答