2017-05-08 128 views
0

我正在使用ncurses库编写C++程序,并且还播放声音效果。在构建编译时,没有声音。ncurses + SLD2和SDL2_Mixer:尝试播放mp3时没有声音

我已经安装并添加了SDL2和SDL2_Mixer框架到我的IDE项目(我正在使用Xcode)。我也将mp3文件添加到我的其他项目文件所在的目录中。这里是我的代码:

#include <SDL2/SDL.h> 
#include <SDL2_Mixer/SDL_Mixer.h> 
#if defined(WIN32) 
#include "curses.h" 
#else 
#include <curses.h> 
#endif 
... 
int main(int argc, char * argv[]) { 
Mix_Music *music; 

// Initialize music. 
if (SDL_Init(SDL_INIT_AUDIO) < 0) { 
    fprintf(stderr, "unable to initialize SDL\n"); 
    exit(EXIT_FAILURE); 
} 
if (Mix_Init(MIX_INIT_MP3) != MIX_INIT_MP3) { 
    fprintf(stderr, "unable to initialize SDL_mixer\n"); 
    exit(EXIT_FAILURE); 
} 
if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024) != 0) { 
    fprintf(stderr, "unable to initialize audio\n"); 
    exit(EXIT_FAILURE); 
} 
Mix_AllocateChannels(1); // only need background music 
music = Mix_LoadMUS("sound.mp3"); 
if (music) { 
    Mix_PlayMusic(music, -1); 
} 
... 
Mix_HaltMusic(); 
Mix_FreeMusic(music); 
Mix_CloseAudio(); 
Mix_Quit(); 


return 0; 
} 

构建编译成功,我去到终端,然后打开我的项目,然后......没声音!?我究竟做错了什么?

+0

更新:看来我的“sound.mp3”文件没有正确加载。也许我没有在我的main()中正确引用它?它与项目中的其他文件位于同一目录中。 – shopofolive

+1

SDL_GetError告诉你什么?无论文件是否位于“相同”目录中,进程是否具有“当前工作目录”,以及相对路径如何解决。如果你没有改变工作目录,它会被父进程传递。如果您不确定,可以使用[getcwd](https://linux.die.net/man/3/getcwd)进行检查。 – keltar

+0

谢谢你,凯尔塔。 SDL_GetError告诉我:“无法打开'sound.mp3'。”在完成getcwd查询后,它告诉我,我的工作目录是:/ private/tmp。 (因为我正在运行ncurses,所以我必须为项目的构建分配一个临时目录,并且该目录是:/ tmp。)任何想法是什么问题?也许它只是不识别文件? – shopofolive

回答

0

原来所需要的是一个绝对路径的音乐文件:

Mix_AllocateChannels(1); 
music = Mix_LoadMUS("/.../sound.mp3"); 
if (music) { 
Mix_PlayMusic(music, -1); 
}