I got some help in a Facebook group on how to use GetPlayingIDsFromGameObject and here is what I came up with to test if an event is playing on a certain GameObject. It's tricky because GetPlayingIDsFromGameObject needs an array of exactly the right size in order to work (for whatever reason), hence why we call that function twice. Creating a new array every time you call the function is a bit concerning. Anywho, hope this is useful to someone.
static uint playingIds = new uint;
public static bool IsEventPlayingOnGameObject(string eventName, GameObject go)
uint testEventId = AkSoundEngine.GetIDFromString(eventName);
uint count = playingIds.length;
AKRESULT result = AkSoundEngine.GetPlayingIDsFromGameObject(go, ref count, playingIds);
for (int i = 0; i < count; i++)
uint playingId = playingIds[i];
uint eventId = AkSoundEngine.GetEventIDFromPlayingID(playingId);
if (eventId == testEventId)
EDIT: I updated the code snippet.
After playing around some more and re-reading the documentation, I discovered that it is not necessary to have an array of precisely the correct length. The important thing is that count is both an input and an output from the function. count should not be 0 but rather be the length of the array playingIds. after the function returns, count will be the number of ids plopped into playingIds. No need to call the function twice or make a new array each time the function is called.
So the mistake was setting count=0 which told the function that our array had a length of 0 and therefore it couldn't plop any ids into it.
I think my confusion stemmed from the difference in conventions between C++ and C#. In C++ the array is a pointer and doesn't pass any information about its length. In C# you can always get the length of an array, which is why this seems like a weird way to do things.
EDIT 23 May 2020: added instantiation of result and playingIds to the code snippet.