SDL Mixer无法仅在某些计算机上加载文件

时间:2014-05-03 15:59:55

标签: visual-studio-2008 wav portability sdl-2 sdl-mixer

我已经在网上搜索了一段时间的帮助,但在这个具体问题上找不到帮助: 我打算播放wav文件" click.wav"使用SDL Mixer。由于我到目前为止无法弄清楚的原因,SDL Mixer无法正确加载它。

我不明白的是,完全相同的代码在不同的机器上执行。除了加载和播放声音文件外,其他所有内容都可以完美地编译和执行:

Mix_Chunk *sound = NULL;

sound = Mix_LoadWAV("click.wav");
if(sound == NULL) {
   fprintf(framelog, "Unable to load WAV file: %s\n"; 
   Mix_GetError());
}

Mix_LoadWAV返回NULL但遗憾的是Mix_GetError()不返回错误代码。 我甚至开始看看SDL源代码,但我没有做到。 在SDL_mixer.h中: #define Mix_LoadWAV(file) Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1),即Mix_LoadWAV被调用来自RWOPS结构的Mix_LoadWAV_RW调用替换。它主要委托SDL_RWFromFile(file, "rb")实际打开文件并生成结构。也许这就是错误的起源。

两台计算机都使用Windows 7 64位操作系统,Visual Studio 2008和SDL2。我安装并检查了所有文件: 头文件:C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ gl 32位lib文件:C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ lib 32位DLL文件:C:\ WINDOWS \ SysWOW64 64位lib文件:C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Windows \ VC \ libs \ amd64 64位DLL文件:C:\ WINDOWS \ System32

我为链接器设置了以下附加依赖项: SDL2.lib,SDL2main.lib,opengl32.lib,odbc32.lib,odbccp32.lib,SDL_mixer.lib

您将在下面找到我使用的代码。即使SDL Mixer无法加载wave文件,也可以在此计算机上播放此文件,而不会出现其他程序的任何问题。

如果有关于如何解决这个愚蠢问题的建议,我将非常感激。我不是专家程序员,最近才开始使用SDL。

#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <SDL/SDL.h>    // SDL2 input
#include <SDL/SDL_mixer.h>
#include <GL/freeglut.h>
#include <ctime>        // get time() function for date
#include <algorithm>    // std::random_shuffle
#include <string.h> 

#include <stdlib.h>
#include "randomc.h"                   // define classes for random number generators
//#include "userintf.cpp"                // define system specific user interface
#include "mersenne.cpp"                // members of class TRandomMersenne


int main(int argc, char *argv[])
{
    // Initialize certain SDL units
    if (SDL_Init( SDL_INIT_EVERYTHING ) < 0) {
        printf("Unable to init SDL: %s\n", SDL_GetError());
        exit(1);
    }

    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );  
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, BPP ); 
    SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 1); //1 bit for the stencil

    screen = SDL_CreateWindow(
        "SDL2 window",                  // window title
        SDL_WINDOWPOS_UNDEFINED,           // initial x position
        SDL_WINDOWPOS_UNDEFINED,           // initial y position
        XMAX,                               // width, in pixels
        YMAX,                               // height, in pixels
        SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN           
    );

    // Create an OpenGL context associated with the window.
    screencontext = SDL_GL_CreateContext(screen);

    if (screen == NULL) {
        printf("Unable to set specified video format!\n");
        exit(2);
    }

    glutInit(&argc, argv);
    int audio_rate = 44100;
Uint16 audio_format = AUDIO_S16SYS;
int audio_channels = 2;
int audio_buffers = 1024;

if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0) {
    fprintf(framelog, "Unable to initialize audio: %s\n", Mix_GetError());
    exit(1);
}

Mix_Chunk *sound = NULL;

sound = Mix_LoadWAV("click.wav");
if(sound == NULL) {
    fprintf(framelog, "Unable to load WAV file: %s\n", Mix_GetError());
    exit(1);
 }
}

0 个答案:

没有答案