sound problems... again
alex Ioan

read the tutorial but didn't find a good way around this...


1 2#include"sound.h" 3#include <allegro5/allegro.h> 4#include <allegro5/allegro_audio.h> 5#include <allegro5/allegro_acodec.h> 6 ALLEGRO_SAMPLE_ID* bkgid; 7 ALLEGRO_SAMPLE_ID* bkgfid; 8 9void sound::startbackmusic() 10 {if(musicon==1) 11 { bkg=al_load_sample("data/bkg.wav"); al_play_sample(bkg,0.55,0,1.0,ALLEGRO_PLAYMODE_LOOP,bkgid);}} 12 13 14void sound::stopbackmusic(int a) 15 {if(musicon==1) 16 {al_stop_sample(bkgid); 17 if (a==1) 18 {al_destroy_sample(bkg);} 19 } 20 }


1 2#pragma once 3#include <allegro5/allegro.h> 4#include <allegro5/allegro_audio.h> 5#include <allegro5/allegro_acodec.h> 6 7class sound 8{ public: 9sound(): 10 soundon(1), 11 musicon(1), 12 13 crit(al_load_sample("data/crit.wav")), 14 deagle(al_load_sample("data/deagle.wav")), 15 attack(al_load_sample("data/attack.wav")) 16//loading different sounds 17 {} 18 void startbackmusic(); 19 void stopbackmusic(int a); 20 21 22 23private: 24 25ALLEGRO_SAMPLE *bkg; 26//+ all other 27int soundon; 28int musicon; 29 30};

so when I call sound.stopbackmusic(1); it just doesnt work, gives me "access violation reading..." and points to "al_stop_sample(bkgid);"

what am I doing wrong here ? :'(

The only work around I can find is to destroy the sample directly.


simple code in main.cpp



tells me that bkgid is not initialized

Trent Gamblin

If I'm not mistaken then you should be passing already allocated ALLEGRO_SAMPLE_IDs. You could change them from pointers to regular variables and pass the address.

alex Ioan

that....worked !

But how could one know about those default sample_id's ?

anyway this is the correct way to stop a sample ? make it an ID and pass it's address ?

Trent Gamblin

Yes it is.

Edgar Reynaldo

The problem was using a pointer that didn't point to valid memory - it was uninitialized. That's why using an ALLEGRO_SAMPLE_ID on the stack and passing it's address worked.

alex Ioan

Yea sorry but I'm stupid again...

I want to make a simple thing... no loops needed in my opinion:

Display text. If the user presses any keys, clear and display some other text...

I can't make it work

1 2if (player.introcheck()==0) 3{ 4al_clear_to_color(al_map_rgb(0,0,0)); 5//text 6 7al_wait_for_event(event_queue, &ev); 8if (ev.type == ALLEGRO_EVENT_KEY_DOWN) 9{al_flush_event_queue(event_queue); 10al_clear_to_color(al_map_rgb(0,0,0)); 11//more text 12 } 13 14 15al_wait_for_event(event_queue, &ev); 16if (ev.type == ALLEGRO_EVENT_KEY_DOWN) 17{al_flush_event_queue(event_queue); 18player.introset(); 19} 20}

Edgar Reynaldo

If you have a timer registered to your event queue, then you won't ever get your ALLEGRO_EVENT_KEY_DOWN event, and it will just skip past those checks. You need to wait in a loop until the event is an ALLEGRO_EVENT_KEY_DOWN event.

void WaitForKeyPress(ALLEGRO_EVENT_QUEUE* queue) {
   while (1) {
      al_wait_for_event(queue , &ev);
      if (ev.type == ALLEGRO_EVENT_KEY_DOWN) {break;}

alex Ioan

done it ! thanks for the tip !

Thread #607989. Printed from