简体   繁体   中英

SDL_Mixer Audio not playing

Alright so here's the issue. I'm starting to learn SDL, and want to add some audio to this "game" I am making for a school project. The audio won't play from my program, but the code for a tutorial I read and downloaded has audio in it and plays. I'm really confused on why my audio won't play, but here's what I KNOW isn't wrong.

  1. The mp3 is in the same folder as the code
  2. The mp3 plays at 44100 Hz, just like Mixer expects it to.

Any help is greatly appreciated, here is the code

#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;
}

It would be great to know what the output says. If it says "Music Error" then you should also print Mix_GetError()

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

Generally speaking, failing to play an MP3 is the result of missing codecs/mixer built without mp3 support. You can also check for any errors when playing back the file. Copy and pasted from the 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...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM