Beispiel #1
0
    public static void InitializeLibrary()
    {
        /* 初期化カウンタの更新 */
        CriManaPlugin.initializationCount++;
        if (CriManaPlugin.initializationCount != 1)
        {
            return;
        }

        /* CriWareInitializerが実行済みかどうかを確認 */
        bool initializerWorking = CriWareInitializer.IsInitialized();

        if (initializerWorking == false)
        {
            Debug.Log("[CRIWARE] CriWareInitializer is not working. "
                      + "Initializes Mana by default parameters.");
        }

        /* 依存ライブラリの初期化 */
        CriFsPlugin.InitializeLibrary();
        CriAtomPlugin.InitializeLibrary();

        /* ライブラリの初期化 */
        CriManaPlugin.criManaUnity_Initialize();

        /* RendererResource の自動登録を実行 */
        CriMana.Detail.AutoResisterRendererResourceFactories.InvokeAutoRegister();
    }
    /* プレビュ用:初期化関数 */
    private void PreparePreview()
    {
        if (CriAtomPlugin.IsLibraryInitialized() == false)
        {
            CriWareInitializer.InitializeAtom(new CriAtomConfig());
        }
        if (CriAtomPlugin.IsLibraryInitialized() == false)
        {
            return;
        }

        previewPlayer = new CriAtomExPlayer();
        if (previewPlayer == null)
        {
            return;
        }

        if (atomComponent != null)
        {
            CriAtomEx.RegisterAcf(null, Path.Combine(CriWare.streamingAssetsPath, atomComponent.acfFile));
        }
        else
        {
            Debug.LogWarning("[CRIWARE] CriAtom component not found in this scene");
            return;
        }

        isPreviewReady = true;
    }
Beispiel #3
0
        public static void Initialize()
        {
            var initializerCreate = false;

            CriWareInitializer initializer = null;

            if (!CriWareInitializer.IsInitialized())
            {
                initializer = UnityUtility.FindObjectOfType <CriWareInitializer>();

                if (initializer == null)
                {
                    initializer           = UnityUtility.CreateGameObject <CriWareInitializer>(null, "CriWareInitializer");
                    initializer.hideFlags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor;
                    initializerCreate     = true;
                }

                initializer.Initialize();
            }

            if (initializer != null && initializerCreate)
            {
                UnityUtility.SafeDelete(initializer.gameObject);
            }
        }
Beispiel #4
0
    public static void InitializeLibrary()
    {
        /* 初期化カウンタの更新 */
        CriAtomPlugin.initializationCount++;
        if (CriAtomPlugin.initializationCount != 1)
        {
            return;
        }

        /* CriWareInitializerが実行済みかどうかを確認 */
        bool initializerWorking = CriWareInitializer.IsInitialized();

        if (initializerWorking == false)
        {
            Debug.Log("[CRIWARE] CriWareInitializer is not working. "
                      + "Initializes Atom by default parameters.");
        }

        /* 依存ライブラリの初期化 */
        CriFsPlugin.InitializeLibrary();

        /* ライブラリの初期化 */
        CriAtomPlugin.criAtomUnity_Initialize();

        /* CriAtomServerのインスタンスを生成 */
                #if UNITY_EDITOR
        /* ゲームプレビュー時のみ生成する */
        if (UnityEngine.Application.isPlaying)
        {
            CriAtomServer.CreateInstance();
        }
                #else
        CriAtomServer.CreateInstance();
                #endif
    }
        private bool Reload()
        {
            if (string.IsNullOrEmpty(Prefs.resourceDir))
            {
                return(false);
            }

            resourceDir = Prefs.resourceDir;
            isLoaded    = false;

            if (!string.IsNullOrEmpty(Prefs.selectionAssetGUID))
            {
                var assetPath = AssetDatabase.GUIDToAssetPath(Prefs.selectionAssetGUID);
                selectAcbAsset = AssetDatabase.LoadMainAssetAtPath(assetPath);

                if (selectAcbAsset != null)
                {
                    if (EditorApplication.isPlayingOrWillChangePlaymode)
                    {
                        // CriWareInitializerの初期化を待つ.
                        Observable.EveryUpdate()
                        .SkipWhile(_ => !CriWareInitializer.IsInitialized())
                        .First()
                        .Subscribe(
                            _ =>
                        {
                            LoadCueInfo(selectAcbAsset);
                            Repaint();
                        })
                        .AddTo(Disposable);
                    }
                    else
                    {
                        CriForceInitializer.Initialize();

                        LoadCueInfo(selectAcbAsset);
                    }
                }
            }

            return(true);
        }
Beispiel #6
0
        public override void OnEnable(UnityEngine.Object target)
        {
            if (EditorApplication.isPlayingOrWillChangePlaymode)
            {
                // CriWareInitializerの初期化を待つ.
                Observable.EveryUpdate()
                .SkipWhile(_ => !CriWareInitializer.IsInitialized())
                .First()
                .Subscribe(_ => LoadCueInfo(target))
                .AddTo(lifetimeDisposable.Disposable);
            }
            else
            {
                CriForceInitializer.Initialize();

                LoadCueInfo(target);
            }

            clipboardIcon = EditorGUIUtility.IconContent("Clipboard");
        }
    public static void InitializeLibrary()
    {
        /* 初期化カウンタの更新 */
        CriFsPlugin.initializationCount++;
        if (CriFsPlugin.initializationCount != 1)
        {
            return;
        }

        /* CriWareInitializerが実行済みかどうかを確認 */
        bool initializerWorking = CriWareInitializer.IsInitialized();

        if (initializerWorking == false)
        {
            Debug.Log("[CRIWARE] CriWareInitializer is not working. "
                      + "Initializes FileSystem by default parameters.");
        }

        /* ライブラリの初期化 */
        CriFsPlugin.criFsUnity_Initialize();
    }
Beispiel #8
0
 public override void OnPlayableCreate(Playable playable)
 {
     base.OnPlayableCreate(playable);
     m_Guid = Guid.NewGuid();
     if (IsEditor)
     {
         if (CriAtomPlugin.IsLibraryInitialized() == false)
         {
             CriWareInitializer criInitializer = GameObject.FindObjectOfType <CriWareInitializer>();
             if (criInitializer != null)
             {
                 CriWareInitializer.InitializeAtom(criInitializer.atomConfig);
             }
             else
             {
                 CriWareInitializer.InitializeAtom(new CriAtomConfig());
                 Debug.Log("[CRIWARE] Timeline / Atom: Can't find CriWareInitializer component; Using default parameters in edit mode.");
             }
         }
     }
     m_lastDirectorTime = 0;
 }
    static void AppInitialize()
    {
        // 画面サイズ固定
        if (Application.platform == RuntimePlatform.WindowsPlayer ||
            Application.platform == RuntimePlatform.OSXPlayer ||
            Application.platform == RuntimePlatform.LinuxPlayer)
        {
            Screen.SetResolution(screenWidth, screenHeight, false);
        }

        if (!CriWareInitializer.IsInitialized())
        {
            var criWareInitializer = new GameObject("CriWareLibraryInitializer").AddComponent <CriWareInitializer>();
            criWareInitializer.dontInitializeOnAwake = true;
            criWareInitializer.Initialize();
            DontDestroyOnLoad(CriWare.managerObject);
        }

        var acbManager = new GameObject("AcbManager").AddComponent <AcbManager>();

        acbManager.LoadAcf();
        DontDestroyOnLoad(acbManager.gameObject);
    }
Beispiel #10
0
    public static void ReSetup(bool useEmb)
    {
        if (!MyCriManager.sInit)
        {
            MyCriManager.Setup(useEmb);
        }
        else
        {
            MyCriManager.AcfFileName = !useEmb ? (!GameUtility.Config_UseAssetBundles.Value ? Path.Combine(CriWare.get_streamingAssetsPath(), MyCriManager.AcfFileNameAB) : MyCriManager.GetLoadFileName(MyCriManager.AcfFileNameAB)) : Path.Combine(CriWare.get_streamingAssetsPath(), MyCriManager.AcfFileNameEmb);
            CriWareInitializer criWareInitializer = !Object.op_Equality((Object)MyCriManager.sCriWareInitializer, (Object)null) ? (CriWareInitializer)MyCriManager.sCriWareInitializer.GetComponent <CriWareInitializer>() : (CriWareInitializer)null;
            if (Object.op_Inequality((Object)criWareInitializer, (Object)null) && criWareInitializer.decrypterConfig != null)
            {
                ulong  num   = ((string)((CriWareDecrypterConfig)criWareInitializer.decrypterConfig).key).Length != 0 ? Convert.ToUInt64((string)((CriWareDecrypterConfig)criWareInitializer.decrypterConfig).key) : 0UL;
                string path2 = !useEmb?MyCriManager.GetLoadFileName(MyCriManager.DatFileNameAB) : MyCriManager.DatFileNameEmb;

                if (CriWare.IsStreamingAssetsPath(path2))
                {
                    path2 = Path.Combine(CriWare.get_streamingAssetsPath(), path2);
                }
                CriWare.criWareUnity_SetDecryptionKey(num, path2, (bool)((CriWareDecrypterConfig)criWareInitializer.decrypterConfig).enableAtomDecryption, (bool)((CriWareDecrypterConfig)criWareInitializer.decrypterConfig).enableManaDecryption);
            }
            MyCriManager.UsingEmb = useEmb;
        }
    }
Beispiel #11
0
        void IInitializable.Initialize()
        {
            // initialize
            Observable.EveryUpdate()
            .Where(_ => CriWareInitializer.IsInitialized())
            .First()
            .SelectMany(_ => ADX2Utility.AddCueSheet(_settings.BuiltInCueSheet)
                        .First())
            .Subscribe(cueSheet =>
            {
                if (cueSheet != null)
                {
                    // add cue list
                    var cueNameList = ADX2Utility.GetCueNameList(cueSheet.name);
                    foreach (var cueName in cueNameList)
                    {
                        _cueSheetDictionary.Add(cueName, cueSheet.name);
                    }

                    // create sound source
                    var source = new GameObject("BGM").AddComponent <CriAtomSource>();
                    source.use3dPositioning = false;
                    source.loop             = true;
                    source.player.AttachFader();
                    _source.Value = source;
                }

                _initialized.Value = true;
            })
            .AddTo(_disposable);

            Observable.Merge(
                _intent.OnPlayAsObservable().Select(x => x.ToString()),
                _intent.OnPlayForNameAsObservable())
            .Where(_ => _initialized.Value)
            .Subscribe(x =>
            {
                string cueSheet;
                if (!_cueSheetDictionary.TryGetValue(x, out cueSheet))
                {
                    Debug.unityLogger.LogError(GetType().Name, $"{x} is not found.");
                    return;
                }

                _source.Value.cueSheet = cueSheet;
                _source.Value.Pause(false);
                _source.Value.Play(x);
            })
            .AddTo(_disposable);

            _intent.OnPauseAsObservable()
            .Where(_ => _source.Value != null)
            .Subscribe(x => _source.Value.Pause(x))
            .AddTo(_disposable);

            _intent.OnStopAsObservable()
            .Where(_ => _source.Value != null)
            .Subscribe(_ => _source.Value.Stop())
            .AddTo(_disposable);

            // volume
            _volumeIntent.OnMasterVolumeAsObservable()
            .Subscribe(x => _masterVolume.Value = x)
            .AddTo(_disposable);

            _volumeIntent.OnVoiceVolumeAsObservable()
            .Subscribe(x => _volume.Value = x)
            .AddTo(_disposable);

            var initialize = _initialized
                             .Where(x => x)
                             .First()
                             .Publish()
                             .RefCount();


            initialize
            .Where(_ => _source.Value != null)
            .SelectMany(_ => _masterVolume)
            .Subscribe(x => _source.Value.volume = x)
            .AddTo(_disposable);

            initialize
            .SelectMany(_ => _volume)
            .Subscribe(x => CriAtom.SetCategoryVolume(_settings.CategoryVolumeName, x))
            .AddTo(_disposable);
        }
Beispiel #12
0
    public override void OnInspectorGUI()
    {
        CriWareInitializer initializer = target as CriWareInitializer;

        // FileSystem Config
        initializer.initializesFileSystem =
            EditorGUILayout.BeginToggleGroup("Initialize FileSystem", initializer.initializesFileSystem);
        EditorGUI.indentLevel += 1;
        {
            GenIntField("Number of Loaders", "The maximum number of CriFsLoader objects used at a time. " +
                        "NOTE: Count the number of CriFsLoadFileRequest objects and the total number of Streaming Voices in CRI Atom settings and the number of CriManaPlayer component,",
                        ref initializer.fileSystemConfig.numberOfLoaders, 0, 128);
            GenIntField("Number of Binders", "", ref initializer.fileSystemConfig.numberOfBinders, 0, 128);
            GenIntField("Number of Installers", "", ref initializer.fileSystemConfig.numberOfInstallers, 0, 128);
            GenIntFieldWithUnit("Install Buffer Size", "[KiB]", "Internal buffer size to install data. A larger buffer size result in better performance.", ref initializer.fileSystemConfig.installBufferSize, 32, int.MaxValue);
            GenIntField("Max Length of Path", "The maximum length of path (file path or url path) that can be passed.", ref initializer.fileSystemConfig.maxPath, 64, 2048);
            GenStringField("User Agent String", "", ref initializer.fileSystemConfig.userAgentString);

            showFileSystemAndroidConfig = EditorGUILayout.Foldout(showFileSystemAndroidConfig, "Android Config");
            if (showFileSystemAndroidConfig)
            {
                EditorGUI.indentLevel += 1;
                {
                    /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                    if (initializer.fileSystemConfig.androidDeviceReadBitrate == 0)
                    {
                        initializer.fileSystemConfig.androidDeviceReadBitrate = CriFsConfig.defaultAndroidDeviceReadBitrate;
                    }
                }
                GenIntFieldWithUnit("Device Read Bitrate", "[bps]", "Expected minimum device read bitrate to be used for multi-streaming management." + CriFsConfig.defaultAndroidDeviceReadBitrate + " bps",
                                    ref initializer.fileSystemConfig.androidDeviceReadBitrate, 0, int.MaxValue, 225);
                EditorGUI.indentLevel -= 1;
            }
        }
        EditorGUI.indentLevel -= 1;
        EditorGUILayout.EndToggleGroup();

        // Atom Config
        initializer.initializesAtom =
            EditorGUILayout.BeginToggleGroup("Initialize Atom", initializer.initializesAtom);
        EditorGUI.indentLevel += 1;
        {
            GenStringField("ACF File Name", "", ref initializer.atomConfig.acfFileName);
            GenIntField("Max Virtual Voices", "", ref initializer.atomConfig.maxVirtualVoices, CriAtomPlugin.GetRequiredMaxVirtualVoices(initializer.atomConfig), 1024);
            GenIntFieldWithUnit("Sampling Rate", "[Hz]",
                                "Sound output sampling rate. "
                                + "HCA-MX needs to set the sampling rate of HCA-MX data. "
                                + "A value of 0 (the default value) means that the internal value will be applied.",
                                ref initializer.atomConfig.outputSamplingRate, 0, 192000);
            GenPositiveFloatField("Server Frequency", "[Hz]", "", ref initializer.atomConfig.serverFrequency, 15.0f, 120.0f);
            GenToggleField("Uses Time For Seed", "", ref initializer.atomConfig.useRandomSeedWithTime);
            GenToggleField("Uses In Game Preview", "", ref initializer.atomConfig.usesInGamePreview);

            showAtomStandardVoicePoolConfig = EditorGUILayout.Foldout(showAtomStandardVoicePoolConfig, "Standard Voice Pool Config");
            if (showAtomStandardVoicePoolConfig)
            {
                EditorGUI.indentLevel += 1;
                GenIntField("Memoy Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.memoryVoices, 0, 1024);
                GenIntField("Streaming Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.streamingVoices, 0, 1024);
                EditorGUI.indentLevel -= 1;
            }

            showAtomHcaMxVoicePoolConfig = EditorGUILayout.Foldout(showAtomHcaMxVoicePoolConfig, "HCA-MX Voice Pool Config");
            if (showAtomHcaMxVoicePoolConfig)
            {
                EditorGUI.indentLevel += 1;
                GenIntField("Memoy Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.memoryVoices, 0, 1024);
                GenIntField("Streaming Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.streamingVoices, 0, 1024);
                EditorGUI.indentLevel -= 1;
            }

            showAtomIOSConfig = EditorGUILayout.Foldout(showAtomIOSConfig, "iOS Config");
            if (showAtomIOSConfig)
            {
                EditorGUI.indentLevel += 1;
                GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.iosBufferingTime, 16, 200);
                GenToggleField("Override iPod Music", "", ref initializer.atomConfig.iosOverrideIPodMusic);
                EditorGUI.indentLevel -= 1;
            }

            showAtomAndroidConfig = EditorGUILayout.Foldout(showAtomAndroidConfig, "Android Config");
            if (showAtomAndroidConfig)
            {
                EditorGUI.indentLevel += 1;
                {
                    /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                    if (initializer.atomConfig.androidBufferingTime == 0)
                    {
                        initializer.atomConfig.androidBufferingTime = (int)(4 * 1000.0 / initializer.atomConfig.serverFrequency);
                    }
                    if (initializer.atomConfig.androidStartBufferingTime == 0)
                    {
                        initializer.atomConfig.androidStartBufferingTime = (int)(3 * 1000.0 / initializer.atomConfig.serverFrequency);
                    }
                }
                GenIntFieldWithUnit("Buffering TimeWithUnit", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.androidBufferingTime, 50, 500);
                GenIntFieldWithUnit("Start Buf TimeWithUnit", "[msec]", "Sound buffering time to start playing. This value will be applied when using the low latency voice pool.", ref initializer.atomConfig.androidStartBufferingTime, 50, 500);
                showAtomAndroidVoicePoolConfig = EditorGUILayout.Foldout(showAtomAndroidVoicePoolConfig, "Low Latency Standard Voice Pool Config");
                if (showAtomAndroidVoicePoolConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Memory Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.memoryVoices, 0, 32);
                    GenIntField("Streaming Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.streamingVoices, 0, 32);
                    EditorGUI.indentLevel -= 1;
                }
                EditorGUI.indentLevel -= 1;
            }
        }
        EditorGUI.indentLevel -= 1;
        EditorGUILayout.EndToggleGroup();

        // Mana Config
        initializer.initializesMana =
            EditorGUILayout.BeginToggleGroup("Initialize Mana", initializer.initializesMana);
        EditorGUI.indentLevel += 1;
        {
            GenIntField("Number Of Decoders", "", ref initializer.manaConfig.numberOfDecoders, 0, 128);
            GenIntField("Number Of Max Entries", "", ref initializer.manaConfig.numberOfMaxEntries, 0, 1024);
            GenToggleField("Enable CuePoint", "", ref initializer.manaConfig.enableCuePoint);
        }

        EditorGUI.indentLevel -= 1;
        EditorGUILayout.EndToggleGroup();

        GenToggleField("Dont Destroy On Load", "", ref initializer.dontDestroyOnLoad);
    }
    public override void OnInspectorGUI()
    {
        CriWareInitializer initializer = target as CriWareInitializer;

        Undo.RecordObject(target, null);

        GUI.changed = false;
        {
            // FileSystem Config
            initializer.initializesFileSystem =
                EditorGUILayout.BeginToggleGroup("Initialize FileSystem", initializer.initializesFileSystem);
            EditorGUI.indentLevel += 1;
            {
                GenIntField("Number of Loaders", "The maximum number of CriFsLoader objects used at a time. " +
                            "NOTE: Count the number of CriFsLoadFileRequest objects and the total number of Streaming Voices in CRI Atom settings and the number of CriMana.Player component,",
                            ref initializer.fileSystemConfig.numberOfLoaders, 0, 128);
                GenIntField("Number of Binders", "", ref initializer.fileSystemConfig.numberOfBinders, 0, 128);
                GenIntField("Number of Installers", "", ref initializer.fileSystemConfig.numberOfInstallers, 0, 128);
                GenIntFieldWithUnit("Install Buffer Size", "[KiB]", "Internal buffer size to install data. A larger buffer size result in better performance.", ref initializer.fileSystemConfig.installBufferSize, 32, int.MaxValue);
                GenIntField("Max Length of Path", "The maximum length of path (file path or url path) that can be passed.", ref initializer.fileSystemConfig.maxPath, 64, 2048);
                GenStringField("User Agent String", "", ref initializer.fileSystemConfig.userAgentString);
                GenToggleField("Minimize FD Usage", "With this option, the plugin minimizes file descriptor usage so that applicaiton can save file descriptor resource. However, this may increase file I/O instead.", ref initializer.fileSystemConfig.minimizeFileDescriptorUsage);
                GenToggleField("Enable CRC Check", "This option enables a CRC check on loading or binding when the cpk file contains CRC.", ref initializer.fileSystemConfig.enableCrcCheck);

                showFileSystemAndroidConfig = EditorGUILayout.Foldout(showFileSystemAndroidConfig, "Android Config");
                if (showFileSystemAndroidConfig)
                {
                    EditorGUI.indentLevel += 1;
                    {
                        /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                        if (initializer.fileSystemConfig.androidDeviceReadBitrate == 0)
                        {
                            initializer.fileSystemConfig.androidDeviceReadBitrate = CriFsConfig.defaultAndroidDeviceReadBitrate;
                        }
                    }
                    GenIntFieldWithUnit("Device Read Bitrate", "[bps]", "Expected minimum device read bitrate to be used for multi-streaming management." + CriFsConfig.defaultAndroidDeviceReadBitrate + " bps",
                                        ref initializer.fileSystemConfig.androidDeviceReadBitrate, 0, int.MaxValue);
                    EditorGUI.indentLevel -= 1;
                }
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();

            // Atom Config
            initializer.initializesAtom =
                EditorGUILayout.BeginToggleGroup("Initialize Atom", initializer.initializesAtom);
            EditorGUI.indentLevel += 1;
            {
                GenStringField("ACF File Name", "", ref initializer.atomConfig.acfFileName);
                GenIntField("Max Virtual Voices", "", ref initializer.atomConfig.maxVirtualVoices, CriAtomPlugin.GetRequiredMaxVirtualVoices(initializer.atomConfig), 1024);
                GenIntField("Max Voice Limit Groups", "", ref initializer.atomConfig.maxVoiceLimitGroups, 0, 1024);
                GenIntField("Max Parameter Blocks", "", ref initializer.atomConfig.maxParameterBlocks, 1024, 4096);
                GenIntField("Max Buses", "Maximum number of buses.", ref initializer.atomConfig.maxBuses, 1, 64);
                GenIntField("Max Categories", "Maximum number of categories.", ref initializer.atomConfig.maxCategories, 0, 1024);
                GenIntField("Max Sequence Events Per Frame", "Maximum number of sequence events that will be triggered in one application frame.", ref initializer.atomConfig.maxSequenceEventsPerFrame, 0, 64);
                GenIntField("Max Beat Sync Callbacks Per Frame", "Maximum number of beat synchronized callback that will be triggered in one application frame.", ref initializer.atomConfig.maxBeatSyncCallbacksPerFrame, 0, 64);
                GenIntField("Categories per Playback", "Number of category references per playback.", ref initializer.atomConfig.categoriesPerPlayback, 0, 16);
                GenIntFieldWithUnit("Sampling Rate", "[Hz]",
                                    "Sound output sampling rate. "
                                    + "HCA-MX needs to set the sampling rate of HCA-MX data. "
                                    + "A value of 0 (the default value) means that the internal value will be applied.",
                                    ref initializer.atomConfig.outputSamplingRate, 0, 192000);
                GenPositiveFloatField("Server Frequency", "[Hz]", "", ref initializer.atomConfig.serverFrequency, 15.0f, 120.0f);

                int selected_output_mode = 0;
                foreach (int num_channnels in asrNumOutputChannels)
                {
                    if (num_channnels == initializer.atomConfig.asrOutputChannels)
                    {
                        break;
                    }
                    selected_output_mode++;
                }
                selected_output_mode = EditorGUILayout.Popup("ASR Output Mode", selected_output_mode, asrOutputModes);
                initializer.atomConfig.asrOutputChannels = asrNumOutputChannels[selected_output_mode];

                GenToggleField("Use Time For Seed", "", ref initializer.atomConfig.useRandomSeedWithTime);

                if (initializer.atomConfig.inGamePreviewMode == CriAtomConfig.InGamePreviewSwitchMode.Default)
                {
                    initializer.atomConfig.inGamePreviewMode = initializer.atomConfig.usesInGamePreview ?
                                                               CriAtomConfig.InGamePreviewSwitchMode.Enable :
                                                               CriAtomConfig.InGamePreviewSwitchMode.Disable;
                    initializer.atomConfig.usesInGamePreview = false;
                }
                int selected_ingamepreview_switch_mode = 0;
                foreach (CriAtomConfig.InGamePreviewSwitchMode mode in inGamePreviewSwitchModeValues)
                {
                    if (mode == initializer.atomConfig.inGamePreviewMode)
                    {
                        break;
                    }
                    selected_ingamepreview_switch_mode++;
                }
                selected_ingamepreview_switch_mode       = EditorGUILayout.Popup("In Game Preview", selected_ingamepreview_switch_mode, inGamePreviewSwitchModes);
                initializer.atomConfig.inGamePreviewMode = inGamePreviewSwitchModeValues[selected_ingamepreview_switch_mode];

                if (initializer.atomConfig.inGamePreviewMode != CriAtomConfig.InGamePreviewSwitchMode.Disable)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Max Preview Objects", "", ref initializer.atomConfig.inGamePreviewConfig.maxPreviewObjects, 0, 1024);
                    GenIntFieldWithUnit("Communication Buffer Size", "[KiB]", "Size of buffer for communication between library and tool.", ref initializer.atomConfig.inGamePreviewConfig.communicationBufferSize, 2048, int.MaxValue);
                    GenIntFieldWithUnit("Update Interval", "[counts of server process]", "Interval to update playback position.", ref initializer.atomConfig.inGamePreviewConfig.playbackPositionUpdateInterval, 1, 8);
                    EditorGUI.indentLevel -= 1;
                }


                GenToggleField("VR Mode", "", ref initializer.atomConfig.vrMode);
                GenToggleField("Keep Playing Sound On Pause", "", ref initializer.atomConfig.keepPlayingSoundOnPause);

                showAtomStandardVoicePoolConfig = EditorGUILayout.Foldout(showAtomStandardVoicePoolConfig, "Standard Voice Pool Config");
                if (showAtomStandardVoicePoolConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Memory Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.memoryVoices, 0, 1024);
                    GenIntField("Streaming Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.streamingVoices, 0, 1024);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomHcaMxVoicePoolConfig = EditorGUILayout.Foldout(showAtomHcaMxVoicePoolConfig, "HCA-MX Voice Pool Config");
                if (showAtomHcaMxVoicePoolConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Memory Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.memoryVoices, 0, 1024);
                    GenIntField("Streaming Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.streamingVoices, 0, 1024);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomPCConfig = EditorGUILayout.Foldout(showAtomPCConfig, "PC Config");
                if (showAtomPCConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.pcBufferingTime, 0, 2000);
                    EditorGUI.indentLevel -= 1;
                }
                showAtomIOSConfig = EditorGUILayout.Foldout(showAtomIOSConfig, "iOS Config");
                if (showAtomIOSConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.iosBufferingTime, 16, 200);
                    GenToggleField("Override iPod Music", "", ref initializer.atomConfig.iosOverrideIPodMusic);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomAndroidConfig = EditorGUILayout.Foldout(showAtomAndroidConfig, "Android Config");
                if (showAtomAndroidConfig)
                {
                    EditorGUI.indentLevel += 1;
                    {
                        /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                        if (initializer.atomConfig.androidBufferingTime == 0)
                        {
                            initializer.atomConfig.androidBufferingTime = (int)(4 * 1000.0 / initializer.atomConfig.serverFrequency);
                        }
                        if (initializer.atomConfig.androidStartBufferingTime == 0)
                        {
                            initializer.atomConfig.androidStartBufferingTime = (int)(3 * 1000.0 / initializer.atomConfig.serverFrequency);
                        }
                    }
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.androidBufferingTime, 50, 500);
                    GenIntFieldWithUnit("Start Buffering", "[msec]", "Sound buffering time to start playing. This value will be applied when using the low latency voice pool.", ref initializer.atomConfig.androidStartBufferingTime, 50, 500);
                    showAtomAndroidVoicePoolConfig = EditorGUILayout.Foldout(showAtomAndroidVoicePoolConfig, "Low Latency Standard Voice Pool Config");
                    if (showAtomAndroidVoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Memory Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.memoryVoices, 0, 32);
                        GenIntField("Streaming Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.streamingVoices, 0, 32);
                        EditorGUI.indentLevel -= 1;
                    }
                    GenToggleField("Use Android Fast Mixer", "", ref initializer.atomConfig.androidUsesAndroidFastMixer);
                    GenToggleField("Use Asr For Default Playback", "", ref initializer.atomConfig.androidForceToUseAsrForDefaultPlayback);
                    GenToggleField("[Beta] Use AAudio", "", ref initializer.atomConfig.androidUsesAAudio);
                    EditorGUI.indentLevel -= 1;
                }
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();


            GenToggleField("Dont Initialize On Awake", "", ref initializer.dontInitializeOnAwake);
            GenToggleField("Dont Destroy On Load", "", ref initializer.dontDestroyOnLoad);
        }
        if (GUI.changed)
        {
            EditorUtility.SetDirty(initializer);
        }
    }
Beispiel #14
0
        //----- method -----

        public void Initialize(string decryptKey)
        {
            #if ENABLE_CRIWARE
            // CRIの管理GameObject名にリネーム.
            gameObject.transform.name = CriWareManageObjectName;

            // CriAtomServer → CriAtomの順で初期化しないとCriAtomにCriAtomServerを生成されてしまう.
            CriAtomServer.CreateInstance();

            if (Initializer == null)
            {
                // Acfを管理する為自動初期化を無効化.
                var source            = initializerPrefab.Source;
                var initializerSource = UnityUtility.GetComponent <CriWareInitializer>(source);
                initializerSource.dontInitializeOnAwake = true;

                // 生成.
                Initializer = initializerPrefab.Instantiate <CriWareInitializer>();
                Initializer.transform.name = "Initializer";

                //========================================================
                // ライブラリ初期化(この処理完了後にCRIが有効化される).
                //========================================================

                // 手動管理する為無効化.
                Initializer.dontDestroyOnLoad = false;

                // 認証キー.
                Initializer.decrypterConfig.key = decryptKey;

                // ファイルハンドルの使用数を節約する為、ファイルアクセスが行われるタイミングでのみハンドルを利用するよう変更.
                // ※ 逐次オープンとなるためファイルアクセスの性能は低下する.
                Initializer.fileSystemConfig.numberOfBinders             = 65535;
                Initializer.fileSystemConfig.minimizeFileDescriptorUsage = true;

                // 同時インストール可能数を設定.
                Initializer.fileSystemConfig.numberOfInstallers = 65535;

                // 初期化実行.
                Initializer.Initialize();
            }

            if (ErrorHandler == null)
            {
                var errorHandlerObject = UnityUtility.CreateEmptyGameObject(gameObject, "ErrorHandler");

                UnityUtility.SetActive(errorHandlerObject, false);

                // Awakeが実行されないように非アクティブでAddComponent.
                ErrorHandler = errorHandlerObject.AddComponent <CriWareErrorHandler>();
                ErrorHandler.dontDestroyOnLoad = false;

                UnityUtility.SetActive(errorHandlerObject, true);
            }

            if (!CriWareInitializer.IsInitialized())
            {
                Initializer.Initialize();
            }

            // CriFsServerはライブラリの初期化後に生成.
            CriFsServer.CreateInstance();

            // CriAtomはライブラリの初期化後に生成.
            var criAtom = gameObject.AddComponent <CriAtom>();

            // CriAtomのSetupが隠蔽されているので手動で初期化する.
            criAtom.acfFile = Initializer.atomConfig.acfFileName;

            if (!string.IsNullOrEmpty(criAtom.acfFile))
            {
                var acfPath = PathUtility.Combine(global::CriWare.streamingAssetsPath, criAtom.acfFile);

                acfPath += CriAssetDefinition.AcfExtension;

                CriAtomEx.RegisterAcf(null, acfPath);
            }
            #endif
        }
Beispiel #15
0
 public static void Setup(bool useEmb = false)
 {
     if (MyCriManager.sInit)
     {
         return;
     }
     if (CriWareInitializer.IsInitialized())
     {
         DebugUtility.LogError("[MyCriManager] CriWareInitializer already initialized. if you added it or CriAtomSource in scene, remove it.");
     }
     else if (Object.op_Inequality(Object.FindObjectOfType(typeof(CriWareInitializer)), (Object)null))
     {
         DebugUtility.LogError("[MyCriManager] CriWareInitializer already exist. if you added it in scene, remove it.");
     }
     else if (Object.op_Inequality(Object.FindObjectOfType(typeof(CriAtom)), (Object)null))
     {
         DebugUtility.LogError("[MyCriManager] CriAtom already exist. if you added it in scene, remove it.");
     }
     else
     {
         GameObject gameObject = (GameObject)Object.Instantiate(Resources.Load("CriWareLibraryInitializer"), Vector3.get_zero(), Quaternion.get_identity());
         if (Object.op_Inequality((Object)gameObject, (Object)null))
         {
             CriWareInitializer component = (CriWareInitializer)gameObject.GetComponent <CriWareInitializer>();
             if (Object.op_Inequality((Object)component, (Object)null))
             {
                 if (useEmb)
                 {
                     MyCriManager.AcfFileName = Path.Combine(CriWare.get_streamingAssetsPath(), MyCriManager.AcfFileNameEmb);
                     ((CriWareDecrypterConfig)component.decrypterConfig).authenticationFile = (__Null)MyCriManager.DatFileNameEmb;
                 }
                 else
                 {
                     MyCriManager.AcfFileName = Path.Combine(CriWare.get_streamingAssetsPath(), MyCriManager.AcfFileNameAB);
                     ((CriWareDecrypterConfig)component.decrypterConfig).authenticationFile = (__Null)MyCriManager.DatFileNameAB;
                 }
                 ((CriAtomConfig)component.atomConfig).acfFileName = (__Null)string.Empty;
                 DebugUtility.LogWarning("[MyCriManager] Init with EMB:" + (object)useEmb + " acf:" + MyCriManager.AcfFileName + " dat:" + (object)((CriWareDecrypterConfig)component.decrypterConfig).authenticationFile);
                 MyCriManager.sCriWareInitializer = gameObject;
                 MyCriManager.UsingEmb            = useEmb;
                 AndroidJavaClass androidJavaClass = new AndroidJavaClass("android.os.Build");
                 string           str = androidJavaClass != null ? (string)((AndroidJavaObject)androidJavaClass).GetStatic <string>("MODEL") : (string)null;
                 if (!string.IsNullOrEmpty(str))
                 {
                     if (str.CompareTo("F-05D") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)200;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)150;
                     }
                     if (str.CompareTo("T-01D") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)200;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)150;
                     }
                     if (str.CompareTo("AT200") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)220;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)220;
                     }
                     if (str.CompareTo("F-04E") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)220;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)220;
                     }
                     if (str.CompareTo("F-11D") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)400;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)400;
                     }
                     if (str.CompareTo("IS15SH") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)400;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)400;
                     }
                     if (str.CompareTo("IS17SH") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)400;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)400;
                     }
                     if (str.CompareTo("ISW13F") == 0)
                     {
                         ((CriAtomConfig)component.atomConfig).androidBufferingTime      = (__Null)220;
                         ((CriAtomConfig)component.atomConfig).androidStartBufferingTime = (__Null)220;
                     }
                     DebugUtility.Log("MODEL:" + str);
                 }
                 component.Initialize();
             }
         }
         MyCriManager.sInit = true;
     }
 }
    public override void OnInspectorGUI()
    {
        CriWareInitializer initializer = target as CriWareInitializer;

        Undo.RecordObject(target, null);

        GUI.changed = false;
        {
            // FileSystem Config
            initializer.initializesFileSystem =
                EditorGUILayout.BeginToggleGroup("Initialize FileSystem", initializer.initializesFileSystem);
            EditorGUI.indentLevel += 1;
            {
                GenIntField("Number of Loaders", "The maximum number of CriFsLoader objects used at a time. " +
                            "NOTE: Count the number of CriFsLoadFileRequest objects and the total number of Streaming Voices in CRI Atom settings and the number of CriMana.Player component,",
                            ref initializer.fileSystemConfig.numberOfLoaders, 0, 128);
                GenIntField("Number of Binders", "", ref initializer.fileSystemConfig.numberOfBinders, 0, 128);
                GenIntField("Number of Installers", "", ref initializer.fileSystemConfig.numberOfInstallers, 0, 128);
                GenIntFieldWithUnit("Install Buffer Size", "[KiB]", "Internal buffer size to install data. A larger buffer size result in better performance.", ref initializer.fileSystemConfig.installBufferSize, 32, int.MaxValue);
                GenIntField("Max Length of Path", "The maximum length of path (file path or url path) that can be passed.", ref initializer.fileSystemConfig.maxPath, 64, 2048);
                GenStringField("User Agent String", "", ref initializer.fileSystemConfig.userAgentString);
                GenToggleField("Minimize FD Usage", "With this option, the plugin minimizes file descriptor usage so that applicaiton can save file descriptor resource. However, this may increase file I/O instead.", ref initializer.fileSystemConfig.minimizeFileDescriptorUsage);

                showFileSystemAndroidConfig = EditorGUILayout.Foldout(showFileSystemAndroidConfig, "Android Config");
                if (showFileSystemAndroidConfig)
                {
                    EditorGUI.indentLevel += 1;
                    {
                        /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                        if (initializer.fileSystemConfig.androidDeviceReadBitrate == 0)
                        {
                            initializer.fileSystemConfig.androidDeviceReadBitrate = CriFsConfig.defaultAndroidDeviceReadBitrate;
                        }
                    }
                    GenIntFieldWithUnit("Device Read Bitrate", "[bps]", "Expected minimum device read bitrate to be used for multi-streaming management." + CriFsConfig.defaultAndroidDeviceReadBitrate + " bps",
                                        ref initializer.fileSystemConfig.androidDeviceReadBitrate, 0, int.MaxValue);
                    EditorGUI.indentLevel -= 1;
                }
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();

            // Atom Config
            initializer.initializesAtom =
                EditorGUILayout.BeginToggleGroup("Initialize Atom", initializer.initializesAtom);
            EditorGUI.indentLevel += 1;
            {
                GenStringField("ACF File Name", "", ref initializer.atomConfig.acfFileName);
                GenIntField("Max Virtual Voices", "", ref initializer.atomConfig.maxVirtualVoices, CriAtomPlugin.GetRequiredMaxVirtualVoices(initializer.atomConfig), 1024);
                GenIntField("Max Voice Limit Groups", "", ref initializer.atomConfig.maxVoiceLimitGroups, 0, 1024);
                GenIntField("Max Parameter Blocks", "", ref initializer.atomConfig.maxParameterBlocks, 1024, 4096);
                GenIntField("Max Buses", "Maximum number of buses.", ref initializer.atomConfig.maxBuses, 1, 64);
                GenIntField("Max Categories", "Maximum number of categories.", ref initializer.atomConfig.maxCategories, 0, 1024);
                GenIntField("Categories per Playback", "Number of category references per playback.", ref initializer.atomConfig.categoriesPerPlayback, 0, 16);
                GenIntFieldWithUnit("Sampling Rate", "[Hz]",
                                    "Sound output sampling rate. "
                                    + "HCA-MX needs to set the sampling rate of HCA-MX data. "
                                    + "A value of 0 (the default value) means that the internal value will be applied.",
                                    ref initializer.atomConfig.outputSamplingRate, 0, 192000);
                GenPositiveFloatField("Server Frequency", "[Hz]", "", ref initializer.atomConfig.serverFrequency, 15.0f, 120.0f);

                int selected_output_mode = 0;
                foreach (int num_channnels in asrNumOutputChannels)
                {
                    if (num_channnels == initializer.atomConfig.asrOutputChannels)
                    {
                        break;
                    }
                    selected_output_mode++;
                }
                selected_output_mode = EditorGUILayout.Popup("ASR Output Mode", selected_output_mode, asrOutputModes);
                initializer.atomConfig.asrOutputChannels = asrNumOutputChannels[selected_output_mode];

                GenToggleField("Uses Time For Seed", "", ref initializer.atomConfig.useRandomSeedWithTime);
                GenToggleField("Uses In Game Preview", "", ref initializer.atomConfig.usesInGamePreview);
                GenToggleField("VR Mode", "", ref initializer.atomConfig.vrMode);


                showAtomStandardVoicePoolConfig = EditorGUILayout.Foldout(showAtomStandardVoicePoolConfig, "Standard Voice Pool Config");
                if (showAtomStandardVoicePoolConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Memory Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.memoryVoices, 0, 1024);
                    GenIntField("Streaming Voices", "", ref initializer.atomConfig.standardVoicePoolConfig.streamingVoices, 0, 1024);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomHcaMxVoicePoolConfig = EditorGUILayout.Foldout(showAtomHcaMxVoicePoolConfig, "HCA-MX Voice Pool Config");
                if (showAtomHcaMxVoicePoolConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntField("Memory Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.memoryVoices, 0, 1024);
                    GenIntField("Streaming Voices", "", ref initializer.atomConfig.hcaMxVoicePoolConfig.streamingVoices, 0, 1024);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomPCConfig = EditorGUILayout.Foldout(showAtomPCConfig, "PC Config");
                if (showAtomPCConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.pcBufferingTime, 0, 2000);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomIOSConfig = EditorGUILayout.Foldout(showAtomIOSConfig, "iOS Config");
                if (showAtomIOSConfig)
                {
                    EditorGUI.indentLevel += 1;
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.iosBufferingTime, 16, 200);
                    GenToggleField("Override iPod Music", "", ref initializer.atomConfig.iosOverrideIPodMusic);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomAndroidConfig = EditorGUILayout.Foldout(showAtomAndroidConfig, "Android Config");
                if (showAtomAndroidConfig)
                {
                    EditorGUI.indentLevel += 1;
                    {
                        /* Ver.2.03.03 以前は 0 がデフォルト値だったことの互換性維持のための処理 */
                        if (initializer.atomConfig.androidBufferingTime == 0)
                        {
                            initializer.atomConfig.androidBufferingTime = (int)(4 * 1000.0 / initializer.atomConfig.serverFrequency);
                        }
                        if (initializer.atomConfig.androidStartBufferingTime == 0)
                        {
                            initializer.atomConfig.androidStartBufferingTime = (int)(3 * 1000.0 / initializer.atomConfig.serverFrequency);
                        }
                    }
                    GenIntFieldWithUnit("Buffering Time", "[msec]", "Sound buffering time in msec.", ref initializer.atomConfig.androidBufferingTime, 50, 500);
                    GenIntFieldWithUnit("Start Buffering", "[msec]", "Sound buffering time to start playing. This value will be applied when using the low latency voice pool.", ref initializer.atomConfig.androidStartBufferingTime, 50, 500);
                    showAtomAndroidVoicePoolConfig = EditorGUILayout.Foldout(showAtomAndroidVoicePoolConfig, "Low Latency Standard Voice Pool Config");
                    if (showAtomAndroidVoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Memory Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.memoryVoices, 0, 32);
                        GenIntField("Streaming Voices", "", ref initializer.atomConfig.androidLowLatencyStandardVoicePoolConfig.streamingVoices, 0, 32);
                        EditorGUI.indentLevel -= 1;
                    }
                    /* Android OS の Fast Mixer を使用して、音声再生時の発音遅延を短縮します。ASR/NSR の発音遅延や、遅延推測機能の結果に影響します */
                    GenToggleField("Uses Android Fast Mixer", "", ref initializer.atomConfig.androidUsesAndroidFastMixer);
                    EditorGUI.indentLevel -= 1;
                }

                showAtomVitaConfig = EditorGUILayout.Foldout(showAtomVitaConfig, "PS Vita Config");
                if (showAtomVitaConfig)
                {
                    EditorGUI.indentLevel            += 1;
                    showAtomVitaAtrac9VoicePoolConfig = EditorGUILayout.Foldout(showAtomVitaAtrac9VoicePoolConfig, "ATRAC9 Voice Pool Config");
                    if (showAtomVitaAtrac9VoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Memory Voices", "", ref initializer.atomConfig.vitaAtrac9VoicePoolConfig.memoryVoices, 0, 32);
                        GenIntField("Streaming Voices", "", ref initializer.atomConfig.vitaAtrac9VoicePoolConfig.streamingVoices, 0, 32);
                        EditorGUI.indentLevel -= 1;
                    }
                    EditorGUI.indentLevel -= 1;
                }

                showAtomPs4Config = EditorGUILayout.Foldout(showAtomPs4Config, "PS4 Config");
                if (showAtomPs4Config)
                {
                    EditorGUI.indentLevel           += 1;
                    showAtomPs4Atrac9VoicePoolConfig = EditorGUILayout.Foldout(showAtomPs4Atrac9VoicePoolConfig, "ATRAC9 Voice Pool Config");
                    if (showAtomPs4Atrac9VoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Memory Voices", "", ref initializer.atomConfig.ps4Atrac9VoicePoolConfig.memoryVoices, 0, 256);
                        GenIntField("Streaming Voices", "", ref initializer.atomConfig.ps4Atrac9VoicePoolConfig.streamingVoices, 0, 256);
                        EditorGUI.indentLevel -= 1;
                    }
                    EditorGUI.indentLevel -= 1;

                    initializer.atomConfig.ps4Audio3dConfig.useAudio3D =
                        EditorGUILayout.BeginToggleGroup("Object-Based Audio", initializer.atomConfig.ps4Audio3dConfig.useAudio3D);
                    EditorGUI.indentLevel            += 2;
                    showAtomPs4Audio3dVoicePoolConfig = EditorGUILayout.Foldout(showAtomPs4Audio3dVoicePoolConfig, "Audio 3D Voice Pool Config");
                    if (showAtomPs4Audio3dVoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Memory Voices", "", ref initializer.atomConfig.ps4Audio3dConfig.voicePoolConfig.memoryVoices, 0, 256);
                        GenIntField("Streaming Voices", "", ref initializer.atomConfig.ps4Audio3dConfig.voicePoolConfig.streamingVoices, 0, 256);
                        EditorGUI.indentLevel -= 1;
                    }
                    EditorGUI.indentLevel -= 2;
                    EditorGUILayout.EndToggleGroup();
                }

                showAtomWebGLConfig = EditorGUILayout.Foldout(showAtomWebGLConfig, "WebGL Config");
                if (showAtomWebGLConfig)
                {
                    EditorGUI.indentLevel += 1;
                    showAtomWebGLWebAudioVoicePoolConfig = EditorGUILayout.Foldout(showAtomWebGLWebAudioVoicePoolConfig, "WebAudio Voice Pool Config");
                    if (showAtomWebGLWebAudioVoicePoolConfig)
                    {
                        EditorGUI.indentLevel += 1;
                        GenIntField("Voices", "", ref initializer.atomConfig.webglWebAudioVoicePoolConfig.voices, 0, 32);
                        EditorGUI.indentLevel -= 1;
                    }
                    EditorGUI.indentLevel -= 1;
                }
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();

            // Mana Config
            initializer.initializesMana =
                EditorGUILayout.BeginToggleGroup("Initialize Mana", initializer.initializesMana);
            EditorGUI.indentLevel += 1;
            {
                GenIntField("Number Of Decoders", "The maximum number of CriMana.Player component at a time. NOTE: Count as 2 when playing a movie with alpha channel.",
                            ref initializer.manaConfig.numberOfDecoders, 0, 128);
                GenIntField("Number Of Max Entries", "", ref initializer.manaConfig.numberOfMaxEntries, 0, 1024);

                showManaVitaConfig = EditorGUILayout.Foldout(showManaVitaConfig, "PS Vita Config");
                if (showManaVitaConfig)
                {
                    EditorGUI.indentLevel += 1;
                    {
                        initializer.manaConfig.vitaH264PlaybackConfig.useH264Playback =
                            EditorGUILayout.BeginToggleGroup("H.264 Playback", initializer.manaConfig.vitaH264PlaybackConfig.useH264Playback);
                        EditorGUI.indentLevel += 1;
                        {
                            GenIntField("Max Width", "", ref initializer.manaConfig.vitaH264PlaybackConfig.maxWidth, 64, 1280);
                            GenIntField("Max Height", "", ref initializer.manaConfig.vitaH264PlaybackConfig.maxHeight, 64, 720);
                            GenToggleField("Get Memory From CDRAM",
                                           "Let Mana H264 decoder use VRAM.\n" +
                                           "This significantly boost decoding and drawing of movie textures. " +
                                           "But It may takes longer to prepare the player depending movie size."
                                           , ref initializer.manaConfig.vitaH264PlaybackConfig.getMemoryFromTexture);
                        }
                        EditorGUI.indentLevel -= 1;
                        EditorGUILayout.EndToggleGroup();
                    }
                    EditorGUI.indentLevel -= 1;
                }
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();

            // Decrypter Config
            initializer.useDecrypter =
                EditorGUILayout.BeginToggleGroup("Decrypter Settings", initializer.useDecrypter);
            EditorGUI.indentLevel += 1;
            {
                initializer.decrypterConfig.key =
                    EditorGUILayout.TextField("Key Value", initializer.decrypterConfig.key);
                GenStringField("Auth File Name", "", ref initializer.decrypterConfig.authenticationFile);
                GenToggleField("Enable Atom Decryption", "", ref initializer.decrypterConfig.enableAtomDecryption);
                GenToggleField("Enable Mana Decryption", "", ref initializer.decrypterConfig.enableManaDecryption);
            }
            EditorGUI.indentLevel -= 1;
            EditorGUILayout.EndToggleGroup();

            GenToggleField("Dont Initialize On Awake", "", ref initializer.dontInitializeOnAwake);
            GenToggleField("Dont Destroy On Load", "", ref initializer.dontDestroyOnLoad);
        }
        if (GUI.changed)
        {
            EditorUtility.SetDirty(initializer);
        }
    }