2

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;
}
Jarrod A.
  • 93
  • 1
  • 9
  • Did you tried with a wav file? – GRiMe2D May 05 '16 at 18:39
  • Yes, and that worked to no avail as well. – Jarrod A. May 06 '16 at 16:14
  • I getting silence for MP3 playback too. Music works for WAV, MOD, IT and S3M - haven't tried OGG or FLAC - silent for MP3. No error codes - as far as SDL_mixer is concerned, the music is playing (music type MUS_MP3, volume 128, not paused or fading). Also - it fails in Windows 7 (SP1, 64-bit) but not in Linux - where the music type is reported as MUS_MP3_MAD rather than MUS_MP3. I'm thinking it may be an issue with the particular decoder used on Windows - I believe smpeg2.dll - but still investigating. Probably converting to OGG is the easy workaround, though. –  Sep 19 '16 at 03:50
  • I should have said - I'm using MinGW GCC, not Visual Studio, and using the pre-built SDL2 packages. –  Sep 19 '16 at 06:37

1 Answers1

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...
}