Community Q&A

Where Wwise users help each other out!

Audiokinetic's Community Q&A is the forum where Wwise users ask and answer questions within the Wwise community. If you would like to get an answer from Audiokinetic's Technical support team, make sure you use the Support Tickets page.

Invalid State Group ID with Short IDs set to 0

+1 vote

Hello, I am having an issue in UE4 4.24 with Wwise integration 2019.2.4.7329.1721
I've rolled back my project and the problem persists so I know it isn't likely to be an issue with the version.
I have a state called TerrainType that switches between a Dirt and Asphalt state whenever the player moves over the respective material.
Whenever I run my project, I am met with a "Error: Invalid State Group ID" message any time I try to switch the states using the Set State node in Blueprints. 

I've deleted and regenerated all of my banks multiple times and they load in Unreal without issue as far as I can tell.
What's odd to me is that all of the state uassets that are created have a Group Short ID of 0. The longer Group ID looks fine, but even when I create new states besides my TerrainType, the Group Short ID is always 0. To me that doesn't seem like desired behavior.

Here's a look at the details of my states: https://imgur.com/a/3rtyqQV

The long IDs here match up with the IDs in my Init.txt so I feel like, for the most part, the Init bank is loaded correctly. I don't know how to check what the short IDs should be or if it even matters.
But something weird is going on here and I don't know if anybody has ever run into anything similar or might know why this is the only error I am getting.
Thank you in advance for any help and let me know if you need more info.

asked Jul 23 in General Discussion by Evan C. (120 points)

2 Answers

0 votes
Hi Evan, I have the same problem. How did you solve?
answered Aug 21 by Giuseppe P. (140 points)
Sadly, I never truly did solve this. I was able to get my sounds working by using a Wwise Switch instead of a State. For whatever reason, switches acted normal and didn't have any ID issues, but creating states always generated a uasset with a short ID of 0. Unfortunately my solution wasn't much of a real fix because in many cases you may want or need to use states instead of switches. I was "lucky" enough that the logic I was trying to implement worked just as well with switches as it should have with states.
+1 vote

We have run into the same issue. Looking at the code, it turns out that short IDs of zero are actually expected on AkAudioTypes (which is what these are). If they are zero, then the short ids are generated at load time from the name of the asset. The problem is that the name of the asset for states is a combination of the state group name and the state name, so the short id generated isn't the same as the one the API generates when you pass it the individual strings.

We modified the Wwise plugin to fix this. Perhaps it will be useful to you. it's in AkGroupValue.cpp

void UAkGroupValue::Load()
{
  // ShortIDs are supposed to be the hash of the name. It seems like sometimes Wwise fills these in, and sometimes they leave them zero.
  //   When they are zero, they are supposed to be filled in with the hash of the name at load time. However, States have a group id and a short id
  //   and the name contains both strings. So, we need to split them up and get the right short id for each part.
  //   I think this is an oversight by Wwise. The AkAudioType from which this derives sets the short id if it isn't set, but does so with the full name
  //   and not just the approproate part.
  if (auto AudioDevice = FAkAudioDevice::Get())
  {
    // GroupValues' asset names are a combination of group name AND switch name, so we need to parse that out of the name
    FString FullName = GetName();
    int32 Index;
    if (FullName.FindChar('-', Index))
    {
      auto GroupIdFromName = AudioDevice->GetIDFromString(FullName.Mid(0, Index));
      auto idFromName = AudioDevice->GetIDFromString(FullName.Mid(Index+1));
      if (GroupShortID == 0)
      {
        GroupShortID = idFromName;
      }
      else if (GroupShortID != 0 && GroupShortID != GroupIdFromName)
      {
        UE_LOG(LogAkAudio, Error, TEXT("%s -> %s - Current Group Short ID '%u' is different from ID from the name '%u'"), *GetName(), *FullName.Mid(0, Index), GroupShortID, GroupIdFromName);
      }

      if (ShortID == 0)
      {
        ShortID = idFromName;
      }
      else if (ShortID != 0 && ShortID != idFromName)
      {
        UE_LOG(LogAkAudio, Error, TEXT("%s -> %s - Current Short ID '%u' is different from ID from the name '%u'"), *GetName(), *FullName.Mid(Index+1), ShortID, idFromName);
      }
    }
  }

  Super::Load(); // Must be called after the above
  // THE REST OF THE EXISTING FUNCTION GOES HERE
}
 
answered Sep 17 by Shannon P. (180 points)
...