Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
1
Question by MrFuzzzy · May 28, 2020 at 10:46 AM · c#audioaudiosourcemixingmix

How do I get the parent from a AudioMixerGroup Object

The title says it all.

I have a SoundSource that plays into an AudioMixerGroup. I can get the MixerGroups' mixer with AudioMixerGroup.audioMixer but I would like to walk the complete tree of all MixerGroups up↑ to the Master.

something like this: GroupA1 → GroupA → Master

Getting groups with AudioMixer.FindMatchingGroups(output.name) doesn't help because I have to know what they are called for that.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
3
Best Answer

Answer by Agustin0987 · Jul 23, 2020 at 09:22 AM

Blockquote

Hi @MrFuzzzy i know is a little bit late, but in case you have not found a solution for this (or if some else needs a solution for this same issue) I am posting my solution. So here is what I did to get the "hierarchy" of MixerSoundGroups:

 private class GD //FYI, GD stands for GroupData
 {
     public GD Parent;
     public AudioMixerGroup Group;
     public List<GD> Children;
     public int Depth;
 
     public GD(AudioMixerGroup group, GD parent, int depth)
     {
          Group = group;
          Children = new List<GD>();
          Parent = parent;
          Depth = depth;
      }
 }
 
 private GD GetGroupsData(AudioMixer mixer)
 {
     AudioMixerGroup[] groups = mixer.FindMatchingGroups("Master");
     GD masterData = new GD(groups[0], null, 0);
     SetChildren(masterData, mixer);
     return masterData;
 }
 
 private void SetChildren(GD parent, AudioMixer mixer)
 {
     if (parent== null)
         return;
 
     AudioMixerGroup[] children = mixer.FindMatchingGroups(parent.Group.name).Skip(1).ToArray();
 
     if (children.Length != 0)
     {
         int i = 0;
         while (i < children.Length)
         {
             GD child = new GD(children[i], parent, parent.Depth + 1);
             parent.Children.Add(child);
             SetChildren(child, mixer);
             int subChildrenCount = mixer.FindMatchingGroups(child.Group.name).Skip(1).ToArray().Length
             i += subChildrenCount > 0 ? subChildrenCount + 1 : 1;
          }
     }
 }
 
 //Somwhere in your code call 'GetGroupsData' like this:
 GD masterData = GetGroupsData(youAudioMixerInstance);
Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image MrFuzzzy · Jul 26, 2020 at 02:08 PM 0
Share

Very nice, thanks @Agustin0987. I put it in a little class to log everything. $$anonymous$$aybe someone else needs this:

 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine.Audio;
 using UnityEngine;
 
 
 public class $$anonymous$$ixerGroupData
 {
     public $$anonymous$$ixerGroupData Parent;
     public Audio$$anonymous$$ixerGroup Group;
     public List<$$anonymous$$ixerGroupData> Children;
     public int Depth;
 
     public $$anonymous$$ixerGroupData(Audio$$anonymous$$ixerGroup group, $$anonymous$$ixerGroupData parent, int depth)
     {
         Group = group;
         Children = new List<$$anonymous$$ixerGroupData>();
         Parent = parent;
         Depth = depth;
     }
 
     public static $$anonymous$$ixerGroupData GetGroupsData(Audio$$anonymous$$ixer mixer)
     {
         Audio$$anonymous$$ixerGroup[] groups = mixer.Find$$anonymous$$atchingGroups("$$anonymous$$aster");
         $$anonymous$$ixerGroupData masterData = new $$anonymous$$ixerGroupData(groups[0], null, 0);
         SetChildren(masterData, mixer);
         return masterData;
     }
 
     private static void SetChildren($$anonymous$$ixerGroupData parent, Audio$$anonymous$$ixer mixer)
     {
         if (parent == null)
             return;
 
         Audio$$anonymous$$ixerGroup[] children = mixer.Find$$anonymous$$atchingGroups(parent.Group.name).Skip(1).ToArray();
 
         if (children.Length != 0)
         {
             int i = 0;
             while (i < children.Length)
             {
                 $$anonymous$$ixerGroupData child = new $$anonymous$$ixerGroupData(children[i], parent, parent.Depth + 1);
                 parent.Children.Add(child);
                 SetChildren(child, mixer);
                 int subChildrenCount = mixer.Find$$anonymous$$atchingGroups(child.Group.name).Skip(1).ToArray().Length;
                 i += subChildrenCount > 0 ? subChildrenCount + 1 : 1;
             }
         }
     }
 
     public void LogAll()
     {
         logAll(this);
     }
 
     private static void logAll($$anonymous$$ixerGroupData group, int depth = 0)
     {
         string whiteSpace = new string(' ', depth * 3);
         Debug.Log($"{whiteSpace}{group.Group.name}");
         foreach ($$anonymous$$ixerGroupData child in group.Children)
         {
             logAll(child, depth + 1);
         }
     }
 }
 
avatar image
0

Answer by sindrijo_ · Sep 14, 2021 at 11:45 AM

I wrote another one that handles hierarchies with duplicated names and sub-branches.

 using System;
 using System.Collections.Generic;
 using UnityEngine.Audio;
 
 public static class AudioMixerGroupExtensions
 {
     /// <summary>
     /// This method resolves the 'Hierarchy' of the AudioMixer's AudioMixerGroups.
     /// It resolves the correct hierarchy even if AudioMixerGroup names or even
     /// whole branches are duplicated. It can do this because AudioMixer.FindMatchingGroups returns
     /// it's results in a depth-first order.
     /// </summary>
     /// <param name="mixer">The <see cref="AudioMixer"/> to resolve the hierarchy for.</param>
     /// <returns>A AudioMixerGroupHierarchy</returns>
     public static IAudioMixerGroupHierarchy GetMixerGroupHierarchy(this AudioMixer mixer)
     {
         return AudioMixerGroupHierarchy.ResolveHierarchy(mixer);
     }
     
     private class AudioMixerGroupHierarchy : IAudioMixerGroupHierarchy
     {
         private readonly AudioMixerGroupHierarchy parent;
         private readonly AudioMixerGroup mixerGroup;
         private readonly List<AudioMixerGroupHierarchy> children;
         private readonly string path;
         private readonly int depth;
 
         private AudioMixerGroupHierarchy(AudioMixerGroup mixerGroup, AudioMixerGroupHierarchy parent, int depth)
         {
             this.mixerGroup = mixerGroup;
             this.parent = parent;
             this.depth = depth;
             path = $"{parent?.path}/{mixerGroup.name}";
             children = new List<AudioMixerGroupHierarchy>();
         }
 
         internal static IAudioMixerGroupHierarchy ResolveHierarchy(AudioMixer mixer)
         {
             // We are relying on the fact that FindMatchingGroups returns
             // the mixers in a depth-first order, meaning as we iterate
             // the list we will never see an element whose parent we have
             // not seen before
             var depthFirstOrderedMixerGroups = mixer.FindMatchingGroups("");
             var root = new AudioMixerGroupHierarchy(depthFirstOrderedMixerGroups[0], null, 0);
             
             var ancestorStack = new Stack<AudioMixerGroupHierarchy>();
             ancestorStack.Push(root);
         
             // Iterate over all mixerGroups, resolving the hierarchy by 
             // testing results of mixer.FindMatchingGroups(searchPath)
             // against the mixerGroup we are iterating on.
             // Skip the first element which is the root. 
             for (var i = 1; i < depthFirstOrderedMixerGroups.Length; i++)
             {
                 var subMixer = depthFirstOrderedMixerGroups[i];
 
                 RETEST_ELEMENT:
                 var parent = ancestorStack.Peek();
                 var searchPath = $"{parent.path}/{subMixer.name}";
                 var searchPathResults = mixer.FindMatchingGroups(searchPath);
 
                 var index = Array.IndexOf(searchPathResults, subMixer);
                 if (index < 0)
                 {
                     // If the entry was not found in this searchPath, then search in the previous parent
                     ancestorStack.Pop();
                     // Debug.LogWarning($"Entry not at {searchPath}, back-track to previous parent {ancestorStack.Peek().Path} and re-iterate");
                     goto RETEST_ELEMENT; // <-- WARNING GOTO 
                 }
 
                 var isProbableNode = searchPathResults.Length != 1;
                 // A LEAF may be falsely detected as a NODE:
                 // If the path of this node is a partial path of another deeper path
                 // there is no way to verify it is a LEAF before the whole tree has been resolved
                 // The only side-effect is an extra iteration, where we test the leaf-node
                 // for children before back-tracking.
 
                 var node = new AudioMixerGroupHierarchy(subMixer, parent, ancestorStack.Count);
                 parent.children.Add(node);
                 if (isProbableNode)
                 {
                     ancestorStack.Push(node);
                 }
             }
 
             return root;
         }
 
         IAudioMixerGroupHierarchy IAudioMixerGroupHierarchy.Parent => parent;
 
         AudioMixerGroup IAudioMixerGroupHierarchy.Group => mixerGroup;
 
         IReadOnlyList<IAudioMixerGroupHierarchy> IAudioMixerGroupHierarchy.Children => children;
 
         int IAudioMixerGroupHierarchy.Depth => depth;
         
         string IAudioMixerGroupHierarchy.Path => path;
     }
 }
 
 public interface IAudioMixerGroupHierarchy
 {
     public IAudioMixerGroupHierarchy Parent { get; }
     
     public AudioMixerGroup Group { get; }
     
     public IReadOnlyList<IAudioMixerGroupHierarchy> Children { get; }
     
     public int Depth { get; }
     
     public string Path { get; }
 }
 
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

814 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

C# Setting AudioMixerGroup through code 2 Answers

audio script 1 Answer

Play multiple sounds from one object 1 Answer

Playing Through a Queue/List of Audio Sources, One at a Time 1 Answer

Trying to use audio causes errors when trying to use in an 'if' statement 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges