/// <summary> /// アプリケーションの起動処理を行う。 /// </summary> protected override void OnLoad(EventArgs e) { // ※ このメソッドは GUI スレッドで実行されるので、後回しにできる初期化処理は進行描画タスクに回して、 // なるべく早くこのメソッドを抜けること。 Log.Header("アプリケーション起動"); using var _ = new LogBlock(Log.現在のメソッド名); // フォームを設定する。 this.Text = $"DTXMania2 Release {int.Parse( Application.ProductVersion.Split( '.' ).ElementAt( 0 ) ):000}"; this.ClientSize = new Size(1024, 576); this.Icon = Properties.Resources.DTXMania2; this.ScreenMode = new ScreenMode(this); Global.App = this; Global.Handle = this.Handle; // サウンドデバイスとサウンドタイマを初期化する。これらは入力デバイスで使用されるので先に初期化する。 this.サウンドデバイス = new SoundDevice(CSCore.CoreAudioAPI.AudioClientShareMode.Shared); // マスタ音量(小:0~1:大)... 0.5を超えるとだいたいWASAPI共有モードのリミッターに抑制されるようになる // ※サウンドデバイスの音量プロパティはコンストラクタの実行後でないと set できないので、初期化子にはしないこと。(した場合の挙動は不安定) this.サウンドデバイス.音量 = 0.5f; this.サウンドタイマ = new SoundTimer(this.サウンドデバイス); // 入力デバイスを初期化する。これらは GUI スレッドで行う必要がある。 this.KeyboardHID = new KeyboardHID(this.サウンドタイマ); this.GameControllersHID = new GameControllersHID(this.Handle, this.サウンドタイマ); this.MidiIns = new MidiIns(this.サウンドタイマ); // システム設定ファイルを読み込む。 SystemConfig.最新版にバージョンアップする(); this.システム設定 = SystemConfig.読み込む(); this._システム設定をもとにリソース関連のフォルダ変数を更新する(); // メインループを別スレッドで開始する。 if (!this._進行描画タスクを起動する().WaitOne(5000)) { throw new TimeoutException("進行描画タスクの起動処理がタイムアウトしました。"); } // 初期化完了。(進行描画タスクの起動後に) this._未初期化 = false; // 全画面モードが設定されているならここで全画面に切り替える。 if (this.システム設定.全画面モードである) { this.ScreenMode.ToFullscreenMode(); } base.OnLoad(e); }
public static void 最新版にバージョンアップする() { using var _ = new LogBlock(Log.現在のメソッド名); var path = new VariablePath(@"$(AppData)\Configuration.yaml"); int version = 0; if (!File.Exists(path.数なしパス)) { return; } #region " YAML階層のルートノード 'Version' を検索し、バージョン値を取得する。" //---------------- { var yamlText = File.ReadAllText(path.数なしパス); var yamlStream = new YamlStream(); yamlStream.Load(new StringReader(yamlText)); var rootMapping = (YamlMappingNode)yamlStream.Documents[0].RootNode; var versionNode = new YamlScalarNode("Version"); if (rootMapping.Children.ContainsKey(versionNode)) { var versionValue = rootMapping.Children[versionNode] as YamlScalarNode; version = int.Parse(versionValue?.Value ?? "1"); // 取得 } } //---------------- #endregion while (version < SystemConfig.VERSION) { switch (version) { case 1: { break; // 存在しない } case 2: { #region " 2 → 3 " //---------------- var v2 = old.SystemConfig.v002_システム設定.読み込む(path); var v3 = new old.SystemConfig.v003_システム設定(v2); v3.保存する(path); version = v3.Version; break; //---------------- #endregion } case 3: { #region " 3 → 4 " //---------------- var v3 = old.SystemConfig.v003_システム設定.読み込む(path); var v4 = new old.SystemConfig.v004_SystemConfig(v3); v4.保存する(); version = v4.Version; break; //---------------- #endregion } case 4: { #region " 4 → 5 " //---------------- var v4 = old.SystemConfig.v004_SystemConfig.読み込む(path); var v5 = new old.SystemConfig.v005_SystemConfig(v4); v5.保存する(); version = v5.Version; break; //---------------- #endregion } case 5: { #region " 5 → 6 " //---------------- var v5 = old.SystemConfig.v005_SystemConfig.読み込む(path); var v6 = new old.SystemConfig.v006_SystemConfig(v5); v6.保存する(); version = v6.Version; break; //---------------- #endregion } case 6: { #region " 6 → 最新版 " //---------------- var v6 = old.SystemConfig.v006_SystemConfig.読み込む(path); var v7 = new SystemConfig(v6); v7.保存する(); version = v7.Version; break; //---------------- #endregion } } } }
// 生成と終了 public ドラム入力(SystemConfig config, KeyboardHID keyboard, GameControllersHID gameControllers, MidiIns midiIns, int 最大入力履歴数 = 32) { using var _ = new LogBlock(Log.現在のメソッド名); this._Config = new WeakReference <SystemConfig>(config); this.Keybaord = new WeakReference <KeyboardHID>(keyboard); this.GameControllers = new WeakReference <GameControllersHID>(gameControllers); this.MidiIn = new WeakReference <MidiIns>(midiIns); this._最大入力履歴数 = 最大入力履歴数; this.ポーリング結果 = new List <ドラム入力イベント>(); this._入力履歴 = new List <ドラム入力イベント>(this._最大入力履歴数); // MIDI入力デバイスの可変IDへの対応を行う。 if (0 < midiIns.DeviceName.Count) { var デバイスリスト = new Dictionary <int, string>(); // <デバイスID, デバイス名> #region " (1) 先に列挙された実際のデバイスに合わせて、デバイスリスト(配列番号がデバイス番号)を作成する。" //---------------- for (int i = 0; i < midiIns.DeviceName.Count; i++) { デバイスリスト.Add(i, midiIns.DeviceName[i]); } //---------------- #endregion #region " (2) キーバインディングのデバイスリストとマージして、新しいデバイスリストを作成する。" //---------------- foreach (var kvp in config.MIDIデバイス番号toデバイス名) { var キーバインディング側のデバイス名 = kvp.Value; if (デバイスリスト.ContainsValue(キーバインディング側のデバイス名)) { // (A) 今回も存在しているデバイスなら、何もしない。 } else { // (B) 今回は存在していないデバイスなら、末尾(=未使用ID)に登録する。 デバイスリスト.Add(デバイスリスト.Count, キーバインディング側のデバイス名); } } //---------------- #endregion #region " (3) キーバインディングのデバイスから新しいデバイスへ、キーのIDを付け直す。" //---------------- var 中間バッファ = new Dictionary <SystemConfig.IdKey, ドラム入力種別>(); foreach (var kvp in config.MIDItoドラム) { var キーのデバイスID = kvp.Key.deviceId; // キーバインディングのデバイス番号 から、デバイスリストのデバイス番号 へ付け替える。 if (config.MIDIデバイス番号toデバイス名.TryGetValue(キーのデバイスID, out string?キーのデバイス名)) { キーのデバイスID = デバイスリスト.First((kvp2) => (kvp2.Value == キーのデバイス名)).Key; // マージしたので、必ず存在する。 } 中間バッファ.Add(new SystemConfig.IdKey(キーのデバイスID, kvp.Key.key), kvp.Value); // デバイスID以外は変更なし。 } config.MIDItoドラム.Clear(); for (int i = 0; i < 中間バッファ.Count; i++) { var kvp = 中間バッファ.ElementAt(i); config.MIDItoドラム.Add(new SystemConfig.IdKey(kvp.Key.deviceId, kvp.Key.key), kvp.Value); } //---------------- #endregion #region " (4) 新しいデバイスリストをキーバインディングに格納して、保存する。" //---------------- config.MIDIデバイス番号toデバイス名.Clear(); for (int i = 0; i < デバイスリスト.Count; i++) { config.MIDIデバイス番号toデバイス名.Add(i, デバイスリスト[i]); } config.保存する(); //---------------- #endregion } else { // 列挙されたMIDI入力デバイスがまったくないなら、キーバインディングは何もいじらない。 } }