Fixed crash where existing source buffer would be unloaded by an entity when setting a new source buffer causing a crash if the source buffer was still in use by another entity

dev
Shariq Shah 6 years ago
parent de632471e8
commit 480466bb44
  1. 2
      src/common/version.h
  2. 6
      src/game/event.c
  3. 3
      src/game/event.h
  4. 3
      src/game/sound_source.c
  5. 1
      src/game/trigger.c
  6. 1
      todo.txt

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 350 #define SYMMETRY_VERSION_REVISION 351
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -24,6 +24,7 @@ void event_manager_init(struct Event_Manager* event_manager)
struct Event* event = &event_manager->event_pool[i]; struct Event* event = &event_manager->event_pool[i];
memset(event, '\0', sizeof(struct Event)); memset(event, '\0', sizeof(struct Event));
event->type = EVT_NONE; event->type = EVT_NONE;
event->sender = NULL;
} }
event_manager->sdl_event_id = SDL_RegisterEvents(1); event_manager->sdl_event_id = SDL_RegisterEvents(1);
@ -246,7 +247,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager)
subscription->Subscription_Without_Objects.handler(user_event); subscription->Subscription_Without_Objects.handler(user_event);
break; break;
case EST_SENDER: case EST_SENDER:
if(subscription->Subscription_Sender.handler) if(subscription->Subscription_Sender.handler && user_event->sender == subscription->Subscription_Sender.sender)
subscription->Subscription_Sender.handler(user_event, subscription->Subscription_Sender.sender); subscription->Subscription_Sender.handler(user_event, subscription->Subscription_Sender.sender);
break; break;
case EST_SUBSCRIBER: case EST_SUBSCRIBER:
@ -254,7 +255,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager)
subscription->Subscription_Subscriber.handler(user_event, subscription->Subscription_Subscriber.subscriber); subscription->Subscription_Subscriber.handler(user_event, subscription->Subscription_Subscriber.subscriber);
break; break;
case EST_SUBSCRIBER_SENDER: case EST_SUBSCRIBER_SENDER:
if(subscription->Subscription_Subscriber_Sender.handler) if(subscription->Subscription_Subscriber_Sender.handler && user_event->sender == subscription->Subscription_Sender.sender)
subscription->Subscription_Subscriber_Sender.handler(user_event, subscription->Subscription_Subscriber_Sender.subscriber, subscription->Subscription_Subscriber_Sender.sender); subscription->Subscription_Subscriber_Sender.handler(user_event, subscription->Subscription_Subscriber_Sender.subscriber, subscription->Subscription_Subscriber_Sender.sender);
break; break;
} }
@ -264,6 +265,7 @@ void event_manager_poll_events(struct Event_Manager* event_manager)
//return event to the pool now that it is consumed //return event to the pool now that it is consumed
memset(user_event, '\0', sizeof(*user_event)); memset(user_event, '\0', sizeof(*user_event));
user_event->type = EVT_NONE; user_event->type = EVT_NONE;
user_event->sender = NULL;
} }
} }
break; break;

@ -103,7 +103,8 @@ struct Trigger_Event
struct Event struct Event
{ {
int type; int type;
void* sender;
union union
{ {
struct Key_Event key; struct Key_Event key;

@ -65,9 +65,6 @@ void sound_source_buffer_set(struct Sound* sound, struct Sound_Source* entity, c
if(new_buffer) if(new_buffer)
{ {
sound_source_instance_destroy(sound, entity->source_instance); sound_source_instance_destroy(sound, entity->source_instance);
if(entity->source_buffer)
sound_source_buffer_destroy(sound, entity->source_buffer);
entity->source_buffer = new_buffer; entity->source_buffer = new_buffer;
entity->type = type; entity->type = type;
entity->source_instance = sound_source_instance_create(sound, entity->source_buffer, true); entity->source_instance = sound_source_instance_create(sound, entity->source_buffer, true);

@ -95,6 +95,7 @@ void trigger_update_physics(struct Trigger* trigger, struct Scene* scene, float
struct Event* trigger_event = event_manager_create_new_event(event_manager); struct Event* trigger_event = event_manager_create_new_event(event_manager);
trigger_event->type = EVT_TRIGGER; trigger_event->type = EVT_TRIGGER;
trigger_event->trigger.sender = trigger; trigger_event->trigger.sender = trigger;
trigger_event->sender = trigger;
event_manager_send_event(event_manager, trigger_event); event_manager_send_event(event_manager, trigger_event);
if(trigger->type == TRIG_ONE_SHOT) if(trigger->type == TRIG_ONE_SHOT)
scene_trigger_remove(scene, trigger); scene_trigger_remove(scene, trigger);

@ -2,7 +2,6 @@ Todo:
- Win/fail States - Win/fail States
- Save scene init/cleanup funcs if there are any assigned when saving scene - Save scene init/cleanup funcs if there are any assigned when saving scene
- Save case sensitive file names when scene entity entries - Save case sensitive file names when scene entity entries
- Investigate whether toggle trigger is working properly
- Player/enemies getting hit by bullets - Player/enemies getting hit by bullets
- Remove excessive repitition in scene and editor code that handles multiple entity types - Remove excessive repitition in scene and editor code that handles multiple entity types
- Allow switching to editor mode when game is in pause mode - Allow switching to editor mode when game is in pause mode

Loading…
Cancel
Save