所以我有一个存档,它将我的.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)':无法将参数1从'void *'转换为'Mix_Music *'
如果您有使用SDL2的更好的解决方案,那么我也愿意研究一下。
谢谢。
答案 0 :(得分:2)
将{(3)未记录的Mix_LoadMUS_RW()
与SDL_RWops
中的SDL_RWFromMem()
一起使用。
答案 1 :(得分:0)
我发现了这一点,并且效果很好
您可以简单地执行以下操作。 当然,您可能必须更改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);
}
EDIT我遇到了其他问题,并且渠道重叠。因此,如果您需要同时运行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);