SDL_Mixer音频无法播放

时间:2016-05-05 18:29:29

标签: c++ sdl sdl-mixer

好吧,这就是问题所在。我开始学习SDL,并希望为这个游戏添加一些音频"我正在为一个学校项目做准备。音频不能从我的程序中播放,但我阅读和下载的教程代码中包含音频和播放。我真的很困惑为什么我的音频不会播放,但这就是我所知道的并不错。

  1. mp3与代码
  2. 位于同一文件夹中
  3. mp3以44100赫兹的速度播放,就像Mixer所期望的那样。
  4. 非常感谢任何帮助,这是代码

    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include "SDL/SDL.h"
    #include "SDL2/SDL.h"
    #include <SDL2/SDL_mixer.h>
    
    
    //The attributes of the screen
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 640;
    const int SCREEN_BPP = 32;
    
    //The surfaces that will be used
    Mix_Music *music = NULL;
    SDL_Surface *wall = NULL;
    SDL_Surface *path = NULL;
    SDL_Surface *breadcrumb = NULL;
    SDL_Surface *deadend = NULL;
    SDL_Surface *screen = NULL;
    SDL_Event event;
    
    using namespace std;
    ////////////////////////////////////////////////////////////
    SDL_Surface *load_image( string filename )
    {
        SDL_Surface* loadedImage = NULL;        //Temporary storage for the image that's loaded
        SDL_Surface* optimizedImage = NULL;    //The optimized image that will be used
        loadedImage = SDL_LoadBMP( filename.c_str() );    //Load the image
        if( loadedImage != NULL )    //If nothing went wrong in loading the image
        {
            optimizedImage = SDL_DisplayFormat( loadedImage );        //Create an optimized image
            SDL_FreeSurface( loadedImage );        //Free the old image
        }
        return optimizedImage;    //Return the optimized image
    }
    ////////////////////////////////////////////////////////////
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
    {
        SDL_Rect offset;    //Make a temporary rectangle to hold the offsets
        offset.x = x;    //Give the offsets to the rectangle
        offset.y = y;
        SDL_BlitSurface( source, NULL, destination, &offset );    //Blit th
    }
    using namespace std;
    
    char MAZE[22][22];
    ////////////////////////////////////////////////////////////////////////
    void Initialize()
    {
        int X,Y;
        for (X=0;X<22;X++)
            for (Y=0;Y<22;Y++)
                MAZE[X][Y]='0';
        ifstream fin ("maze.txt");
        if (fin.is_open())
        {
            for (X=1;X<21;X++)
                for (Y=1;Y<21;Y++)
                    fin>>MAZE[X][Y];
            fin.close();
        }
        else cout << "Unable to open maze.txt\n";
        return;
    }
    ////////////////////////////////////////////////////////////////////////
    void PrintMaze()
    {   
        int gx,gy;
        system("clear");
        for (int Y=1;Y<21;Y++)
        {
            for (int X=1;X<21;X++)
            {
                gx=32*(X-1);
                gy=32*(Y-1);
                cout<<MAZE[X][Y];
                switch (MAZE[X][Y])
                {
                    case '.':
                        apply_surface( gx, gy, wall, screen );
                    break;
                    case 'X':
                        apply_surface( gx, gy, path, screen );
                    break;
                    case '*':
                        apply_surface( gx, gy, breadcrumb, screen );
                    break;
                }
            }cout<<"\n";
    
        }
        if( SDL_Flip( screen ) == -1 ) return;
        cout<<flush;
        system("sleep .2");
        return;
    }
    ////////////////////////////////////////////////////////////////////////
    int Solve(int X, int Y)
    {
        if ((X==20)&&(Y==20))
        {
            cout<<"("<<X<<","<<Y<<")";
            return 1;
        }
        if (MAZE[X][Y]!='X') return 0;
        else
        {
            PrintMaze();
            MAZE[X][Y]='*';
            for (int A=(X+1);A>=(X-1);A--)
                for (int B=(Y+1);B>=(Y-1);B--)
                    if (Solve(A,B)==1)
                    {
                        cout<<"("<<X<<","<<Y<<")";
                        return 1;
                    }
        }
        MAZE[X][Y]='.';
        return 0;
    }
    ////////////////////////////////////////////////////////////////////////
    int main()
    {
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )    //Initialize all SDL subsystems
            return 1;
        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );    //Set up the screen
        if( screen == NULL )    //If there was an error in setting up the screen
            return 1;  
       //Initialize SDL_mixer
            if( Mix_OpenAudio( 44100, MIX_DEFAULT_FORMAT, 2, 2048 ) < 0 )
            {
                        printf( "SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError() );
            }
        SDL_WM_SetCaption( "Dank Solver", NULL );    //Set the window caption
        wall = load_image( "wall.bmp" );    //Load the images
        path = load_image( "path.bmp" );
        breadcrumb = load_image( "breadcrumb.bmp" );
        deadend = load_image( "deadend.bmp" );
        music = Mix_LoadMUS( "mlg.mp3" );
          if( music == NULL )
        {
            cout<<"Music Error"; 
            return 0;   
        }
    
        Initialize();
        Mix_PlayMusic ( music, -1 );
        PrintMaze();
        if (Solve(1,1)==0) cout<<"No Solution\n";
        else cout<<"Solution Found\n";
        SDL_FreeSurface( wall );
        SDL_FreeSurface( path );
        SDL_FreeSurface( breadcrumb );
        SDL_FreeSurface( deadend );
        Mix_FreeMusic ( music );
        Mix_CloseAudio();
        SDL_Quit();         //Quit SDL
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

知道输出的内容会很棒。 如果它说&#34; Music Error&#34;那么你也应该打印Mix_GetError()

printf("Music Error %s",Mix_GetError());

一般来说,无法播放MP3是缺少编解码器/混音器而没有mp3支持的结果。 您还可以在播放文件时检查是否有任何错误。 复制并粘贴doc:

if(Mix_PlayMusic(music, -1)==-1) {
    printf("Mix_PlayMusic: %s\n", Mix_GetError());
    // well, there's no music, but most games don't break without music...
}