Skip to content

Commit

Permalink
Queue script events calling to avoid unsynchronized multi-thread acce…
Browse files Browse the repository at this point in the history
…ss to the parser
  • Loading branch information
piotrmacha committed Jul 1, 2023
1 parent d4cdce7 commit 1e87f13
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 41 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25)
set(PROJECT_VERSION "0.0.8")
set(PROJECT_VERSION "0.0.9")
if(DEFINED ENV{PROJECT_VERSION})
set(PROJECT_VERSION "$ENV{PROJECT_VERSION}")
endif()
Expand Down
12 changes: 6 additions & 6 deletions _externals/BassMusic.d
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,19 @@ func void BassMusic_OnChangeEvent(var func callback) {};
func void BassMusic_SetFullScriptControl(var int active) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_TransitionTime: Set TransitionTime option value.
// BassMusic_Opt_TransitionTime: Set TransitionTime option value.
// @param var float time: Transition time in miliseconds
// ---------------------------------------------------------------
func void BassMuisc_Opt_TransitionTime(var float time) {};
func void BassMusic_Opt_TransitionTime(var float time) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_ForceDisableReverb: Set ForceDisableReverb option value.
// BassMusic_Opt_ForceDisableReverb: Set ForceDisableReverb option value.
// @param var int enabled: Boolean value
// ---------------------------------------------------------------
func void BassMuisc_Opt_ForceDisableReverb(var int enabled) {};
func void BassMusic_Opt_ForceDisableReverb(var int enabled) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_ForceFadeTransition: Set ForceFadeTransition option value.
// BassMusic_Opt_ForceFadeTransition: Set ForceFadeTransition option value.
// @param var int enabled: Boolean value
// ---------------------------------------------------------------
func void BassMuisc_Opt_ForceFadeTransition(var int enabled) {};
func void BassMusic_Opt_ForceFadeTransition(var int enabled) {};
12 changes: 6 additions & 6 deletions docs/scriptable-interface.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,22 +60,22 @@ func void BassMusic_OnChangeEvent(var func callback) {};
func void BassMusic_SetFullScriptControl(var int active) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_TransitionTime: Set TransitionTime option value.
// BassMusic_Opt_TransitionTime: Set TransitionTime option value.
// @param var float time: Transition time in miliseconds
// ---------------------------------------------------------------
func void BassMuisc_Opt_TransitionTime(var float time) {};
func void BassMusic_Opt_TransitionTime(var float time) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_ForceDisableReverb: Set ForceDisableReverb option value.
// BassMusic_Opt_ForceDisableReverb: Set ForceDisableReverb option value.
// @param var int enabled: Boolean value
// ---------------------------------------------------------------
func void BassMuisc_Opt_ForceDisableReverb(var int enabled) {};
func void BassMusic_Opt_ForceDisableReverb(var int enabled) {};

// ---------------------------------------------------------------
// BassMuisc_Opt_ForceFadeTransition: Set ForceFadeTransition option value.
// BassMusic_Opt_ForceFadeTransition: Set ForceFadeTransition option value.
// @param var int enabled: Boolean value
// ---------------------------------------------------------------
func void BassMuisc_Opt_ForceFadeTransition(var int enabled) {};
func void BassMusic_Opt_ForceFadeTransition(var int enabled) {};
```
## Full Script Control
Expand Down
28 changes: 14 additions & 14 deletions plugin/src/Gothic/CMusicSys_Bass.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,48 @@ namespace GOTHIC_NAMESPACE
{
namespace BassEvent
{
void Event_OnEnd(const NH::Bass::MusicDef* musicDef, int data, void* userData)
void Event_OnEnd(const NH::Bass::MusicDef musicDef, int data, void* userData)
{
NH::Log::Debug("Event", Union::StringUTF8("Event_OnEnd: ") + Union::StringUTF8(musicDef->Filename.ToChar()));
NH::Log::Debug("Event", Union::StringUTF8("Event_OnEnd: ") + Union::StringUTF8(musicDef.Filename.ToChar()));

for (int i = 0; i < Globals->Event_OnEnd_Functions.GetNumInList(); i++)
{
const int funcId = Globals->Event_OnEnd_Functions[i];
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef->Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef->Name.ToChar());
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef.Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef.Name.ToChar());
parser->CallFunc(funcId);
}
}

void Event_OnTransition(const NH::Bass::MusicDef* musicDef, int data, void* userData)
void Event_OnTransition(const NH::Bass::MusicDef musicDef, int data, void* userData)
{
NH::Log::Debug("Event", Union::StringUTF8("Event_OnTransition: ") + Union::StringUTF8(musicDef->Filename.ToChar())
NH::Log::Debug("Event", Union::StringUTF8("Event_OnTransition: ") + Union::StringUTF8(musicDef.Filename.ToChar())
+ Union::StringUTF8::Format(", %i ms", data));

for (int i = 0; i < Globals->Event_OnTransition_Functions.GetNumInList(); i++)
{
const int funcId = Globals->Event_OnTransition_Functions[i];
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef->Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef->Name.ToChar());
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef.Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef.Name.ToChar());
parser->CallFunc(funcId, data);
}
}

void Event_OnChange(const NH::Bass::MusicDef* musicDef, int data, void* userData)
void Event_OnChange(const NH::Bass::MusicDef musicDef, int data, void* userData)
{
NH::Log::Debug("Event", Union::StringUTF8("Event_OnChange: ") + Union::StringUTF8(musicDef->Filename.ToChar()));
NH::Log::Debug("Event", Union::StringUTF8("Event_OnChange: ") + Union::StringUTF8(musicDef.Filename.ToChar()));

zSTRING filename = zSTRING(musicDef->Filename.ToChar());
zSTRING name = zSTRING(musicDef->Name.ToChar());
zSTRING filename = zSTRING(musicDef.Filename.ToChar());
zSTRING name = zSTRING(musicDef.Name.ToChar());

Globals->BassMusic_ActiveThemeFilename = filename;
Globals->BassMusic_ActiveThemeID = name;

for (int i = 0; i < Globals->Event_OnChange_Functions.GetNumInList(); i++)
{
const int funcId = Globals->Event_OnChange_Functions[i];
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef->Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef->Name.ToChar());
Globals->BassMusic_EventThemeFilename = zSTRING(musicDef.Filename.ToChar());
Globals->BassMusic_EventThemeID = zSTRING(musicDef.Name.ToChar());
parser->CallFunc(funcId);
}
}
Expand Down
8 changes: 4 additions & 4 deletions plugin/src/NH/Bass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ namespace NH
BASS_ChannelSetSync(m_FrontChannel.Stream, BASS_SYNC_END, 0, SyncEnd, this);
Log::Debug("BassEngine", Union::StringUTF8("SyncEnd set: ") + musicDef.Filename);

m_EventManager.DispatchEvent(EventType::MUSIC_CHANGE, &m_FrontChannel.Music);
m_EventManager.DispatchEvent(EventType::MUSIC_CHANGE, m_FrontChannel.Music);
}

void Engine::Update(const unsigned long time)
Expand All @@ -162,7 +162,7 @@ namespace NH

if (m_FrontChannel.Stream > 0 && m_FrontChannel.Playing)
{
m_EventManager.DispatchEvent(EventType::MUSIC_ACTIVE, &m_FrontChannel.Music);
m_EventManager.DispatchEvent(EventType::MUSIC_ACTIVE,m_FrontChannel.Music);
}
}

Expand Down Expand Up @@ -268,7 +268,7 @@ namespace NH
const auto self = static_cast<Engine*>(_this);
if (self->m_FrontChannel.Stream == channel)
{
self->GetEM().DispatchEvent(EventType::MUSIC_TRANSITION, &self->m_FrontChannel.Music, self->m_FrontChannel.Music.EndTransition.Duration);
self->GetEM().DispatchEvent(EventType::MUSIC_TRANSITION, self->m_FrontChannel.Music, self->m_FrontChannel.Music.EndTransition.Duration);
}
}

Expand All @@ -281,7 +281,7 @@ namespace NH
{
self->m_FrontChannel.Playing = false;
}
self->GetEM().DispatchEvent(EventType::MUSIC_END, &self->m_FrontChannel.Music);
self->GetEM().DispatchEvent(EventType::MUSIC_END, self->m_FrontChannel.Music);
}
}

Expand Down
18 changes: 13 additions & 5 deletions plugin/src/NH/BassEventManager.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "BassEventManager.h"
#include <NH/Union.h>

namespace NH
{
Expand All @@ -21,17 +22,24 @@ namespace NH
}
}

EventManager::EventManager()
void EventManager::DispatchEvent(const EventType type, const MusicDef musicDef, const int data)
{
m_EventQueue.emplace_front(Event{type, musicDef, data});
}

void EventManager::DispatchEvent(const EventType type, const MusicDef* musicDef, const int data)
void EventManager::Update()
{
for (const auto s : m_Subscribers)
while (!m_EventQueue.empty())
{
if (s.Type == type)
NH::Log::Debug("EM", Union::StringUTF8("Processing events, left: ") + Union::StringUTF8(m_EventQueue.size()));
Event event = m_EventQueue.back();
m_EventQueue.pop_back();
for (const auto s : m_Subscribers)
{
s.Function(musicDef, data, s.UserData);
if (s.Type == event.type)
{
s.Function(event.music, event.data, s.UserData);
}
}
}
}
Expand Down
19 changes: 15 additions & 4 deletions plugin/src/NH/BassEventManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

#include <NH/BassTypes.h>
#include <Union/Array.h>
#include <deque>

namespace NH
{
namespace Bass
{
using EventSubscriberFunction = void(*)(const MusicDef*, int data, void*);
using EventSubscriberFunction = void(*)(const MusicDef, int data, void*);

enum class EventType
{
Expand All @@ -33,19 +34,29 @@ namespace NH

class EventManager
{
struct Event
{
EventType type;
MusicDef music;
int data;
};

friend Engine;

Union::Array<EventSubscriber> m_Subscribers{};
std::deque<Event> m_EventQueue;

public:
EventSubscriber* AddSubscriber(EventType type, EventSubscriberFunction function, void* userData = nullptr);

void RemoveSubscriber(const EventSubscriber* subscriber);

private:
EventManager();
void DispatchEvent(EventType type, const MusicDef musicDef, int data = 0);

void DispatchEvent(EventType type, const MusicDef* musicDef, int data = 0);
void Update();

private:
EventManager() {};
};
}
}
9 changes: 8 additions & 1 deletion plugin/src/Plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@
NH::Bass::BassOptions* NH::Bass::Options = new NH::Bass::BassOptions{};

EXTERN_C_START
__declspec(dllexport) void Game_DefineExternals() {
__declspec(dllexport) void Game_Loop()
{
auto* engine = NH::Bass::Engine::Initialize();
engine->GetEM().Update();
}

__declspec(dllexport) void Game_DefineExternals()
{
NH::Bass::Options->LoggerLevelUnion = "DEBUG";
NH::Bass::Options->LoggerLevelZSpy = "DEBUG";

Expand Down

0 comments on commit 1e87f13

Please sign in to comment.