private void ResetSettingsFromBackend()
        {
            if (GetAllAudioImporterTargets().Any())
            {
                AudioImporter firstImporter = GetAllAudioImporterTargets().First();
                //Just load the settings from the first importer for the default settings
                m_DefaultSampleSettings.settings = firstImporter.defaultSampleSettings;
                m_DefaultSampleSettings.ClearChangedFlags();

                m_SampleSettingOverrides = new Dictionary <BuildTargetGroup, SampleSettingProperties>();
                List <BuildPlatform> validPlatforms = BuildPlatforms.instance.GetValidPlatforms();
                foreach (BuildPlatform platform in validPlatforms)
                {
                    BuildTargetGroup platformGroup = platform.targetGroup;
                    foreach (AudioImporter importer in GetAllAudioImporterTargets())
                    {
                        if (importer.Internal_ContainsSampleSettingsOverride(platformGroup))
                        {
                            SampleSettingProperties newProperties = new SampleSettingProperties();
                            newProperties.settings = importer.Internal_GetOverrideSampleSettings(platformGroup);

                            m_SampleSettingOverrides[platformGroup] = newProperties;

                            //Just grab the first settings we find from any of the importers.
                            //This will be sorted later by checking if there are any differences between importers.
                            break;
                        }
                    }

                    //If we failed to find a valid override setting, just create a default one for use later.
                    if (!m_SampleSettingOverrides.ContainsKey(platformGroup))
                    {
                        SampleSettingProperties newProperties = new SampleSettingProperties();
                        newProperties.settings = firstImporter.Internal_GetOverrideSampleSettings(platformGroup);

                        m_SampleSettingOverrides[platformGroup] = newProperties;
                    }
                }
            }
        }
        private bool SyncSettingsToBackend()
        {
            BuildPlatform[] validPlatforms = BuildPlatforms.instance.GetValidPlatforms().ToArray();

            foreach (AudioImporter importer in GetAllAudioImporterTargets())
            {
                {
                    AudioImporterSampleSettings importerDefaults = importer.defaultSampleSettings;

                    //Importer default settings
                    if (m_DefaultSampleSettings.loadTypeChanged)
                    {
                        importerDefaults.loadType = m_DefaultSampleSettings.settings.loadType;
                    }

                    if (m_DefaultSampleSettings.sampleRateSettingChanged)
                    {
                        importerDefaults.sampleRateSetting = m_DefaultSampleSettings.settings.sampleRateSetting;
                    }

                    if (m_DefaultSampleSettings.sampleRateOverrideChanged)
                    {
                        importerDefaults.sampleRateOverride = m_DefaultSampleSettings.settings.sampleRateOverride;
                    }

                    if (m_DefaultSampleSettings.compressionFormatChanged)
                    {
                        importerDefaults.compressionFormat = m_DefaultSampleSettings.settings.compressionFormat;
                    }

                    if (m_DefaultSampleSettings.qualityChanged)
                    {
                        importerDefaults.quality = m_DefaultSampleSettings.settings.quality;
                    }

                    if (m_DefaultSampleSettings.conversionModeChanged)
                    {
                        importerDefaults.conversionMode = m_DefaultSampleSettings.settings.conversionMode;
                    }

                    //Set the default settings on the importer after the changes.
                    importer.defaultSampleSettings = importerDefaults;
                }

                //Get all the valid platforms, and write changes only for those ones
                foreach (BuildPlatform platform in validPlatforms)
                {
                    BuildTargetGroup platformGroup = platform.targetGroup;

                    if (m_SampleSettingOverrides.ContainsKey(platformGroup))
                    {
                        SampleSettingProperties overrideProperties = m_SampleSettingOverrides[platformGroup];

                        if (overrideProperties.overrideIsForced && !overrideProperties.forcedOverrideState)
                        {
                            importer.Internal_ClearSampleSettingOverride(platformGroup);
                        }
                        else if (importer.Internal_ContainsSampleSettingsOverride(platformGroup) ||
                                 (overrideProperties.overrideIsForced && overrideProperties.forcedOverrideState))
                        {
                            AudioImporterSampleSettings overrideSettings = importer.Internal_GetOverrideSampleSettings(platformGroup);

                            if (overrideProperties.loadTypeChanged)
                            {
                                overrideSettings.loadType = overrideProperties.settings.loadType;
                            }

                            if (overrideProperties.sampleRateSettingChanged)
                            {
                                overrideSettings.sampleRateSetting = overrideProperties.settings.sampleRateSetting;
                            }

                            if (overrideProperties.sampleRateOverrideChanged)
                            {
                                overrideSettings.sampleRateOverride = overrideProperties.settings.sampleRateOverride;
                            }

                            if (overrideProperties.compressionFormatChanged)
                            {
                                overrideSettings.compressionFormat = overrideProperties.settings.compressionFormat;
                            }

                            if (overrideProperties.qualityChanged)
                            {
                                overrideSettings.quality = overrideProperties.settings.quality;
                            }

                            if (overrideProperties.conversionModeChanged)
                            {
                                overrideSettings.conversionMode = overrideProperties.settings.conversionMode;
                            }

                            //Set the default settings on the importer after the changes.
                            importer.Internal_SetOverrideSampleSettings(platformGroup, overrideSettings);
                        }

                        m_SampleSettingOverrides[platformGroup] = overrideProperties;
                    }
                }
            }

            //Now that we are in sync with the backend, we need to clear the changed flags within
            //the properties
            m_DefaultSampleSettings.ClearChangedFlags();

            foreach (BuildPlatform platform in validPlatforms)
            {
                BuildTargetGroup platformGroup = platform.targetGroup;
                if (m_SampleSettingOverrides.ContainsKey(platformGroup))
                {
                    SampleSettingProperties overrideProperties = m_SampleSettingOverrides[platformGroup];
                    overrideProperties.ClearChangedFlags();
                    m_SampleSettingOverrides[platformGroup] = overrideProperties;
                }
            }

            return(true);
        }
        private void OnAudioImporterGUI(bool selectionContainsTrackerFile)
        {
            if (!selectionContainsTrackerFile)
            {
                EditorGUILayout.PropertyField(m_ForceToMono);
                EditorGUI.indentLevel++;
                using (new EditorGUI.DisabledScope(!m_ForceToMono.boolValue))
                {
                    EditorGUILayout.PropertyField(m_Normalize);
                }
                EditorGUI.indentLevel--;
                EditorGUILayout.PropertyField(m_LoadInBackground);
                EditorGUILayout.PropertyField(m_Ambisonic);
            }

            BuildPlatform[] validPlatforms = BuildPlatforms.instance.GetValidPlatforms().ToArray();
            GUILayout.Space(10);
            int shownSettingsPage = EditorGUILayout.BeginPlatformGrouping(validPlatforms, GUIContent.Temp("Default"));

            if (shownSettingsPage == -1)
            {
                // If the loadtype is streaming on the selected platform, gray out the "Preload Audio Data" option and show the checkbox as unchecked.
                bool disablePreloadAudioDataOption = (m_DefaultSampleSettings.settings.loadType == AudioClipLoadType.Streaming);

                MultiValueStatus multiStatus = GetMultiValueStatus(BuildTargetGroup.Unknown);
                OnSampleSettingGUI(BuildTargetGroup.Unknown, multiStatus, selectionContainsTrackerFile, ref m_DefaultSampleSettings, disablePreloadAudioDataOption);
            }
            else
            {
                BuildTargetGroup        platform   = validPlatforms[shownSettingsPage].targetGroup;
                SampleSettingProperties properties = m_SampleSettingOverrides[platform];
                OverrideStatus          status     = GetOverrideStatus(platform);

                // Define the UI state of the override here.
                EditorGUI.BeginChangeCheck();
                EditorGUI.showMixedValue = (status == OverrideStatus.MixedOverrides) && !properties.overrideIsForced;
                bool overrideState = (properties.overrideIsForced && properties.forcedOverrideState) ||
                                     (!properties.overrideIsForced && status != OverrideStatus.NoOverrides);
                overrideState            = EditorGUILayout.ToggleLeft("Override for " + validPlatforms[shownSettingsPage].title.text, overrideState);
                EditorGUI.showMixedValue = false;
                if (EditorGUI.EndChangeCheck())
                {
                    properties.forcedOverrideState = overrideState;
                    properties.overrideIsForced    = true;
                }

                // If the loadtype is streaming on the selected platform, gray out the "Preload Audio Data" option and show the checkbox as unchecked.
                bool disablePreloadAudioDataOption = ((properties.overrideIsForced && properties.forcedOverrideState) || GetOverrideStatus(platform) == OverrideStatus.AllOverrides) && properties.settings.loadType == AudioClipLoadType.Streaming;

                MultiValueStatus multiStatus = GetMultiValueStatus(platform);
                bool             platformSettingsDisabled = !((properties.overrideIsForced && properties.forcedOverrideState) || status == OverrideStatus.AllOverrides);

                using (new EditorGUI.DisabledScope(platformSettingsDisabled))
                {
                    OnSampleSettingGUI(platform, multiStatus, selectionContainsTrackerFile, ref properties, disablePreloadAudioDataOption);
                }

                m_SampleSettingOverrides[platform] = properties;
            }

            EditorGUILayout.EndPlatformGrouping();
        }
        private void OnSampleSettingGUI(BuildTargetGroup platform, MultiValueStatus status, bool selectionContainsTrackerFile, ref SampleSettingProperties properties, bool disablePreloadAudioDataOption)
        {
            //Load Type
            EditorGUI.showMixedValue = status.multiLoadType && !properties.loadTypeChanged;
            EditorGUI.BeginChangeCheck();
            AudioClipLoadType newLoadType = (AudioClipLoadType)EditorGUILayout.EnumPopup("Load Type", properties.settings.loadType);

            if (EditorGUI.EndChangeCheck())
            {
                properties.settings.loadType = newLoadType;
                properties.loadTypeChanged   = true;
            }

            using (new EditorGUI.DisabledScope(disablePreloadAudioDataOption))
            {
                if (disablePreloadAudioDataOption)
                {
                    EditorGUILayout.Toggle("Preload Audio Data", false);
                }
                else
                {
                    EditorGUILayout.PropertyField(m_PreloadAudioData);
                }
            }

            if (!selectionContainsTrackerFile)
            {
                //Compression format
                AudioCompressionFormat[] allowedFormats = GetFormatsForPlatform(platform);
                EditorGUI.showMixedValue = status.multiCompressionFormat && !properties.compressionFormatChanged;
                EditorGUI.BeginChangeCheck();
                AudioCompressionFormat newFormat = (AudioCompressionFormat)EditorGUILayout.IntPopup("Compression Format",
                                                                                                    (int)properties.settings.compressionFormat,
                                                                                                    Array.ConvertAll(allowedFormats, value => value.ToString()),
                                                                                                    Array.ConvertAll(allowedFormats, value => (int)value));
                if (EditorGUI.EndChangeCheck())
                {
                    properties.settings.compressionFormat = newFormat;
                    properties.compressionFormatChanged   = true;
                }

                //Quality
                if (CompressionFormatHasQuality(properties.settings.compressionFormat))
                {
                    EditorGUI.showMixedValue = status.multiQuality && !properties.qualityChanged;
                    EditorGUI.BeginChangeCheck();
                    int newQuality = EditorGUILayout.IntSlider("Quality", (int)Mathf.Clamp(properties.settings.quality * 100.0f, 1.0f, 100.0f), 1, 100);
                    if (EditorGUI.EndChangeCheck())
                    {
                        properties.settings.quality = 0.01f * newQuality;
                        properties.qualityChanged   = true;
                    }
                }

                if (platform != BuildTargetGroup.WebGL)
                {
                    //Sample rate settings
                    EditorGUI.showMixedValue = status.multiSampleRateSetting && !properties.sampleRateSettingChanged;
                    EditorGUI.BeginChangeCheck();
                    AudioSampleRateSetting newSetting = (AudioSampleRateSetting)EditorGUILayout.EnumPopup("Sample Rate Setting", properties.settings.sampleRateSetting);
                    if (EditorGUI.EndChangeCheck())
                    {
                        properties.settings.sampleRateSetting = newSetting;
                        properties.sampleRateSettingChanged   = true;
                    }

                    //Sample rate settings
                    if (properties.settings.sampleRateSetting == AudioSampleRateSetting.OverrideSampleRate)
                    {
                        EditorGUI.showMixedValue = status.multiSampleRateOverride && !properties.sampleRateOverrideChanged;
                        EditorGUI.BeginChangeCheck();
                        int newRate = EditorGUILayout.IntPopup("Sample Rate", (int)properties.settings.sampleRateOverride,
                                                               Styles.kSampleRateStrings, Styles.kSampleRateValues);
                        if (EditorGUI.EndChangeCheck())
                        {
                            properties.settings.sampleRateOverride = (uint)newRate;
                            properties.sampleRateOverrideChanged   = true;
                        }
                    }
                }

                //TODO include the settings for things like HEVAG
                EditorGUI.showMixedValue = false;
            }
        }