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;
}
构建编译成功,我去到终端,然后打开我的项目,然后......没声音!?我究竟做错了什么?
更新:看来我的“sound.mp3”文件没有正确加载。也许我没有在我的main()中正确引用它?它与项目中的其他文件位于同一目录中。 – shopofolive
SDL_GetError告诉你什么?无论文件是否位于“相同”目录中,进程是否具有“当前工作目录”,以及相对路径如何解决。如果你没有改变工作目录,它会被父进程传递。如果您不确定,可以使用[getcwd](https://linux.die.net/man/3/getcwd)进行检查。 – keltar
谢谢你,凯尔塔。 SDL_GetError告诉我:“无法打开'sound.mp3'。”在完成getcwd查询后,它告诉我,我的工作目录是:/ private/tmp。 (因为我正在运行ncurses,所以我必须为项目的构建分配一个临时目录,并且该目录是:/ tmp。)任何想法是什么问题?也许它只是不识别文件? – shopofolive