Page 1 of 1

SDL_Mixer Problem

Posted: Tue Aug 04, 2009 2:00 pm
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. ;)

Re: SDL_Mixer Problem

Posted: Tue Aug 04, 2009 2:36 pm
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.

Re: SDL_Mixer Problem

Posted: Tue Aug 04, 2009 3:13 pm
by RandomDever
You were right but now it just isn't working.

Re: SDL_Mixer Problem

Posted: Tue Aug 04, 2009 3:46 pm
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

Re: SDL_Mixer Problem

Posted: Tue Aug 04, 2009 4:34 pm
by RandomDever
It compiles no errors of warnings
It links same
The error is at runtime is says "DuckHunt.exe Has stopped working" :nono:

Re: SDL_Mixer Problem

Posted: Tue Aug 04, 2009 9:21 pm
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.

Re: SDL_Mixer Problem

Posted: Wed Aug 05, 2009 9:13 am
by RandomDever
Nope
Nope

Fixed

FUCK!!!!!! :evil: :evil: :evil: :evil:

Re: SDL_Mixer Problem

Posted: Thu Aug 06, 2009 10:30 pm
by RandomDever
ummmmmmm...... Noesz!!!!!! :shock2: :shock2: :shock2: :shock2:

Re: SDL_Mixer Problem

Posted: Mon Aug 17, 2009 6:49 pm
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.

Re: SDL_Mixer Problem

Posted: Tue Sep 01, 2009 12:48 pm
by RandomDever
BTW is there a length limitation?