Esempio n. 1
0
	public void CreateVariation(DynamicSoundGroup group, AudioClip clip) {
		var resourceFileName = string.Empty;
		if (group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) {
			resourceFileName = DTGUIHelper.GetResourcePath(clip);
			if (string.IsNullOrEmpty(resourceFileName)) {
				resourceFileName = clip.name;
			}
		}
		
		var clipName = clip.name;
		
		if (group.transform.FindChild(clipName) != null) {
			DTGUIHelper.ShowAlert("You already have a Variation for this Group named '" + clipName + "'. \n\nPlease rename these Variations when finished to be unique, or you may not be able to play them by name if you have a need to.");
		}
		
		var newVar = (GameObject) GameObject.Instantiate(_group.variationTemplate, _group.transform.position, Quaternion.identity);
		UndoHelper.CreateObjectForUndo(newVar, "create Variation");
		
		newVar.transform.name = clipName;
		newVar.transform.parent = group.transform;
		var variation = newVar.GetComponent<DynamicGroupVariation>();
		
		if (group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) {
			variation.audLocation = MasterAudio.AudioLocation.ResourceFile;
			variation.resourceFileName = resourceFileName;
		} else {
			newVar.audio.clip = clip;
		}
	}
    private static void UpgradeMasterAudioPrefab()
    {
        var ma = MasterAudio.Instance;

        var added = 0;

        for (var i = 0; i < ma.transform.childCount; i++)
        {
            var grp = ma.transform.GetChild(i);
            for (var v = 0; v < grp.transform.childCount; v++)
            {
                var variation = grp.transform.GetChild(v);
                var updater   = variation.GetComponent <SoundGroupVariationUpdater>();
                if (updater != null)
                {
                    continue;
                }

                variation.gameObject.AddComponent <SoundGroupVariationUpdater>();
                added++;
            }
        }

        DTGUIHelper.ShowAlert(string.Format("{0} Variations fixed.", added));
    }
    private Transform CreateGroup(AudioClip aClip)
    {
        if (_creator.groupTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode.");
            return(null);
        }

        var groupName = UtilStrings.TrimSpace(aClip.name);

        var matchingGroup = _groups.Find(delegate(DynamicSoundGroup obj) {
            return(obj.transform.name == groupName);
        });

        if (matchingGroup != null)
        {
            DTGUIHelper.ShowAlert("You already have a Group named '" + groupName + "'. \n\nPlease rename this Group when finished to be unique.");
        }

        var spawnedGroup = (GameObject)GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity);

        spawnedGroup.name = groupName;

        UndoHelper.CreateObjectForUndo(spawnedGroup, "create Dynamic Group");
        spawnedGroup.transform.parent = _creator.transform;

        CreateVariation(spawnedGroup.transform, aClip);

        return(spawnedGroup.transform);
    }
Esempio n. 4
0
    private void RevertSelected()
    {
        if (SelectedClips.Count == 0)
        {
            DTGUIHelper.ShowAlert(NoClipsSelected);
            return;
        }

        foreach (var aClip in SelectedClips)
        {
            RevertChanges(aClip);
        }
    }
    private void CreateVariation(Transform aGroup, AudioClip aClip)
    {
        if (_creator.variationTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode.");
            return;
        }

        var resourceFileName = string.Empty;

        if (_creator.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile)
        {
            resourceFileName = DTGUIHelper.GetResourcePath(aClip);
            if (string.IsNullOrEmpty(resourceFileName))
            {
                resourceFileName = aClip.name;
            }
        }

        var clipName = UtilStrings.TrimSpace(aClip.name);

        var myGroup = aGroup.GetComponent <DynamicSoundGroup>();

        var matches = myGroup.groupVariations.FindAll(delegate(DynamicGroupVariation obj) {
            return(obj.name == clipName);
        });

        if (matches.Count > 0)
        {
            DTGUIHelper.ShowAlert("You already have a variation for this Group named '" + clipName + "'. \n\nPlease rename these variations when finished to be unique, or you may not be able to play them by name if you have a need to.");
        }

        var spawnedVar = (GameObject)GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity);

        spawnedVar.name = clipName;

        spawnedVar.transform.parent = aGroup;

        var dynamicVar = spawnedVar.GetComponent <DynamicGroupVariation>();

        if (_creator.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile)
        {
            dynamicVar.audLocation      = MasterAudio.AudioLocation.ResourceFile;
            dynamicVar.resourceFileName = resourceFileName;
        }
        else
        {
            dynamicVar.audio.clip = aClip;
        }
    }
    private void RenameEvent(CustomEvent cEvent)
    {
        var match = _creator.customEventsToCreate.FindAll(delegate(CustomEvent obj) {
            return(obj.EventName == cEvent.ProspectiveName);
        });

        if (match.Count > 0)
        {
            DTGUIHelper.ShowAlert("You already have a custom event named '" + cEvent.ProspectiveName + "' configured here. Please choose a different name.");
            return;
        }

        cEvent.EventName = cEvent.ProspectiveName;
    }
    private void RevertSelected()
    {
        if (SelectedClips.Count == 0)
        {
            DTGUIHelper.ShowAlert(NO_CLIPS_SELECTED);
            return;
        }

        for (var i = 0; i < SelectedClips.Count; i++)
        {
            var aClip = SelectedClips[i];
            RevertChanges(aClip);
        }
    }
    private void CreateCustomEvent(string newEventName)
    {
        var match = _creator.customEventsToCreate.FindAll(delegate(CustomEvent custEvent) {
            return(custEvent.EventName == newEventName);
        });

        if (match.Count > 0)
        {
            DTGUIHelper.ShowAlert("You already have a custom event named '" + newEventName + "' configured here. Please choose a different name.");
            return;
        }

        var newEvent = new CustomEvent(newEventName);

        _creator.customEventsToCreate.Add(newEvent);
    }
Esempio n. 9
0
    private void DeleteAudioSources()
    {
        Selection.objects = new Object[] { };

        var sources = GetNonMAAudioSources();

        var destroyed = 0;

        foreach (var aud in sources)
        {
            DestroyImmediate(aud.GetComponent <AudioSource>());
            destroyed++;
        }

        DTGUIHelper.ShowAlert(destroyed + " Audio Source(s) destroyed.");
        _audioSources = 0;
    }
Esempio n. 10
0
    private void ApplySelected()
    {
        if (SelectedClips.Count == 0)
        {
            DTGUIHelper.ShowAlert(NoClipsSelected);
            return;
        }

        foreach (var aClip in SelectedClips)
        {
            ApplyClipChanges(aClip, false);
            aClip.HasChanged = true;
        }

        _clipList.NeedsRefresh = true;

        WriteFile(_clipList);
    }
    private void ApplySelected()
    {
        if (SelectedClips.Count == 0)
        {
            DTGUIHelper.ShowAlert(NO_CLIPS_SELECTED);
            return;
        }

        for (var i = 0; i < SelectedClips.Count; i++)
        {
            var aClip = SelectedClips[i];
            ApplyClipChanges(aClip, false);
            aClip._hasChanged = true;
        }

        clipList.needsRefresh = true;

        WriteFile(clipList);
    }
Esempio n. 12
0
    private void DisplayClips()
    {
        EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        if (GUILayout.Button("All", EditorStyles.toolbarButton, GUILayout.Width(36)))
        {
            foreach (var t in FilteredClips)
            {
                t.IsSelected = true;
            }
        }

        if (GUILayout.Button("None", EditorStyles.toolbarButton, GUILayout.Width(36)))
        {
            foreach (var t in _clipList.AudioInfor)
            {
                t.IsSelected = false;
            }
        }

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        GUILayout.Space(6);
        var columnPrefix = ColumnPrefix(ClipSortColumn.Name);

        if (GUILayout.Button(new GUIContent(columnPrefix + "Clip Name", "Click to sort by Clip Name"), EditorStyles.toolbarButton, GUILayout.Width(156)))
        {
            ChangeSortColumn(ClipSortColumn.Name);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.Bitrate);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Compression (kbps)", "Click to sort by Compression Bitrate"), EditorStyles.toolbarButton, GUILayout.Width(214)))
        {
            ChangeSortColumn(ClipSortColumn.Bitrate);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.Is3D);
        if (GUILayout.Button(new GUIContent(columnPrefix + "3D", "Click to sort by 3D"), EditorStyles.toolbarButton, GUILayout.Width(36)))
        {
            ChangeSortColumn(ClipSortColumn.Is3D);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.ForceMono);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Force Mono", "Click to sort by Force Mono"), EditorStyles.toolbarButton, GUILayout.Width(80)))
        {
            ChangeSortColumn(ClipSortColumn.ForceMono);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.AudioFormat);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Audio Format", "Click to sort by Audio Format"), EditorStyles.toolbarButton, GUILayout.Width(144)))
        {
            ChangeSortColumn(ClipSortColumn.AudioFormat);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.LoadType);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Load Type", "Click to sort by Load Type"), EditorStyles.toolbarButton, GUILayout.Width(182)))
        {
            ChangeSortColumn(ClipSortColumn.LoadType);
        }

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();

        if (FilteredClips.Count == 0)
        {
            DTGUIHelper.ShowLargeBarAlert("You have filtered all clips out.");
            return;
        }

        _scrollPos = GUI.BeginScrollView(new Rect(0, 123, 896, 485), _scrollPos, new Rect(0, 124, 880, 24 * FilteredClips.Count + 4));

        foreach (var aClip in FilteredClips)
        {
            // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
            if (aClip.IsSelected)
            {
                GUI.backgroundColor = DTGUIHelper.BrightButtonColor;
            }
            else
            {
                GUI.backgroundColor = Color.white;
            }
            EditorGUILayout.BeginHorizontal(EditorStyles.miniButtonMid); // miniButtonMid, numberField, textField
            EditorGUILayout.BeginHorizontal();

            var wasSelected = aClip.IsSelected;
            aClip.IsSelected = GUILayout.Toggle(aClip.IsSelected, "");

            if (aClip.IsSelected)
            {
                if (!wasSelected)
                {
                    SelectClip(aClip);
                }
            }

            var bitrateChanged    = !aClip.OrigCompressionBitrate.Equals(aClip.CompressionBitrate);
            var is3DChanged       = !aClip.OrigIs3D.Equals(aClip.Is3D);
            var isMonoChanged     = !aClip.OrigForceMono.Equals(aClip.ForceMono);
            var isFormatChanged   = !aClip.OrigFormat.Equals(aClip.Format);
            var isLoadTypeChanged = !aClip.OrigLoadType.Equals(aClip.LoadType);

            var hasChanged = bitrateChanged || is3DChanged || isMonoChanged || isFormatChanged || isLoadTypeChanged;

            if (!hasChanged)
            {
                ShowDisabledColors();
            }
            else
            {
                GUI.contentColor = DTGUIHelper.BrightButtonColor;
            }
            if (GUILayout.Button(new GUIContent("Revert"), EditorStyles.toolbarButton, GUILayout.Width(45)))
            {
                if (!hasChanged)
                {
                    DTGUIHelper.ShowAlert("This clip's properties have not changed.");
                }
                else
                {
                    RevertChanges(aClip);
                }
            }

            RevertColor();

            GUILayout.Space(10);
            GUILayout.Label(new GUIContent(aClip.Name, aClip.FullPath), GUILayout.Width(150));

            GUILayout.Space(10);
            MaybeShowChangedColors(bitrateChanged);
            var oldBitrate = aClip.CompressionBitrate;
            var bitRate    = (int)(aClip.CompressionBitrate * .001f);
            aClip.CompressionBitrate = EditorGUILayout.IntSlider("", bitRate, 32, 256, GUILayout.Width(202)) * 1000;
            if (oldBitrate != aClip.CompressionBitrate)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
            }
            RevertColor();

            GUILayout.Space(12);
            MaybeShowChangedColors(is3DChanged);
            var old3D = aClip.Is3D;
            aClip.Is3D = GUILayout.Toggle(aClip.Is3D, "");
            if (old3D != aClip.Is3D)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
            }
            RevertColor();

            GUILayout.Space(36);
            MaybeShowChangedColors(isMonoChanged);
            var oldMono = aClip.ForceMono;
            aClip.ForceMono = GUILayout.Toggle(aClip.ForceMono, "", GUILayout.Width(40));
            if (oldMono != aClip.ForceMono)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
            }
            RevertColor();

            GUILayout.Space(10);
            MaybeShowChangedColors(isFormatChanged);
            var oldFmt = aClip.Format;

            aClip.Format = (AudioImporterFormat)EditorGUILayout.EnumPopup(aClip.Format, GUILayout.Width(136));

            if (oldFmt != aClip.Format)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
            }
            RevertColor();

            GUILayout.Space(6);
            MaybeShowChangedColors(isLoadTypeChanged);
            var oldLoad = aClip.LoadType;

            aClip.LoadType = (AudioImporterLoadType)EditorGUILayout.EnumPopup(aClip.LoadType, GUILayout.Width(140));

            if (oldLoad != aClip.LoadType)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
            }
            RevertColor();

            GUILayout.FlexibleSpace();
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndHorizontal();

            RevertColor();
        }

        GUI.EndScrollView();
    }
Esempio n. 13
0
    // ReSharper disable once UnusedMember.Local
    // ReSharper disable once InconsistentNaming
    void OnGUI()
    {
        _scrollPos = GUI.BeginScrollView(
            new Rect(0, 0, position.width, position.height),
            _scrollPos,
            new Rect(0, 0, 600, 210)
            );


        if (MasterAudioInspectorResources.LogoTexture != null)
        {
            DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture);
        }

        if (Application.isPlaying)
        {
            DTGUIHelper.ShowLargeBarAlert("This window can only be used in edit mode.");
        }
        else
        {
            DTGUIHelper.ShowColorWarning("This window will help you prepare a project that has existing audio for switching over to Master Audio.");
            DTGUIHelper.ShowColorWarning("All Audio Source components should be created by Master Audio only. Let's remove all your old ones.");
            DTGUIHelper.ShowLargeBarAlert("For each Scene, open the Scene, then go through the steps below to locate & delete items.");

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Step 1", EditorStyles.boldLabel);

            EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
            GUI.contentColor = DTGUIHelper.BrightButtonColor;
            if (GUILayout.Button(new GUIContent("Find Audio Sources In Scene"), EditorStyles.toolbarButton, GUILayout.Width(200)))
            {
                var audSources = GetNonMAAudioSources();
                _audioSources = audSources.Count;

                if (_audioSources > 0)
                {
                    Selection.objects = audSources.ToArray();
                }

                if (_audioSources == 0)
                {
                    DTGUIHelper.ShowAlert("You have zero AudioSources in your Scene. You are finished.");
                }
                else
                {
                    DTGUIHelper.ShowAlert(audSources.Count + " AudioSource(s) found and selected in the Hierarchy. Please take note of what game objects these are, so you can add sound to them later with Master Audio.");
                }
            }
            GUI.contentColor = Color.white;

            if (_audioSources < 0)
            {
                GUI.contentColor = DTGUIHelper.BrightButtonColor;
                GUILayout.Label("Click button to find Audio Sources.");
            }
            else if (_audioSources == 0)
            {
                GUI.contentColor = DTGUIHelper.BrightButtonColor;
                GUILayout.Label("No Audio Sources! You are finished.");
            }
            else
            {
                GUI.contentColor = Color.red;
                GUILayout.Label(_audioSources.ToString() + " Audio Source(s) selected. Take note of them and go to step 2.");
            }
            GUI.contentColor = Color.white;

            EditorGUILayout.EndHorizontal();


            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Step 2", EditorStyles.boldLabel);

            EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
            GUI.contentColor = DTGUIHelper.BrightButtonColor;
            if (GUILayout.Button(new GUIContent("Delete Audio Sources In Scene"), EditorStyles.toolbarButton, GUILayout.Width(200)))
            {
                var audSources = GetNonMAAudioSources();
                _audioSources = audSources.Count;

                if (_audioSources == 0)
                {
                    DTGUIHelper.ShowAlert("You have zero AudioSources in your Scene. You are finished.");
                    _audioSources = 0;
                }
                else
                {
                    DeleteAudioSources();
                }
            }
            EditorGUILayout.EndHorizontal();
        }

        GUI.EndScrollView();
    }
    private void UpgradeData()
    {
        if (_creator.groupTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled.");
            return;
        }

        if (_creator.variationTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled");
            return;
        }


        for (var g = 0; g < _creator.soundGroupsToCreate.Count; g++)
        {
            var grp       = _creator.soundGroupsToCreate[g];
            var groupName = grp.groupName;

            var match = _groups.FindAll(delegate(DynamicSoundGroup obj) {
                return(obj.name == groupName);
            });
            if (match.Count > 0)
            {
                Debug.LogWarning("Dynamic Sound Group '" + groupName + "' already exists. Please rename one of them.");
            }

            var newGrp = (GameObject)GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity);
            newGrp.transform.name   = groupName;
            newGrp.transform.parent = _creator.transform;

            var groupScript = newGrp.GetComponent <DynamicSoundGroup>();

            if (grp.duckSound)
            {
                var duckMatch = _creator.musicDuckingSounds.FindAll(delegate(DuckGroupInfo obj) {
                    return(obj.soundType == groupName);
                });

                if (duckMatch.Count > 0)
                {
                    Debug.LogWarning("Dynamic Duck Setting for Sound Group '" + groupName + "' already exists. Skipping adding Duck Group.");
                }
                else
                {
                    var newDuck = new DuckGroupInfo()
                    {
                        soundType    = groupName,
                        riseVolStart = grp.riseVolStart
                    };
                    _creator.musicDuckingSounds.Add(newDuck);
                }
            }

            switch (grp.busMode)
            {
            case DynamicSoundGroupInfo.BusMode.NoBus:
                break;

            case DynamicSoundGroupInfo.BusMode.UseExisting:
                var matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                    return(obj.busName == grp.busName);
                });

                if (matchBusIndex < 0)                           // bus doesn't exist in Dynamic SGC
                {
                    var newBus = new GroupBus()
                    {
                        busName    = grp.busName,
                        isExisting = true
                    };
                    _creator.groupBuses.Add(newBus);

                    matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                        return(obj.busName == grp.busName);
                    });
                }

                groupScript.busIndex = matchBusIndex + DynamicSoundGroupCreator.HardCodedBusOptions;
                groupScript.busName  = grp.busName;

                break;

            case DynamicSoundGroupInfo.BusMode.CreateNew:
                break;
            }

            groupScript.groupMasterVolume           = grp.groupMasterVolume;
            groupScript.retriggerPercentage         = grp.retriggerPercentage;
            groupScript.curVariationSequence        = grp.curVariationSequence;
            groupScript.useInactivePeriodPoolRefill = grp.useInactivePeriodPoolRefill;
            groupScript.inactivePeriodSeconds       = grp.inactivePeriodSeconds;
            groupScript.curVariationMode            = grp.curVariationMode;
            groupScript.limitMode          = grp.limitMode;
            groupScript.limitPerXFrames    = grp.limitPerXFrames;
            groupScript.minimumTimeBetween = grp.minimumTimeBetween;
            groupScript.limitPolyphony     = grp.limitPolyphony;
            groupScript.voiceLimitCount    = grp.voiceLimitCount;

            // make variations!
            for (var v = 0; v < grp.variations.Count; v++)
            {
                var aVar = grp.variations[v];

                var newVar  = (GameObject)GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity);
                var varName = string.Empty;

                switch (aVar.audLocation)
                {
                case MasterAudio.AudioLocation.Clip:
                    varName = string.IsNullOrEmpty(aVar.clipName) ? aVar.clip.name : aVar.clipName;
                    break;

                case MasterAudio.AudioLocation.ResourceFile:
                    varName = aVar.resourceFileName;
                    break;
                }

                newVar.transform.name   = varName;
                newVar.transform.parent = newGrp.transform;

                var varScript = newVar.GetComponent <DynamicGroupVariation>();

                varScript.audLocation = aVar.audLocation;

                switch (aVar.audLocation)
                {
                case MasterAudio.AudioLocation.Clip:
                    varScript.audio.clip = aVar.clip;
                    break;

                case MasterAudio.AudioLocation.ResourceFile:
                    varScript.resourceFileName = aVar.resourceFileName;
                    break;
                }

                varScript.weight       = aVar.weight;
                varScript.audio.volume = aVar.volume;
                varScript.audio.pitch  = aVar.pitch;
                varScript.audio.loop   = aVar.loopClip;
                varScript.randomPitch  = aVar.randomPitch;
                varScript.randomVolume = aVar.randomVolume;
                varScript.useFades     = aVar.useFades;
                varScript.fadeInTime   = aVar.fadeInTime;
                varScript.fadeOutTime  = aVar.fadeOutTime;

                varScript.audio.rolloffMode  = aVar.audRollOffMode;
                varScript.audio.minDistance  = aVar.audMinDistance;
                varScript.audio.maxDistance  = aVar.audMaxDistance;
                varScript.audio.dopplerLevel = aVar.audDopplerLevel;
                varScript.audio.spread       = aVar.audSpread;
                varScript.audio.panLevel     = aVar.audPanLevel;
            }
        }

        _creator.soundGroupsToCreate.Clear();
        DTGUIHelper.ShowAlert("Dynamic Sound Group Creator data upgraded successfully!");
    }
    private static void DeleteAllUnusedFilterFx()
    {
        var ma = MasterAudio.Instance;

        if (ma == null)
        {
            DTGUIHelper.ShowAlert("There is no MasterAudio prefab in this scene. Try pressing this button on a different Scene.");
            return;
        }

        var affectedVariations = new List <SoundGroupVariation>();
        var filtersToDelete    = new List <Object>();

        for (var g = 0; g < ma.transform.childCount; g++)
        {
            var sGroup = ma.transform.GetChild(g);
            for (var v = 0; v < sGroup.childCount; v++)
            {
                var variation = sGroup.GetChild(v);
                var grpVar    = variation.GetComponent <SoundGroupVariation>();
                if (grpVar == null)
                {
                    continue;
                }

                if (grpVar.LowPassFilter != null && !grpVar.LowPassFilter.enabled)
                {
                    if (!filtersToDelete.Contains(grpVar.LowPassFilter))
                    {
                        filtersToDelete.Add(grpVar.LowPassFilter);
                    }

                    if (!affectedVariations.Contains(grpVar))
                    {
                        affectedVariations.Add(grpVar);
                    }
                }

                if (grpVar.HighPassFilter != null && !grpVar.HighPassFilter.enabled)
                {
                    if (!filtersToDelete.Contains(grpVar.HighPassFilter))
                    {
                        filtersToDelete.Add(grpVar.HighPassFilter);
                    }

                    if (!affectedVariations.Contains(grpVar))
                    {
                        affectedVariations.Add(grpVar);
                    }
                }

                if (grpVar.ChorusFilter != null && !grpVar.ChorusFilter.enabled)
                {
                    if (!filtersToDelete.Contains(grpVar.ChorusFilter))
                    {
                        filtersToDelete.Add(grpVar.ChorusFilter);
                    }

                    if (!affectedVariations.Contains(grpVar))
                    {
                        affectedVariations.Add(grpVar);
                    }
                }

                if (grpVar.DistortionFilter != null && !grpVar.DistortionFilter.enabled)
                {
                    if (!filtersToDelete.Contains(grpVar.DistortionFilter))
                    {
                        filtersToDelete.Add(grpVar.DistortionFilter);
                    }

                    if (!affectedVariations.Contains(grpVar))
                    {
                        affectedVariations.Add(grpVar);
                    }
                }

                if (grpVar.EchoFilter != null && !grpVar.EchoFilter.enabled)
                {
                    if (!filtersToDelete.Contains(grpVar.EchoFilter))
                    {
                        filtersToDelete.Add(grpVar.EchoFilter);
                    }

                    if (!affectedVariations.Contains(grpVar))
                    {
                        affectedVariations.Add(grpVar);
                    }
                }

                if (grpVar.ReverbFilter == null || grpVar.ReverbFilter.enabled)
                {
                    continue;
                }

                if (!filtersToDelete.Contains(grpVar.ReverbFilter))
                {
                    filtersToDelete.Add(grpVar.ReverbFilter);
                }

                if (!affectedVariations.Contains(grpVar))
                {
                    affectedVariations.Add(grpVar);
                }
            }
        }

        AudioUndoHelper.RecordObjectsForUndo(affectedVariations.ToArray(), "delete all unused Filter FX Components");

        foreach (var t in filtersToDelete)
        {
            DestroyImmediate(t);
        }

        DTGUIHelper.ShowAlert(string.Format("{0} Filter FX Components deleted.", filtersToDelete.Count));
    }
    private void EqualizeVariationVolumes(List <DynamicGroupVariation> variations)
    {
        var clips = new Dictionary <DynamicGroupVariation, float>();

        if (variations.Count < 2)
        {
            DTGUIHelper.ShowAlert("You must have at least 2 Variations to use this function.");
            return;
        }

        float lowestVolume = 1f;

        for (var i = 0; i < variations.Count; i++)
        {
            var setting = variations[i];

            AudioClip ac = null;

            switch (setting.audLocation)
            {
            case MasterAudio.AudioLocation.Clip:
                if (setting.audio.clip == null)
                {
                    continue;
                }
                ac = setting.audio.clip;
                break;

            case MasterAudio.AudioLocation.ResourceFile:
                if (string.IsNullOrEmpty(setting.resourceFileName))
                {
                    continue;
                }

                ac = Resources.Load(setting.resourceFileName) as AudioClip;

                if (ac == null)
                {
                    continue;                             // bad resource path
                }
                break;
            }

            if (!ac.isReadyToPlay)
            {
                Debug.Log("Clip is not ready to play (streaming?). Skipping '" + setting.name + "'.");
                continue;
            }

            float average = 0f;
            var   buffer  = new float[ac.samples];

            Debug.Log("Measuring amplitude of '" + ac.name + "'.");

            ac.GetData(buffer, 0);

            for (int c = 0; c < ac.samples; c++)
            {
                average += Mathf.Pow(buffer[c], 2);
            }

            average = Mathf.Sqrt(1f / (float)ac.samples * average);

            if (average < lowestVolume)
            {
                lowestVolume = average;
            }

            if (average == 0f)
            {
                // don't factor in.
                continue;
            }
            clips.Add(setting, average);
        }

        if (clips.Count < 2)
        {
            DTGUIHelper.ShowAlert("You must have at least 2 Variations with non-compressed, non-streaming clips to use this function.");
            return;
        }

        foreach (var kv in clips)
        {
            if (kv.Value == 0)
            {
                // skip
                continue;
            }
            float adjustedVol = lowestVolume / kv.Value;
            //set your volume for each Variation in your Sound Group.
            kv.Key.audio.volume = adjustedVol;
        }
    }
    // ReSharper disable once UnusedMember.Local
    // ReSharper disable once InconsistentNaming
    void OnGUI()
    {
        _scrollPos = GUI.BeginScrollView(
            new Rect(0, 0, position.width, position.height),
            _scrollPos,
            new Rect(0, 0, 550, 540)
            );

        PlaylistController.Instances = null;
        var pcs = PlaylistController.Instances;
        // ReSharper disable once PossibleNullReferenceException
        var plControllerInScene = pcs.Count > 0;

        if (MasterAudioInspectorResources.LogoTexture != null)
        {
            DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture);
        }

        if (Application.isPlaying)
        {
            DTGUIHelper.ShowLargeBarAlert("This screen cannot be used during play.");
            GUI.EndScrollView();
            return;
        }

        var settings = MasterAudioInspectorResources.GearTexture;

        MasterAudio.Instance = null;
        var ma        = MasterAudio.Instance;
        var maInScene = ma != null;

        var organizer    = FindObjectOfType(typeof(SoundGroupOrganizer));
        var hasOrganizer = organizer != null;

        DTGUIHelper.ShowColorWarning("The Master Audio prefab holds sound FX group and mixer controls. Add this first (only one per scene).");
        EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);

        EditorGUILayout.LabelField("Master Audio prefab", GUILayout.Width(300));
        if (!maInScene)
        {
            GUI.contentColor = DTGUIHelper.BrightButtonColor;
            if (GUILayout.Button(new GUIContent("Create", "Create Master Audio prefab"), EditorStyles.toolbarButton, GUILayout.Width(100)))
            {
                var go = MasterAudio.CreateMasterAudio();
                AudioUndoHelper.CreateObjectForUndo(go, "Create Master Audio prefab");
            }
            GUI.contentColor = Color.white;
        }
        else
        {
            if (settings != null)
            {
                if (GUILayout.Button(new GUIContent(settings, "Master Audio Settings"), EditorStyles.toolbarButton))
                {
                    Selection.activeObject = ma.transform;
                }
            }
            EditorGUILayout.LabelField("Exists in scene", EditorStyles.boldLabel);
        }

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Separator();

        // Playlist Controller
        DTGUIHelper.ShowColorWarning("The Playlist Controller prefab controls sets of songs (or other audio) and ducking. No limit per scene.");
        EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
        EditorGUILayout.LabelField("Playlist Controller prefab", GUILayout.Width(300));

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        if (GUILayout.Button(new GUIContent("Create", "Place a Playlist Controller prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
        {
            var go = MasterAudio.CreatePlaylistController();
            AudioUndoHelper.CreateObjectForUndo(go, "Create Playlist Controller prefab");
        }
        GUI.contentColor = Color.white;

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();
        if (!plControllerInScene)
        {
            DTGUIHelper.ShowLargeBarAlert("There is no Playlist Controller in the scene. Music will not play.");
        }

        EditorGUILayout.Separator();
        // Dynamic Sound Group Creators
        DTGUIHelper.ShowColorWarning("The Dynamic Sound Group Creator prefab can per-Scene Sound Groups and other audio. No limit per scene.");
        EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
        EditorGUILayout.LabelField("Dynamic Sound Group Creator prefab", GUILayout.Width(300));

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        if (GUILayout.Button(new GUIContent("Create", "Place a Dynamic Sound Group prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
        {
            var go = MasterAudio.CreateDynamicSoundGroupCreator();
            AudioUndoHelper.CreateObjectForUndo(go, "Create Dynamic Sound Group Creator prefab");
        }

        GUI.contentColor = Color.white;

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();


        EditorGUILayout.Separator();
        // Sound Group Organizer
        DTGUIHelper.ShowColorWarning("The Sound Group Organizer prefab can import/export Groups to/from MA and Dynamic SGC prefabs.");
        EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
        EditorGUILayout.LabelField("Sound Group Organizer prefab", GUILayout.Width(300));

        if (hasOrganizer)
        {
            if (settings != null)
            {
                if (GUILayout.Button(new GUIContent(settings, "Sound Group Organizer Settings"), EditorStyles.toolbarButton))
                {
                    Selection.activeObject = organizer;
                }
            }
            EditorGUILayout.LabelField("Exists in scene", EditorStyles.boldLabel);
        }
        else
        {
            GUI.contentColor = DTGUIHelper.BrightButtonColor;
            if (GUILayout.Button(new GUIContent("Create", "Place a Sound Group Organizer prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
            {
                var go = MasterAudio.CreateSoundGroupOrganizer();
                AudioUndoHelper.CreateObjectForUndo(go, "Create Dynamic Sound Group Creator prefab");
            }
        }

        GUI.contentColor = Color.white;

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();


        EditorGUILayout.Separator();

        if (!Application.isPlaying)
        {
            EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
            GUILayout.Label("Global Settings");
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();

            var newVol = GUILayout.Toggle(MasterAudio.UseDbScaleForVolume, " Display dB For Volumes");
            // ReSharper disable once RedundantCheckBeforeAssignment
            if (newVol != MasterAudio.UseDbScaleForVolume)
            {
                MasterAudio.UseDbScaleForVolume = newVol;
            }

            GUILayout.Space(30);

            var newCents = GUILayout.Toggle(MasterAudio.UseCentsForPitch, " Display Semitones for Pitches");
            // ReSharper disable once RedundantCheckBeforeAssignment
            if (newCents != MasterAudio.UseCentsForPitch)
            {
                MasterAudio.UseCentsForPitch = newCents;
            }

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndHorizontal();

            var useLogo = GUILayout.Toggle(MasterAudio.HideLogoNav, " Hide Logo Nav. in Inspectors");
            // ReSharper disable once RedundantCheckBeforeAssignment
            if (useLogo != MasterAudio.HideLogoNav)
            {
                MasterAudio.HideLogoNav = useLogo;
            }

            if (!Application.isPlaying)
            {
                EditorGUILayout.BeginHorizontal();
                MasterAudio._editMAFolder = GUILayout.Toggle(MasterAudio._editMAFolder, " Edit Installation Path");

                if (MasterAudio._editMAFolder)
                {
                    var path = EditorGUILayout.TextField("", MasterAudio.ProspectiveMAPath);
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
                    if (!string.IsNullOrEmpty(path))
                    {
                        MasterAudio.ProspectiveMAPath = path;
                    }
                    else
                    {
                        MasterAudio.ProspectiveMAPath = MasterAudio.MasterAudioFolderPath;
                    }
                    GUI.contentColor = DTGUIHelper.BrightButtonColor;
                    if (GUILayout.Button(new GUIContent("Update", "This will update the installation folder path with the value to the left."), EditorStyles.toolbarButton, GUILayout.Width(60)))
                    {
                        MasterAudio.MasterAudioFolderPath = MasterAudio.ProspectiveMAPath;
                        DTGUIHelper.ShowAlert("Installation Path updated!");
                    }
                    GUILayout.Space(4);
                    if (GUILayout.Button(new GUIContent("Revert", "Revert to default settings"), EditorStyles.toolbarButton, GUILayout.Width(60)))
                    {
                        MasterAudio.MasterAudioFolderPath = MasterAudio.MasterAudioDefaultFolder;
                        MasterAudio.ProspectiveMAPath     = MasterAudio.MasterAudioDefaultFolder;
                        DTGUIHelper.ShowAlert("Installation Path reverted!");
                    }
                    GUI.contentColor = Color.white;
                    GUILayout.Space(10);
                }

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.Separator();

            EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
            GUILayout.Label("Utility Functions");
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(10);
            GUI.contentColor = DTGUIHelper.BrightButtonColor;
            if (GUILayout.Button(new GUIContent("Delete all unused Filter FX", "This will delete all unused Unity Audio Filter FX components in the entire MasterAudio prefab and all Sound Groups within."), EditorStyles.toolbarButton, GUILayout.Width(160)))
            {
                DeleteAllUnusedFilterFx();
            }

            GUILayout.Space(10);

            if (GUILayout.Button(new GUIContent("Reset Prefs / Settings", "This will delete all Master Audio's Persistent Settings and global preferences (back to installation default). None of your prefabs will be deleted."), EditorStyles.toolbarButton, GUILayout.Width(160)))
            {
                ResetPrefs();
            }

            if (maInScene)
            {
                GUILayout.Space(10);

                if (GUILayout.Button(new GUIContent("Upgrade MA Prefab to V3.5.5", "This will upgrade all Sound Groups in the entire MasterAudio prefab and all Sound Groups within to the latest changes, including a new script in V3.5.5."), EditorStyles.toolbarButton, GUILayout.Width(160)))
                {
                    UpgradeMasterAudioPrefab();
                }
            }

            GUI.contentColor = Color.white;
            EditorGUILayout.EndHorizontal();
        }

        GUI.EndScrollView();
    }
    // ReSharper disable once FunctionComplexityOverflow
    public override void OnInspectorGUI()
    {
        EditorGUI.indentLevel = 1;
        var isDirty = false;

        _variation = (DynamicGroupVariation)target;

        if (MasterAudioInspectorResources.LogoTexture != null)
        {
            DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture);
        }

        EditorGUI.indentLevel = 0;  // Space will handle this for the header
        var        previewLang = SystemLanguage.English;
        GameObject dgscGO      = null;

        if (_variation.transform.parent != null && _variation.transform.parent.parent != null)
        {
            var parentParent = _variation.transform.parent.parent;

            dgscGO = parentParent.gameObject;

            var dgsc = dgscGO.GetComponent <DynamicSoundGroupCreator>();
            if (dgsc != null)
            {
                previewLang = dgsc.previewLanguage;
            }
        }

        if (dgscGO == null)
        {
            DTGUIHelper.ShowRedError("This prefab must have a GameObject 2 parents up. Prefab broken.");
            return;
        }

        AudioSource previewer;

        EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        if (GUILayout.Button(new GUIContent("Back to Group", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(120)))
        {
            // ReSharper disable once PossibleNullReferenceException
            Selection.activeObject = _variation.transform.parent.gameObject;
        }
        GUILayout.FlexibleSpace();
        GUI.contentColor = Color.white;

        var buttonPressed = DTGUIHelper.AddDynamicVariationButtons();

        switch (buttonPressed)
        {
        case DTGUIHelper.DTFunctionButtons.Play:
            isDirty = true;

            previewer = MasterAudioInspector.GetPreviewer();

            var randPitch = SoundGroupVariationInspector.GetRandomPreviewPitch(_variation);
            var varVol    = SoundGroupVariationInspector.GetRandomPreviewVolume(_variation);

            if (_variation.audLocation != MasterAudio.AudioLocation.FileOnInternet)
            {
                if (previewer != null)
                {
                    MasterAudioInspector.StopPreviewer();
                    previewer.pitch = randPitch;
                }
            }

            var calcVolume = varVol * _variation.ParentGroup.groupMasterVolume;

            switch (_variation.audLocation)
            {
            case MasterAudio.AudioLocation.ResourceFile:
                var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(previewLang, _variation.useLocalization, _variation.resourceFileName);

                var clip = Resources.Load(fileName) as AudioClip;
                if (clip != null)
                {
                    if (previewer != null)
                    {
                        previewer.PlayOneShot(clip, calcVolume);
                    }
                }
                else
                {
                    DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName);
                }
                break;

            case MasterAudio.AudioLocation.Clip:
                if (previewer != null)
                {
                    previewer.PlayOneShot(_variation.VarAudio.clip, calcVolume);
                }
                break;

            case MasterAudio.AudioLocation.FileOnInternet:
                if (!string.IsNullOrEmpty(_variation.internetFileUrl))
                {
                    Application.OpenURL(_variation.internetFileUrl);
                }
                break;
            }

            break;

        case DTGUIHelper.DTFunctionButtons.Stop:
            if (_variation.audLocation != MasterAudio.AudioLocation.FileOnInternet)
            {
                MasterAudioInspector.StopPreviewer();
            }
            break;
        }

        EditorGUILayout.EndHorizontal();

        DTGUIHelper.HelpHeader("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm");

        if (!Application.isPlaying)
        {
            DTGUIHelper.ShowColorWarning(MasterAudio.PreviewText);
        }

        var oldLocation = _variation.audLocation;

        EditorGUILayout.BeginHorizontal();
        var newLocation = (MasterAudio.AudioLocation)EditorGUILayout.EnumPopup("Audio Origin", _variation.audLocation);

        DTGUIHelper.AddHelpIcon("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm#AudioOrigin");
        EditorGUILayout.EndHorizontal();

        if (newLocation != oldLocation)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Audio Origin");
            _variation.audLocation = newLocation;
        }

        switch (_variation.audLocation)
        {
        case MasterAudio.AudioLocation.Clip:
            var newClip = (AudioClip)EditorGUILayout.ObjectField("Audio Clip", _variation.VarAudio.clip, typeof(AudioClip), false);

            if (newClip != _variation.VarAudio.clip)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "assign Audio Clip");
                _variation.VarAudio.clip = newClip;
            }
            break;

        case MasterAudio.AudioLocation.FileOnInternet:
            if (oldLocation != _variation.audLocation)
            {
                if (_variation.VarAudio.clip != null)
                {
                    Debug.Log("Audio clip removed to prevent unnecessary memory usage on File On Internet Variation.");
                }
                _variation.VarAudio.clip = null;
            }

            if (!Application.isPlaying)
            {
                var newUrl = EditorGUILayout.TextField("Internet File URL", _variation.internetFileUrl);
                if (newUrl != _variation.internetFileUrl)
                {
                    AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Internet File URL");
                    _variation.internetFileUrl = newUrl;
                }
            }

            if (string.IsNullOrEmpty(_variation.internetFileUrl))
            {
                DTGUIHelper.ShowLargeBarAlert("You have not specified a URL for the File On Internet. This Variation will not be available to play without one.");
            }
            break;

        case MasterAudio.AudioLocation.ResourceFile:
            if (oldLocation != _variation.audLocation)
            {
                if (_variation.VarAudio.clip != null)
                {
                    Debug.Log("Audio clip removed to prevent unnecessary memory usage on Resource file Variation.");
                }
                _variation.VarAudio.clip = null;
            }

            EditorGUILayout.BeginVertical();
            var anEvent = Event.current;

            GUI.color = DTGUIHelper.DragAreaColor;
            var dragArea = GUILayoutUtility.GetRect(0f, 20f, GUILayout.ExpandWidth(true));
            GUI.Box(dragArea, "Drag Resource Audio clip here to use its name!");
            GUI.color = Color.white;

            string newFilename;

            switch (anEvent.type)
            {
            case EventType.DragUpdated:
            case EventType.DragPerform:
                if (!dragArea.Contains(anEvent.mousePosition))
                {
                    break;
                }

                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

                if (anEvent.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();

                    foreach (var dragged in DragAndDrop.objectReferences)
                    {
                        var aClip = dragged as AudioClip;
                        if (aClip == null)
                        {
                            continue;
                        }

                        AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Resource filename");

                        var useLocalization = false;
                        newFilename = DTGUIHelper.GetResourcePath(aClip, ref useLocalization);
                        if (string.IsNullOrEmpty(newFilename))
                        {
                            newFilename = aClip.name;
                        }

                        _variation.resourceFileName = newFilename;
                        _variation.useLocalization  = useLocalization;
                        break;
                    }
                }
                Event.current.Use();
                break;
            }
            EditorGUILayout.EndVertical();

            newFilename = EditorGUILayout.TextField("Resource Filename", _variation.resourceFileName);
            if (newFilename != _variation.resourceFileName)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Resource filename");
                _variation.resourceFileName = newFilename;
            }

            EditorGUI.indentLevel = 1;

            var newLocal = EditorGUILayout.Toggle("Use Localized Folder", _variation.useLocalization);
            if (newLocal != _variation.useLocalization)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Localized Folder");
                _variation.useLocalization = newLocal;
            }

            break;
        }

        EditorGUI.indentLevel = 0;

        var newProbability = EditorGUILayout.IntSlider("Probability to Play (%)", _variation.probabilityToPlay, 0, 100);

        if (newProbability != _variation.probabilityToPlay)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Probability to Play (%)");
            _variation.probabilityToPlay = newProbability;
        }

        if (_variation.probabilityToPlay < 100)
        {
            DTGUIHelper.ShowLargeBarAlert("Since Probability to Play is less than 100%, you will not always hear this Variation when it's selected to play.");
        }

        var newVolume = EditorGUILayout.Slider("Volume", _variation.VarAudio.volume, 0f, 1f);

        if (newVolume != _variation.VarAudio.volume)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "change Volume");
            _variation.VarAudio.volume = newVolume;
        }

        var newPitch = DTGUIHelper.DisplayPitchField(_variation.VarAudio.pitch);

        if (newPitch != _variation.VarAudio.pitch)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "change Pitch");
            _variation.VarAudio.pitch = newPitch;
        }

        if (_variation.ParentGroup.curVariationMode == MasterAudioGroup.VariationMode.LoopedChain)
        {
            DTGUIHelper.ShowLargeBarAlert(MasterAudio.LoopDisabledLoopedChain);
        }
        else if (_variation.useRandomStartTime && _variation.randomEndPercent != 100f)
        {
            DTGUIHelper.ShowLargeBarAlert(MasterAudio.LoopDisabledCustomEnd);
        }
        else
        {
            var newLoop = EditorGUILayout.Toggle("Loop Clip", _variation.VarAudio.loop);
            if (newLoop != _variation.VarAudio.loop)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "toggle Loop");
                _variation.VarAudio.loop = newLoop;
            }
        }

        EditorGUILayout.BeginHorizontal();
        var newWeight = EditorGUILayout.IntSlider("Voices (Weight)", _variation.weight, 0, 100);

        DTGUIHelper.AddHelpIcon("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm#Voices");
        EditorGUILayout.EndHorizontal();
        if (newWeight != _variation.weight)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Voices (Weight)");
            _variation.weight = newWeight;
        }


        DTGUIHelper.StartGroupHeader();

        var newUseRndPitch = EditorGUILayout.BeginToggleGroup(" Use Random Pitch", _variation.useRandomPitch);

        if (newUseRndPitch != _variation.useRandomPitch)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Pitch");
            _variation.useRandomPitch = newUseRndPitch;
        }
        DTGUIHelper.EndGroupHeader();

        if (_variation.useRandomPitch)
        {
            var newMode = (SoundGroupVariation.RandomPitchMode)EditorGUILayout.EnumPopup("Pitch Compute Mode", _variation.randomPitchMode);
            if (newMode != _variation.randomPitchMode)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Pitch Compute Mode");
                _variation.randomPitchMode = newMode;
            }

            var newPitchMin = DTGUIHelper.DisplayPitchField(_variation.randomPitchMin, "Random Pitch Min");
            if (newPitchMin != _variation.randomPitchMin)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Pitch Min");
                _variation.randomPitchMin = newPitchMin;
                if (_variation.randomPitchMax <= _variation.randomPitchMin)
                {
                    _variation.randomPitchMax = _variation.randomPitchMin;
                }
            }

            var newPitchMax = DTGUIHelper.DisplayPitchField(_variation.randomPitchMax, "Random Pitch Max");
            if (newPitchMax != _variation.randomPitchMax)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Pitch Max");
                _variation.randomPitchMax = newPitchMax;
                if (_variation.randomPitchMin > _variation.randomPitchMax)
                {
                    _variation.randomPitchMin = _variation.randomPitchMax;
                }
            }
        }

        EditorGUILayout.EndToggleGroup();
        DTGUIHelper.AddSpaceForNonU5(2);

        DTGUIHelper.StartGroupHeader();

        var newUseRndVol = EditorGUILayout.BeginToggleGroup(" Use Random Volume", _variation.useRandomVolume);

        if (newUseRndVol != _variation.useRandomVolume)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Volume");
            _variation.useRandomVolume = newUseRndVol;
        }
        DTGUIHelper.EndGroupHeader();

        if (_variation.useRandomVolume)
        {
            var newMode = (SoundGroupVariation.RandomVolumeMode)EditorGUILayout.EnumPopup("Volume Compute Mode", _variation.randomVolumeMode);
            if (newMode != _variation.randomVolumeMode)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Volume Compute Mode");
                _variation.randomVolumeMode = newMode;
            }

            var volMin = 0f;
            if (_variation.randomVolumeMode == SoundGroupVariation.RandomVolumeMode.AddToClipVolume)
            {
                volMin = -1f;
            }

            var newVolMin = DTGUIHelper.DisplayVolumeField(_variation.randomVolumeMin, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, volMin, true, "Random Volume Min");
            if (newVolMin != _variation.randomVolumeMin)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Volume Min");
                _variation.randomVolumeMin = newVolMin;
                if (_variation.randomVolumeMax <= _variation.randomVolumeMin)
                {
                    _variation.randomVolumeMax = _variation.randomVolumeMin;
                }
            }

            var newVolMax = DTGUIHelper.DisplayVolumeField(_variation.randomVolumeMax, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, volMin, true, "Random Volume Max");
            if (newVolMax != _variation.randomVolumeMax)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Volume Max");
                _variation.randomVolumeMax = newVolMax;
                if (_variation.randomVolumeMin > _variation.randomVolumeMax)
                {
                    _variation.randomVolumeMin = _variation.randomVolumeMax;
                }
            }
        }

        EditorGUILayout.EndToggleGroup();
        DTGUIHelper.AddSpaceForNonU5(2);

        DTGUIHelper.StartGroupHeader();

        var newSilence = EditorGUILayout.BeginToggleGroup(" Use Random Delay", _variation.useIntroSilence);

        if (newSilence != _variation.useIntroSilence)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Delay");
            _variation.useIntroSilence = newSilence;
        }
        DTGUIHelper.EndGroupHeader();

        if (_variation.useIntroSilence)
        {
            var newSilenceMin = EditorGUILayout.Slider("Delay Min (sec)", _variation.introSilenceMin, 0f, 100f);
            if (newSilenceMin != _variation.introSilenceMin)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Delay Min (sec)");
                _variation.introSilenceMin = newSilenceMin;
                if (_variation.introSilenceMin > _variation.introSilenceMax)
                {
                    _variation.introSilenceMax = newSilenceMin;
                }
            }

            var newSilenceMax = EditorGUILayout.Slider("Delay Max (sec)", _variation.introSilenceMax, 0f, 100f);
            if (newSilenceMax != _variation.introSilenceMax)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Delay Max (sec)");
                _variation.introSilenceMax = newSilenceMax;
                if (_variation.introSilenceMax < _variation.introSilenceMin)
                {
                    _variation.introSilenceMin = newSilenceMax;
                }
            }
        }
        EditorGUILayout.EndToggleGroup();
        DTGUIHelper.AddSpaceForNonU5(2);

        DTGUIHelper.StartGroupHeader();

        var newStart = EditorGUILayout.BeginToggleGroup(" Use Custom Start/End Position", _variation.useRandomStartTime);

        if (newStart != _variation.useRandomStartTime)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Custom Start/End Position");
            _variation.useRandomStartTime = newStart;
        }
        DTGUIHelper.EndGroupHeader();

        if (_variation.useRandomStartTime)
        {
            var newMin = EditorGUILayout.Slider("Start Min (%)", _variation.randomStartMinPercent, 0f, 100f);
            if (newMin != _variation.randomStartMinPercent)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Start Min (%)");
                _variation.randomStartMinPercent = newMin;
                if (_variation.randomStartMaxPercent <= _variation.randomStartMinPercent)
                {
                    _variation.randomStartMaxPercent = _variation.randomStartMinPercent;
                }
            }

            var newMax = EditorGUILayout.Slider("Start Max (%)", _variation.randomStartMaxPercent, 0f, 100f);
            if (newMax != _variation.randomStartMaxPercent)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Start Max (%)");
                _variation.randomStartMaxPercent = newMax;
                if (_variation.randomStartMinPercent > _variation.randomStartMaxPercent)
                {
                    _variation.randomStartMinPercent = _variation.randomStartMaxPercent;
                }
            }

            var newEnd = EditorGUILayout.Slider("End (%)", _variation.randomEndPercent, 0f, 100f);
            if (newEnd != _variation.randomEndPercent || _variation.randomEndPercent < _variation.randomStartMaxPercent)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change End (%)");
                _variation.randomEndPercent = newEnd;
                if (_variation.randomEndPercent < _variation.randomStartMaxPercent)
                {
                    _variation.randomEndPercent = _variation.randomStartMaxPercent;
                }
            }
        }

        EditorGUILayout.EndToggleGroup();
        DTGUIHelper.AddSpaceForNonU5(2);

        if (_variation.VarAudio.loop)
        {
            DTGUIHelper.StartGroupHeader();

            newStart = EditorGUILayout.BeginToggleGroup(" Use Finite Looping", _variation.useCustomLooping);
            if (newStart != _variation.useCustomLooping)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation,
                                                            "toggle Use Finite Looping");
                _variation.useCustomLooping = newStart;
            }
            DTGUIHelper.EndGroupHeader();

            if (_variation.useCustomLooping)
            {
                var newMin = EditorGUILayout.IntSlider("Min Loops", _variation.minCustomLoops, 1, 100);
                if (newMin != _variation.minCustomLoops)
                {
                    AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Min Loops");
                    _variation.minCustomLoops = newMin;
                    if (_variation.maxCustomLoops <= _variation.minCustomLoops)
                    {
                        _variation.maxCustomLoops = _variation.minCustomLoops;
                    }
                }

                var newMax = EditorGUILayout.IntSlider("Max Loops", _variation.maxCustomLoops, 1, 100);
                if (newMax != _variation.maxCustomLoops)
                {
                    AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Max Loops");
                    _variation.maxCustomLoops = newMax;
                    if (_variation.minCustomLoops > _variation.maxCustomLoops)
                    {
                        _variation.minCustomLoops = _variation.maxCustomLoops;
                    }
                }
            }

            EditorGUILayout.EndToggleGroup();
            DTGUIHelper.AddSpaceForNonU5(2);
        }

        DTGUIHelper.StartGroupHeader();

        var newUseFades = EditorGUILayout.BeginToggleGroup(" Use Custom Fading", _variation.useFades);

        if (newUseFades != _variation.useFades)
        {
            AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Custom Fading");
            _variation.useFades = newUseFades;
        }
        DTGUIHelper.EndGroupHeader();

        if (_variation.useFades)
        {
            var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", _variation.fadeInTime, 0f, 10f);
            if (newFadeIn != _variation.fadeInTime)
            {
                AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Fade In Time");
                _variation.fadeInTime = newFadeIn;
            }

            if (_variation.VarAudio.loop)
            {
                DTGUIHelper.ShowColorWarning("Looped clips cannot have a custom fade out.");
            }
            else
            {
                var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", _variation.fadeOutTime, 0f, 10f);
                if (newFadeOut != _variation.fadeOutTime)
                {
                    AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Fade Out Time");
                    _variation.fadeOutTime = newFadeOut;
                }
            }
        }

        EditorGUILayout.EndToggleGroup();

        if (GUI.changed || isDirty)
        {
            EditorUtility.SetDirty(target);
        }

        //DrawDefaultInspector();
    }
Esempio n. 19
0
    private void DisplayClips()
    {
        EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        if (GUILayout.Button("All", EditorStyles.toolbarButton, GUILayout.Width(32)))
        {
            foreach (var t in FilteredClips)
            {
                t.IsSelected = true;
            }
        }

        if (GUILayout.Button("None", EditorStyles.toolbarButton, GUILayout.Width(36)))
        {
            foreach (var t in _clipList.AudioInfor)
            {
                t.IsSelected = false;
            }
        }

        GUI.contentColor = DTGUIHelper.BrightButtonColor;
        var columnPrefix = ColumnPrefix(ClipSortColumn.Name);

        if (GUILayout.Button(new GUIContent(columnPrefix + "Clip Name", "Click to sort by Clip Name"), EditorStyles.toolbarButton, GUILayout.Width(160)))
        {
            ChangeSortColumn(ClipSortColumn.Name);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.ForceMono);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Force Mono", "Click to sort by Force Mono"), EditorStyles.toolbarButton, GUILayout.Width(86)))
        {
            ChangeSortColumn(ClipSortColumn.ForceMono);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.LoadInBackground);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Load In BG", "Click to sort by Load In BG"), EditorStyles.toolbarButton, GUILayout.Width(80)))
        {
            ChangeSortColumn(ClipSortColumn.LoadInBackground);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.PreloadAudio);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Preload Aud.", "Click to sort by Preload Audio Data"), EditorStyles.toolbarButton, GUILayout.Width(90)))
        {
            ChangeSortColumn(ClipSortColumn.PreloadAudio);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.LoadType);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Load Type", "Click to sort by Load Type"), EditorStyles.toolbarButton, GUILayout.Width(90)))
        {
            ChangeSortColumn(ClipSortColumn.LoadType);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.CompressionFormat);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Comp. Format", "Click to sort by Compression Format"), EditorStyles.toolbarButton, GUILayout.Width(96)))
        {
            ChangeSortColumn(ClipSortColumn.CompressionFormat);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.Quality);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Quality", "Click to sort by Quality"), EditorStyles.toolbarButton, GUILayout.Width(65)))
        {
            ChangeSortColumn(ClipSortColumn.Quality);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.SampleRateSetting);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Sample Rt. Setting", "Click to sort by Sample Rate Setting"), EditorStyles.toolbarButton, GUILayout.Width(122)))
        {
            ChangeSortColumn(ClipSortColumn.SampleRateSetting);
        }

        columnPrefix = ColumnPrefix(ClipSortColumn.SampleRate);
        if (GUILayout.Button(new GUIContent(columnPrefix + "Sample Rate", "Click to sort by Sample Rate"), EditorStyles.toolbarButton, GUILayout.Width(90)))
        {
            ChangeSortColumn(ClipSortColumn.SampleRate);
        }

        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();

        if (FilteredClips.Count == 0)
        {
            DTGUIHelper.ShowLargeBarAlert("You have filtered all clips out.");
            return;
        }

#if UNITY_2019_3_OR_NEWER
        _scrollPos = GUI.BeginScrollView(new Rect(0, 137, 947, 475), _scrollPos, new Rect(0, 138, 880, 24 * FilteredClips.Count - 2));
#else
        _scrollPos = GUI.BeginScrollView(new Rect(0, 123, 953, 485), _scrollPos, new Rect(0, 124, 880, 24 * FilteredClips.Count + 4));
#endif

        foreach (var aClip in FilteredClips)
        {
            // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
            if (aClip.IsSelected)
            {
                GUI.backgroundColor = DTGUIHelper.BrightButtonColor;
            }
            else
            {
                GUI.backgroundColor = Color.white;
            }

            GUIStyle style = new GUIStyle(EditorStyles.miniButtonMid)
            {
                fixedHeight = 22
            };
            EditorGUILayout.BeginHorizontal(style); // miniButtonMid, numberField, textField
            EditorGUILayout.BeginHorizontal();

            var wasSelected = aClip.IsSelected;
            aClip.IsSelected = GUILayout.Toggle(aClip.IsSelected, "");

            if (aClip.IsSelected)
            {
                if (!wasSelected)
                {
                    SelectClip(aClip);
                }
            }

            var usesSampleRateOverride = aClip.SampleRateSetting == AudioSampleRateSetting.OverrideSampleRate;
            var usesQuality            = aClip.CompressionFormat == AudioCompressionFormat.Vorbis;

            var isMonoChanged              = !aClip.OrigForceMono.Equals(aClip.ForceMono);
            var isLoadInBGChanged          = !aClip.OrigLoadBG.Equals(aClip.LoadBG);
            var isLoadTypeChanged          = !aClip.OrigLoadType.Equals(aClip.LoadType);
            var isPreloadAudioChanged      = !aClip.OrigPreload.Equals(aClip.Preload);
            var isCompFormatChanged        = !aClip.OrigCompressionFormat.Equals(aClip.CompressionFormat);
            var isSampleRateSettingChanged = !aClip.OrigSampleRateSetting.Equals(aClip.SampleRateSetting);
            var isQualityChanged           = usesQuality && !aClip.OrigQuality.Equals(aClip.Quality);
            var isSampleRateChanged        = usesSampleRateOverride && !aClip.OrigSampleRateOverride.Equals(aClip.SampleRateOverride);

            var hasChanged = isMonoChanged || isLoadInBGChanged || isPreloadAudioChanged || isLoadTypeChanged || isCompFormatChanged || isSampleRateSettingChanged || isQualityChanged || isSampleRateChanged;

            if (!hasChanged)
            {
                ShowDisabledColors();
            }
            else
            {
                GUI.contentColor = DTGUIHelper.BrightButtonColor;
            }
            if (GUILayout.Button(new GUIContent("Revert"), EditorStyles.toolbarButton, GUILayout.Width(45)))
            {
                if (!hasChanged)
                {
                    DTGUIHelper.ShowAlert("This clip's properties have not changed.");
                }
                else
                {
                    RevertChanges(aClip);
                }
            }

            RevertColor();

            GUILayout.Space(10);
            GUILayout.Label(new GUIContent(aClip.Name, aClip.FullPath), GUILayout.Width(150));

            GUILayout.Space(28);
            MaybeShowChangedColors(isMonoChanged);
            var newMono = GUILayout.Toggle(aClip.ForceMono, "", GUILayout.Width(40));
            if (newMono != aClip.ForceMono)
            {
                SelectClip(aClip);
                aClip.IsSelected = true;
                if (isBulkMode)
                {
                    CopyForceMonoToSelected(newMono);
                }
                else
                {
                    aClip.ForceMono = newMono;
                }
            }
            RevertColor();

            GUILayout.Space(42);
            MaybeShowChangedColors(isLoadInBGChanged);
            var newLoadBG = GUILayout.Toggle(aClip.LoadBG, "", GUILayout.Width(40));
            if (newLoadBG != aClip.LoadBG)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
                if (isBulkMode)
                {
                    CopyLoadInBGToSelected(newLoadBG);
                }
                else
                {
                    aClip.LoadBG = newLoadBG;
                }
            }
            RevertColor();

            GUILayout.Space(40);
            MaybeShowChangedColors(isPreloadAudioChanged);
            var newPreload = GUILayout.Toggle(aClip.Preload, "", GUILayout.Width(40));
            if (newPreload != aClip.Preload)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
                if (isBulkMode)
                {
                    CopyPreloadAudioToSelected(newPreload);
                }
                else
                {
                    aClip.Preload = newPreload;
                }
            }
            RevertColor();

            GUILayout.Space(12);
            MaybeShowChangedColors(isLoadTypeChanged);
            var newLoad = (AudioClipLoadType)EditorGUILayout.EnumPopup(aClip.LoadType, GUILayout.Width(84));
            if (newLoad != aClip.LoadType)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
                if (isBulkMode)
                {
                    CopyLoadTypeToSelected(newLoad);
                }
                else
                {
                    aClip.LoadType = newLoad;
                }
            }
            RevertColor();

            GUILayout.Space(8);
            MaybeShowChangedColors(isCompFormatChanged);
            var newComp = (AudioCompressionFormat)EditorGUILayout.EnumPopup(aClip.CompressionFormat, GUILayout.Width(82));
            if (newComp != aClip.CompressionFormat)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
                if (isBulkMode)
                {
                    CopyCompFormatToSelected(newComp);
                }
                else
                {
                    aClip.CompressionFormat = newComp;
                }
            }
            RevertColor();

            GUILayout.Space(8);
            if (usesQuality)
            {
                MaybeShowChangedColors(isQualityChanged);
                var newQuality = EditorGUILayout.FloatField(aClip.Quality, GUILayout.Width(57));
                newQuality = Math.Max(0f, newQuality);
                newQuality = Math.Min(1f, newQuality);

                if (newQuality != aClip.Quality)
                {
                    aClip.IsSelected = true;
                    SelectClip(aClip);
                    if (isBulkMode)
                    {
                        CopyQualityToSelected(newQuality);
                    }
                    else
                    {
                        aClip.Quality = newQuality;
                    }
                }
                RevertColor();
            }
            else
            {
                GUILayout.Space(61);
            }

            GUILayout.Space(4);
            MaybeShowChangedColors(isSampleRateSettingChanged);
            var newSample = (AudioSampleRateSetting)EditorGUILayout.EnumPopup(aClip.SampleRateSetting, GUILayout.Width(112));
            if (newSample != aClip.SampleRateSetting)
            {
                aClip.IsSelected = true;
                SelectClip(aClip);
                if (isBulkMode)
                {
                    CopySampleRateSettingToSelected(newSample);
                }
                else
                {
                    aClip.SampleRateSetting = newSample;
                }
            }
            RevertColor();

            GUILayout.Space(4);
            if (usesSampleRateOverride)
            {
                MaybeShowChangedColors(isSampleRateChanged);
                var selectedIndex = _sampleRates.IndexOf(aClip.SampleRateOverride);
                if (selectedIndex < 0)
                {
                    selectedIndex = 0;
                }
                var selectedValue = _sampleRates[selectedIndex];
                var newSampleRate = EditorGUILayout.IntPopup(selectedValue, _sampleRateDisplays, _sampleRates.ToArray(), GUILayout.Width(82));
                if (newSampleRate != aClip.SampleRateOverride)
                {
                    aClip.IsSelected = true;
                    SelectClip(aClip);
                    if (isBulkMode)
                    {
                        CopySampleRateToSelected(newSampleRate);
                    }
                    else
                    {
                        aClip.SampleRateOverride = newSampleRate;
                    }
                }
                RevertColor();
            }
            else
            {
                GUILayout.Space(78);
            }

            GUILayout.FlexibleSpace();
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndHorizontal();

            RevertColor();
        }

        GUI.EndScrollView();
    }