SDL_Mixer Problem

Whether you're a newbie or an experienced programmer, any questions, help, or just talk of any language will be welcomed here.

Moderator: Coders of Rage

Post Reply
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

SDL_Mixer Problem

Post by RandomDever »

Code: Select all

#include "SDL.h"
#include "SDL_mixer.h"
#include "SDL_ttf.h"
#include "SDL_image.h"
#include <string>

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//Score
int score = 0;

//Round
int round = 1;

//Sounds
Mix_Chunk *flap = NULL;

//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *shotMessage = NULL;
SDL_Surface *screen = NULL;
SDL_Surface *shotBox = NULL;
SDL_Surface *duckBox = NULL;
SDL_Surface *scoreBox = NULL;
SDL_Surface *scoreMessage = NULL;
SDL_Surface *hitMessage = NULL;
SDL_Surface *ducks = NULL;
SDL_Surface *bullets = NULL;
SDL_Surface *scoreNumber = NULL;
SDL_Surface *roundNumber = NULL;

//The event structure
SDL_Event event;

//The font that's going to be used
TTF_Font *font = NULL;
TTF_Font *fontLarge = NULL;

//The colors of the fonts
SDL_Color green = { 188, 243, 27 };
SDL_Color blue = { 58, 195, 249 };
SDL_Color white = { 255, 255, 255 };

//The sounds


SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
    loadedImage = IMG_Load( filename.c_str() );

    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old surface
        SDL_FreeSurface( loadedImage );

        //If the surface was optimized
        if( optimizedImage != NULL )
        {
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF ) );
        }
    }

    //Return the optimized surface
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
    //Holds offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit
    SDL_BlitSurface( source, clip, destination, &offset );
}

bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }

    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    //If there was an error in setting up the screen
    if( screen == NULL )
    {
        return false;
    }

    //Initialize SDL_ttf
    if( TTF_Init() == -1 )
    {
        return false;
    }
	//Initialize SDL_mixer
	if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 )
	{
		return false;
	} 

    //Set the window caption
    SDL_WM_SetCaption( "Duck Hunt", NULL );

    //If everything initialized fine
    return true;
}

bool load_files()
{
    //Load the images
    background = load_image( "background.png" );
	shotBox = load_image( "Shotbox_S.png" );
	duckBox = load_image( "Duckbox_S.png" );
	scoreBox = load_image( "Scorebox_S.png" );
	ducks = load_image( "Duck.png" );
	bullets = load_image( "Bullet.png" );

	//Load the sounds
	flap = Mix_LoadWAV( "Flap.wav" );
	if ( flap = NULL )
	{
		return 1;
	}

    //Open the font
    font = TTF_OpenFont( "dlxfont.ttf", 12 );
	fontLarge = TTF_OpenFont( "dlxfont.ttf", 18 );

    //If there was a problem in loading the background
    if( background == NULL )
    {
        return false;
    }

    //If there was an error in loading the font
    if( font == NULL )
    {
        return false;
    }
	if( fontLarge == NULL )
    {
        return false;
    }
    //If everything loaded fine
    return true;
}

void clean_up()
{
    //Free the surfaces
    SDL_FreeSurface( background );
    SDL_FreeSurface( shotMessage );
	SDL_FreeSurface( scoreMessage );
	SDL_FreeSurface( scoreNumber );
	SDL_FreeSurface( hitMessage );
	SDL_FreeSurface( ducks );
	SDL_FreeSurface( bullets );
	SDL_FreeSurface( roundNumber );

	//Free the mixes
	Mix_FreeChunk( flap );

	//Quit SDL_mixer
	Mix_CloseAudio(); 

    //Close the font that was used
    TTF_CloseFont( font );
	TTF_CloseFont( fontLarge );

    //Quit SDL_ttf
    TTF_Quit();

    //Quit SDL
    SDL_Quit();
}

int main( int argc, char* args[] )
{
    //Quit flag
    bool quit = false;

    //Initialize
    if( init() == false )
    {
        return 1;
    }

    //Load the files
    if( load_files() == false )
    {
        return 1;
    }

    //Render the text
    shotMessage = TTF_RenderText_Solid( font, "SHOT", blue );
	scoreMessage = TTF_RenderText_Solid( fontLarge, "SCORE", white );
	hitMessage = TTF_RenderText_Solid( fontLarge, "HIT", green );
	char text[255];
	sprintf_s(text, "%d", score);
	scoreNumber = TTF_RenderText_Solid(fontLarge, text, white);
	sprintf_s(text, "R=%d", round);
	roundNumber = TTF_RenderText_Solid(fontLarge, text, green);

    //If there was an error in rendering the text
    if( shotMessage == NULL )
    {
        return 1;
    }

    //Apply the images to the screen
    apply_surface( 0, 0, background, screen );
	apply_surface( 25, 420, shotBox, screen );
	apply_surface( 140, 420, duckBox, screen );
	apply_surface( 500, 420, scoreBox, screen);
    apply_surface( 50, 460, shotMessage, screen );
	apply_surface( 40, 440, bullets, screen );
	apply_surface( 65, 440, bullets, screen );
	apply_surface( 90, 440, bullets, screen );
	apply_surface( 525, 455, scoreMessage, screen );
	apply_surface( 595, 435, scoreNumber, screen );
	apply_surface( 150, 430, hitMessage, screen );
	apply_surface( 220, 432, ducks, screen );
	apply_surface( 240, 432, ducks, screen );
	apply_surface( 260, 432, ducks, screen );
	apply_surface( 45, 390, roundNumber, screen );

	Mix_PlayChannel( -1, flap, 0 );

    //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    }

    //While the user hasn't quit
    while( quit == false )
    {
        //While there's events to handle
        while( SDL_PollEvent( &event ) )
        {
            //If the user has Xed out the window
            if( event.type == SDL_QUIT )
            {
                //Quit the program
                quit = true;
            }
        }
    }

    //Free surfaces and font then quit SDL_ttf and SDL
    clean_up();

    return 0;
}
When i start the program it doesn't play any sound and yes my speakers are on. ;)
User avatar
hurstshifter
ES Beta Backer
ES Beta Backer
Posts: 713
Joined: Mon Jun 08, 2009 8:33 pm
Favorite Gaming Platforms: SNES
Programming Language of Choice: C/++
Location: Boston, MA
Contact:

Re: SDL_Mixer Problem

Post by hurstshifter »

RandomDever wrote:

Code: Select all

//Load the sounds
   flap = Mix_LoadWAV( "Flap.wav" );
   if ( flap = NULL )
   {
      return 1;
   }
When i start the program it doesn't play any sound and yes my speakers are on. ;)

Be careful when using the assignment operator = instead of the comparison operator ==. Looks like you set your sound to NULL.
"Time is an illusion. Lunchtime, doubly so."
http://www.thenerdnight.com
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

Re: SDL_Mixer Problem

Post by RandomDever »

You were right but now it just isn't working.
User avatar
hurstshifter
ES Beta Backer
ES Beta Backer
Posts: 713
Joined: Mon Jun 08, 2009 8:33 pm
Favorite Gaming Platforms: SNES
Programming Language of Choice: C/++
Location: Boston, MA
Contact:

Re: SDL_Mixer Problem

Post by hurstshifter »

RandomDever wrote:You were right but now it just isn't working.

Can you elaborate? Does it compile? Any runtime errors if so? Let us know
"Time is an illusion. Lunchtime, doubly so."
http://www.thenerdnight.com
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

Re: SDL_Mixer Problem

Post by RandomDever »

It compiles no errors of warnings
It links same
The error is at runtime is says "DuckHunt.exe Has stopped working" :nono:
User avatar
Pickzell
Chaos Rift Junior
Chaos Rift Junior
Posts: 233
Joined: Sat May 16, 2009 10:21 am

Re: SDL_Mixer Problem

Post by Pickzell »

Put the right DLLs in the game's folder, and make sure you update your linker for SDL_Mixer.
Also, the way you have it(I think) your headers have to be in the same folder as your game too.

Plus you set your sound to NULL.

Otherwise I have no idea.
I'm an altogether bad-natured Cupid.
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

Re: SDL_Mixer Problem

Post by RandomDever »

Nope
Nope

Fixed

FUCK!!!!!! :evil: :evil: :evil: :evil:
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

Re: SDL_Mixer Problem

Post by RandomDever »

ummmmmmm...... Noesz!!!!!! :shock2: :shock2: :shock2: :shock2:
User avatar
Spikey
Chaos Rift Cool Newbie
Chaos Rift Cool Newbie
Posts: 98
Joined: Sat Dec 13, 2008 6:39 am
Programming Language of Choice: C++
Location: Ottawa, Canada
Contact:

Re: SDL_Mixer Problem

Post by Spikey »

I added the "Mix_GetError()" function to your code and got this error:
"You are trying to play a chunk on a NULL channel!"

So go back and look at this part of the code...

Code: Select all

  
   //Load the sounds
   flap = Mix_LoadWAV( "Flap.wav" );
   if ( flap = NULL )
   {
      return 1;
   }
You are nullifying the chunk right after loading it.

change "if ( flap = NULL )" to "if ( flap == NULL )"
Enjoy

<<EDIT>>
Oops, I just woke up and realized hurstshifter solved this. Anyway the sound works for me here too, the only other thing that could be messing up your program is all your returns. You have functions returning results but you are not handling errors, you simply close the app down without telling you why. So if a function is returning a result then that return should be dealt with.

Code: Select all

   flap = Mix_LoadWAV( "Flap.wav" );
   if ( flap == NULL )
   {
      return 1;
   }

Code: Select all

	flap = Mix_LoadWAV("Flap.wav");
	if(flap == NULL) {
		printf("Unable to load WAV file: %s\n", Mix_GetError());
	}
This is much better, a problem has occurred and its letting you know and why. No more guessing around, also the game will continue running and not simply shut down.
RandomDever
Chaos Rift Regular
Chaos Rift Regular
Posts: 198
Joined: Thu Mar 26, 2009 8:42 pm
Current Project: My Engine
Programming Language of Choice: C++

Re: SDL_Mixer Problem

Post by RandomDever »

BTW is there a length limitation?
Post Reply