From 6a7489c062a5e0161b5e396df40feabbd2ddd17d Mon Sep 17 00:00:00 2001 From: coreizer Date: Fri, 21 Jun 2024 23:52:54 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Auditore.Library/AuditoreRefObject.cs | 368 +++++++------- src/Auditore.Library/Constants.cs | 46 +- src/Auditore.Plugin/Main.cs | 185 ++++--- .../Settings/AuditoreSettings.cs | 30 +- .../Settings/PluginFormData.cs | 39 +- src/Auditore.Remoting/AuditoreClient.cs | 456 +++++++++--------- src/Auditore.Remoting/IAuditore.cs | 182 +++---- src/Auditore.Test/Program.cs | 25 +- src/Auditore.Test/frmMain.cs | 157 +++--- 9 files changed, 709 insertions(+), 779 deletions(-) diff --git a/src/Auditore.Library/AuditoreRefObject.cs b/src/Auditore.Library/AuditoreRefObject.cs index e5350e4..4d536d3 100644 --- a/src/Auditore.Library/AuditoreRefObject.cs +++ b/src/Auditore.Library/AuditoreRefObject.cs @@ -19,212 +19,168 @@ #endregion +using System; +using System.Diagnostics; +using FNF.BouyomiChanApp; +using FNF.Utility; + namespace Auditore.Library { - using System; - using System.Diagnostics; - using FNF.BouyomiChanApp; - using FNF.Utility; - - public sealed class AuditoreRefObject : MarshalByRefObject - { - #region フィールド - - private const int DEFAULT_SPEED = 100; - private const int MAX_SPEED = 200; - private const int MIN_SPEED = 50; - - private const int DEFAULT_VOLUME = 50; - private const int MAX_VOLUME = 100; - private const int MIN_VOLUME = 0; - - private const int DEFAULT_PITCH = 100; - private const int MAX_PITCH = 200; - private const int MIN_PITCH = 50; - - #endregion フィールド - - #region プロパティ - - /// - /// 現在実行されているかどうかを取得します。 - /// - public bool NowPlaying => Pub.NowPlaying; - - /// - /// 現在実行されているタスクのテキストテキストメッセージを取得します。 - /// - public string Source => Pub.FormMain.textBoxSource.Text; - - /// - /// タスクが保留されているかどうかを設定または取得します。 - /// - public bool Pause { - get => Pub.Pause; - - set => Pub.Pause = value; - } - - /// - /// 現在のタスクID取得します。 - /// - public int CurrentTaskId => Pub.NowTaskId; - - /// - /// 現在のタスク数を取得します。 - /// - public int TaskCount => Pub.TalkTaskCount; - - /// - /// 話速を設定または取得します。 - /// - public int TalkSpeed { - get => Pub.FormMain.trackBarSpeed.Value; - - set { - if (MIN_SPEED <= value && value <= MAX_SPEED) { - Pub.FormMain.trackBarSpeed.Value = value; - } - else { - Pub.FormMain.trackBarSpeed.Value = DEFAULT_SPEED; - } - } - } - - /// - /// 音量を設定または取得します。 - /// - public int Volume { - get => Pub.FormMain.trackBarVolume.Value; - - set { - if (MIN_VOLUME <= value && value <= MAX_VOLUME) { - Pub.FormMain.trackBarVolume.Value = value; - return; - } - else { - Pub.FormMain.trackBarVolume.Value = DEFAULT_VOLUME; - } - } - } - - /// - /// トーンを設定または取得します。 - /// - public int Pitch { - get => Pub.FormMain.trackBarTone.Value; - - set { - if (MIN_PITCH <= value && value <= MAX_PITCH) { - Pub.FormMain.trackBarTone.Value = value; - return; - } - else { - - Pub.FormMain.trackBarTone.Value = DEFAULT_PITCH; - } - } - } - - /// - /// このライブラリのバージョンを取得します。 - /// - public string Version => Constants.VersionString; - - #endregion プロパティ - - /// - /// タスクにテキストテキストメッセージを追加します。 - /// - /// テキストテキストテキストメッセージ - /// このタスクのIDが返されます。 - public int PushText(string text) - { - return this.CorePushText(text, this.TalkSpeed, this.Volume, VoiceType.Default); - } - - /// - /// タスクにテキストテキストメッセージを追加します。 - /// - /// テキストテキストメッセージ - /// 話速設定 - /// このタスクのIDが返されます - public int PushText(string text, int talkSpeed) - { - return this.CorePushText(text, talkSpeed, this.Volume, VoiceType.Default); - } - - /// - /// タスクにテキストテキストメッセージを追加します。 - /// - /// テキストテキストメッセージ - /// 話速設定 - /// 音量 - /// このタスクのIDが返されます - public int PushText(string text, int talkSpeed, int volume) - { - return this.CorePushText(text, talkSpeed, volume, VoiceType.Default); - } - - // TODO: Hello world - /// - /// タスクにテキストテキストメッセージを追加します。 - /// - /// テキストテキストメッセージ - /// 話速設定 - /// 音量 - /// ボイスタイプ - /// このタスクのIDが返されます - public int PushText(string text, int talkSpeed, int volume, VoiceType voiceType) - { - return this.CorePushText(text, talkSpeed, volume, voiceType); - } - - private int CorePushText(string text, int talkSpeed, int volume, VoiceType voiceType) - { - try { - return Pub.AddTalkTask(text, talkSpeed, volume, voiceType); - } - catch (Exception ex) { - Trace.WriteLine(ex.Message); - return -1; - } - } - - /// - /// 予約されているタスクをすべて削除します。 - /// - public void ClearAll() - { - try { - Pub.ClearTalkTasks(); - } - catch (Exception ex) { - Trace.WriteLine(ex.Message); - } - } - - /// - /// 現在進行中のタスクをスキップします。 - /// - public void Skip() - { - try { - Pub.SkipTalkTask(); - } - catch (Exception ex) { - Trace.WriteLine(ex.Message); - } - } - - /// - /// 有効期間ポリシーを制御する有効期間サービスオブジェクトの期間を無期限に設定するために、オーバーライドしています。 - /// - /// null - [System.Security.SecurityCritical] - public override object InitializeLifetimeService() - { - return null; - } - } + public sealed class AuditoreRefObject : MarshalByRefObject + { + #region フィールド + + private const int DEFAULT_SPEED = 100; + private const int MAX_SPEED = 200; + private const int MIN_SPEED = 50; + + private const int DEFAULT_VOLUME = 50; + private const int MAX_VOLUME = 100; + private const int MIN_VOLUME = 0; + + private const int DEFAULT_PITCH = 100; + private const int MAX_PITCH = 200; + private const int MIN_PITCH = 50; + + #endregion フィールド + + #region プロパティ + + /// + /// 現在実行されているかどうかを取得します。 + /// + public bool NowPlaying => Pub.NowPlaying; + + /// + /// 現在実行されているタスクのテキストテキストメッセージを取得します。 + /// + public string Source => Pub.FormMain.textBoxSource.Text; + + /// + /// タスクが保留されているかどうかを設定または取得します。 + /// + public bool Pause { + get => Pub.Pause; + set => Pub.Pause = value; + } + + /// + /// 現在のタスクID取得します。 + /// + public int CurrentTaskId => Pub.NowTaskId; + + /// + /// 現在のタスク数を取得します。 + /// + public int TaskCount => Pub.TalkTaskCount; + + /// + /// 話速を設定または取得します。 + /// + public int TalkSpeed { + get => Pub.FormMain.trackBarSpeed.Value; + set => Pub.FormMain.trackBarSpeed.Value = (MIN_SPEED <= value && value <= MAX_SPEED) ? value : DEFAULT_SPEED; + } + + /// + /// 音量を設定または取得します。 + /// + public int Volume { + get => Pub.FormMain.trackBarVolume.Value; + set => Pub.FormMain.trackBarVolume.Value = (MIN_VOLUME <= value && value <= MAX_VOLUME) ? value : DEFAULT_VOLUME; + } + + /// + /// トーンを設定または取得します。 + /// + public int Pitch { + get => Pub.FormMain.trackBarTone.Value; + set => Pub.FormMain.trackBarTone.Value = (MIN_PITCH <= value && value <= MAX_PITCH) ? value : DEFAULT_PITCH; + } + + /// + /// このライブラリのバージョンを取得します。 + /// + public string Version => Constants.VersionString; + + #endregion プロパティ + + /// + /// タスクにテキストテキストメッセージを追加します。 + /// + /// テキストテキストテキストメッセージ + /// このタスクのIDが返されます。 + public int PushText(string text) => this.CorePushText(text, this.TalkSpeed, this.Volume, VoiceType.Default); + + /// + /// タスクにテキストテキストメッセージを追加します。 + /// + /// テキストテキストメッセージ + /// 話速設定 + /// このタスクのIDが返されます + public int PushText(string text, int talkSpeed) => this.CorePushText(text, talkSpeed, this.Volume, VoiceType.Default); + + /// + /// タスクにテキストテキストメッセージを追加します。 + /// + /// テキストテキストメッセージ + /// 話速設定 + /// 音量 + /// このタスクのIDが返されます + public int PushText(string text, int talkSpeed, int volume) => this.CorePushText(text, talkSpeed, volume, VoiceType.Default); + + // TODO: Hello world + /// + /// タスクにテキストテキストメッセージを追加します。 + /// + /// テキストテキストメッセージ + /// 話速設定 + /// 音量 + /// ボイスタイプ + /// このタスクのIDが返されます + public int PushText(string text, int talkSpeed, int volume, VoiceType voiceType) => this.CorePushText(text, talkSpeed, volume, voiceType); + + private int CorePushText(string text, int talkSpeed, int volume, VoiceType voiceType) { + try { + return Pub.AddTalkTask(text, talkSpeed, volume, voiceType); + } + catch (Exception ex) { + Trace.WriteLine(ex.Message); + return -1; + } + } + + /// + /// 予約されているタスクをすべて削除します。 + /// + public void ClearAll() { + try { + Pub.ClearTalkTasks(); + } + catch (Exception ex) { + Trace.WriteLine(ex.Message); + } + } + + /// + /// 現在進行中のタスクをスキップします。 + /// + public void Skip() { + try { + Pub.SkipTalkTask(); + } + catch (Exception ex) { + Trace.WriteLine(ex.Message); + } + } + + /// + /// 有効期間ポリシーを制御する有効期間サービスオブジェクトの期間を無期限に設定するために、オーバーライドしています。 + /// + /// null + [System.Security.SecurityCritical] + public override object InitializeLifetimeService() { + return null; + } + } } diff --git a/src/Auditore.Library/Constants.cs b/src/Auditore.Library/Constants.cs index 2e62b99..e389aee 100644 --- a/src/Auditore.Library/Constants.cs +++ b/src/Auditore.Library/Constants.cs @@ -21,31 +21,31 @@ namespace Auditore.Library { - public static class Constants - { - /// - /// プラグインバージョンが定義されています。 - /// - public const string VersionString = "1.5"; + public static class Constants + { + /// + /// プラグインバージョンが定義されています。 + /// + public const string VersionString = "1.5"; - /// - /// チャンネル名が定義されています。 - /// - public const string ChannelName = "message"; + /// + /// チャンネル名が定義されています。 + /// + public const string ChannelName = "message"; - /// - /// チャンネルオブジェクトUriが定義されています。 - /// - public const string PortName = "auditore"; + /// + /// チャンネルオブジェクトUriが定義されています。 + /// + public const string PortName = "auditore"; - /// - /// チャンネルIPCが定義されています。 - /// - public const string IPC = "ipc://auditore/message"; + /// + /// チャンネルIPCが定義されています。 + /// + public const string IPC = "ipc://auditore/message"; - /// - /// プラグイン設定パスが定義されています。 - /// - public const string Settings = "auditore.setting"; - } + /// + /// プラグイン設定パスが定義されています。 + /// + public const string Settings = "auditore.setting"; + } } diff --git a/src/Auditore.Plugin/Main.cs b/src/Auditore.Plugin/Main.cs index e5f345c..3ba65fa 100644 --- a/src/Auditore.Plugin/Main.cs +++ b/src/Auditore.Plugin/Main.cs @@ -19,99 +19,98 @@ #endregion +using System; +using System.Collections; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting.Channels.Ipc; +using System.Security.Principal; +using Auditore.Library; +using Auditore.Plugin.Settings; +using FNF.BouyomiChanApp; +using FNF.XmlSerializerSetting; + namespace Auditore.Plugin { - using System; - using System.Collections; - using System.Runtime.Remoting; - using System.Runtime.Remoting.Channels; - using System.Runtime.Remoting.Channels.Ipc; - using System.Security.Principal; - using Auditore.Library; - using Auditore.Plugin.Settings; - using FNF.BouyomiChanApp; - using FNF.XmlSerializerSetting; - - public class Main : IPlugin - { - #region フィールド - - private IpcServerChannel serverChannel; - - private PluginSettings settings; - private PluginFormData settingFormData; - - #endregion フィールド - - #region プロパティ - - /// - /// プラグイン名を取得します。 - /// - public string Name => "auditore"; - - /// - /// プラグインバージョンを取得します。 - /// - public string Version => Constants.VersionString; - - /// - /// プラグイン説明を取得します。 - /// - public string Caption => "auditore remoting"; - - /// - /// このプラグインのフォームデータを取得します。 - /// - public ISettingFormData SettingFormData => this.settingFormData; - - #endregion プロパティ - - /// - /// プラグインの初期処理を実行します。 - /// - public void Begin() - { - try { - IDictionary properties = new Hashtable { - ["name"] = "", - ["portName"] = Constants.PortName, - ["tokenImpersonationLevel"] = TokenImpersonationLevel.Impersonation, - ["impersonation"] = true, - ["secure"] = true - }; - - // IPC チャンネルを作成。 - this.serverChannel = new IpcServerChannel(properties, null); - - // リモートオブジェクトを登録。 - ChannelServices.RegisterChannel(this.serverChannel, true); - - // サーバー側でアクティブ化される型オブジェクト (単一の呼び出しまたはシングルトン) としてサービス エンドに登録されたオブジェクト型の値を保持します。 - var wkste = new WellKnownServiceTypeEntry( - typeof(AuditoreRefObject), - Constants.ChannelName, - WellKnownObjectMode.Singleton - ); - - // 既知の型 (単一の呼び出しまたはシングルトン) として、サービス エンドでオブジェクト Type を登録します。 - RemotingConfiguration.RegisterWellKnownServiceType(wkste); - } - catch (Exception ex) { - System.Windows.Forms.MessageBox.Show($"チャンネルの登録に失敗しました: {ex.Message}", "プラグイン エラー", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); - } - - // プラグイン設定を初期化します。 - this.settings = new PluginSettings(this); - this.settings.Load(Constants.Settings); - - // フォームデータを初期化します。 - this.settingFormData = new PluginFormData(this.settings); - } - - /// - /// プラグインの終了処理を実行します。 - /// - public void End() => ChannelServices.UnregisterChannel(this.serverChannel); - } + public class Main : IPlugin + { + #region フィールド + + private IpcServerChannel serverChannel; + + private PluginSettings settings; + private PluginFormData settingFormData; + + #endregion フィールド + + #region プロパティ + + /// + /// プラグイン名を取得します。 + /// + public string Name => "auditore"; + + /// + /// プラグインバージョンを取得します。 + /// + public string Version => Constants.VersionString; + + /// + /// プラグイン説明を取得します。 + /// + public string Caption => "auditore remoting"; + + /// + /// このプラグインのフォームデータを取得します。 + /// + public ISettingFormData SettingFormData => this.settingFormData; + + #endregion プロパティ + + /// + /// プラグインの初期処理を実行します。 + /// + public void Begin() { + try { + IDictionary properties = new Hashtable { + ["name"] = "", + ["portName"] = Constants.PortName, + ["tokenImpersonationLevel"] = TokenImpersonationLevel.Impersonation, + ["impersonation"] = true, + ["secure"] = true + }; + + // IPC チャンネルを作成。 + this.serverChannel = new IpcServerChannel(properties, null); + + // リモートオブジェクトを登録。 + ChannelServices.RegisterChannel(this.serverChannel, true); + + // サーバー側でアクティブ化される型オブジェクト (単一の呼び出しまたはシングルトン) としてサービス エンドに登録されたオブジェクト型の値を保持します。 + var wkste = new WellKnownServiceTypeEntry( + typeof(AuditoreRefObject), + Constants.ChannelName, + WellKnownObjectMode.Singleton + ); + + // 既知の型 (単一の呼び出しまたはシングルトン) として、サービス エンドでオブジェクト Type を登録します。 + RemotingConfiguration.RegisterWellKnownServiceType(wkste); + } + catch (Exception ex) { + System.Windows.Forms.MessageBox.Show($"チャンネルの登録に失敗しました: {ex.Message}", "プラグイン エラー", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); + } + + // プラグイン設定を初期化します。 + this.settings = new PluginSettings(this); + this.settings.Load(Constants.Settings); + + // フォームデータを初期化します。 + this.settingFormData = new PluginFormData(this.settings); + } + + /// + /// プラグインの終了処理を実行します。 + /// + public void End() => ChannelServices.UnregisterChannel(this.serverChannel); + } } diff --git a/src/Auditore.Plugin/Settings/AuditoreSettings.cs b/src/Auditore.Plugin/Settings/AuditoreSettings.cs index 6e88d73..dbdeed9 100644 --- a/src/Auditore.Plugin/Settings/AuditoreSettings.cs +++ b/src/Auditore.Plugin/Settings/AuditoreSettings.cs @@ -19,30 +19,24 @@ #endregion +using FNF.XmlSerializerSetting; + namespace Auditore.Plugin.Settings { - using FNF.XmlSerializerSetting; - - public class PluginSettings : SettingsBase - { - protected readonly Main plugin; + public class PluginSettings : SettingsBase + { + protected readonly Main plugin; - public virtual PropertieModel Properties { - get; set; - } = new PropertieModel(); + public virtual PropertieModel Properties { get; set; } = new PropertieModel(); - public class PropertieModel - { - } + public class PropertieModel{} - public PluginSettings() - { - } + public PluginSettings() { } - public PluginSettings(Main plugin) => this.plugin = plugin; + public PluginSettings(Main plugin) => this.plugin = plugin; - public override void ReadSettings() => base.ReadSettings(); + public override void ReadSettings() => base.ReadSettings(); - public override void WriteSettings() => base.WriteSettings(); - } + public override void WriteSettings() => base.WriteSettings(); + } } diff --git a/src/Auditore.Plugin/Settings/PluginFormData.cs b/src/Auditore.Plugin/Settings/PluginFormData.cs index 3a484f6..3add173 100644 --- a/src/Auditore.Plugin/Settings/PluginFormData.cs +++ b/src/Auditore.Plugin/Settings/PluginFormData.cs @@ -19,34 +19,35 @@ #endregion +using FNF.XmlSerializerSetting; + namespace Auditore.Plugin.Settings { - using FNF.XmlSerializerSetting; - public class PluginFormData : ISettingFormData - { - #region フィールド + public class PluginFormData : ISettingFormData + { + #region フィールド - private readonly PluginSettings settings; + private readonly PluginSettings settings; - #endregion + #endregion - #region プロパティ + #region プロパティ - /// - /// プラグインのタイトルを設定します - /// - public string Title => "Auditore プラグイン"; + /// + /// プラグインのタイトルを設定します + /// + public string Title => "Auditore プラグイン"; - public bool ExpandAll => false; + public bool ExpandAll => false; - /// - /// プラグインの設定を取得します - /// - public SettingsBase Setting => this.settings; + /// + /// プラグインの設定を取得します + /// + public SettingsBase Setting => this.settings; - #endregion + #endregion - public PluginFormData(PluginSettings settings) => this.settings = settings; - } + public PluginFormData(PluginSettings settings) => this.settings = settings; + } } diff --git a/src/Auditore.Remoting/AuditoreClient.cs b/src/Auditore.Remoting/AuditoreClient.cs index bb7f0c2..a91cc25 100644 --- a/src/Auditore.Remoting/AuditoreClient.cs +++ b/src/Auditore.Remoting/AuditoreClient.cs @@ -19,245 +19,235 @@ #endregion +using System; +using System.Diagnostics; +using System.Linq; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting.Channels.Ipc; +using Auditore.Library; + namespace Auditore.Remoting { - using System; - using System.Diagnostics; - using System.Linq; - using System.Runtime.Remoting; - using System.Runtime.Remoting.Channels; - using System.Runtime.Remoting.Channels.Ipc; - - using Auditore.Library; - - public class AuditoreClient : IAuditoreClient, IDisposable - { - #region フィールド - - private readonly AuditoreRefObject auditoreObject; - private readonly IpcClientChannel clientChannel; - - private bool disposedValue = false; - - private int _last_Volume; - - #endregion - - #region プロパティ - - /// - /// 棒読みちゃんのプロセスが起動およびプラグインが読み込まれているかどうかを確認します。 - /// - public bool IsBouyomiChan => this.IsProcessRunning(); - - /// - /// ミュート状態かどうかを取得します。 - /// - public bool IsMuted => (this.IsBouyomiChan && this.Volume <= 0); - - /// - /// タスクが保留されているかどうかを設定または取得します。 - /// - public bool Pause { - get => !this.IsBouyomiChan && this.auditoreObject.Pause; - set { - if (!this.IsBouyomiChan) return; - this.auditoreObject.Pause = value; - } - } - - /// - /// 音量を設定または取得します。 - /// - public int Volume { - get => this.IsBouyomiChan ? this.auditoreObject.Volume : 0; - set { - if (!this.IsBouyomiChan) return; - this.auditoreObject.Volume = value; - } - } - - /// - /// 話速を設定または取得します。 - /// - public int TalkSpeed { - get => this.IsBouyomiChan ? this.auditoreObject.TalkSpeed : 50; - set { - if (!this.IsBouyomiChan) return; - this.auditoreObject.TalkSpeed = value; - } - } - - /// - /// トーンを設定または取得します。 - /// - public int Pitch { - get => this.IsBouyomiChan ? this.auditoreObject.Pitch : 50; - set { - if (!this.IsBouyomiChan) return; - this.auditoreObject.Pitch = value; - } - } - - /// - /// 現在のタスクID取得します。 - /// - public int CurrentTaskId { - get => this.IsBouyomiChan ? this.auditoreObject.CurrentTaskId : -1; - } - - /// - /// 現在のタスク数を取得します。 - /// - public int TaskCount { - get => this.IsBouyomiChan ? this.auditoreObject.TaskCount : -1; - } - - /// - /// このライブラリーのバージョンを取得します。 - /// - public string Version { - get => this.IsBouyomiChan ? this.auditoreObject.Version : "Error"; - } - - #endregion - - ~AuditoreClient() - { - this.Dispose(false); - } - - public AuditoreClient() - { - // IPC クライアントチャンネルを作成 - this.clientChannel = new IpcClientChannel(); - - // チャンネルを登録します - ChannelServices.RegisterChannel(this.clientChannel, true); - - // リモートオブジェクトの型を登録します - RemotingConfiguration.RegisterWellKnownClientType( - typeof(AuditoreRefObject), - Constants.IPC - ); - - this.auditoreObject = new AuditoreRefObject(); - } - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます。 - public virtual int Push(string text) => this.PushCore(text); - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 話速 - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます。 - public virtual int Push(string text, int talkSpeed) => this.PushCore(text, talkSpeed); - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 話速 - /// 音量 - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます。 - public virtual int Push(string text, int talkSpeed, int volume) => this.PushCore(text, talkSpeed, volume); - - /// - /// タスクにテキストメッセージを追加します - /// - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// テキストメッセージ - /// 話速 - /// 音量 - /// このタスクのIDが返されます。 - public virtual int PushCore(string text, int talkSpeed = -1, int volume = -1) - => this.IsBouyomiChan ? - this.auditoreObject.PushText(text, talkSpeed, volume) : -1; - - /// - /// 予約されているタスクをすべて削除します。 - /// - public virtual void ClaerAll() - { - if (this.IsBouyomiChan) { - this.auditoreObject.ClearAll(); - } - } - - /// - /// 全てのタスクをキャンセルします。 - /// - public virtual void Reset() - { - if (this.IsBouyomiChan) { - this.auditoreObject.ClearAll(); - this.auditoreObject.Skip(); - } - } - - /// - /// 現在進行中のタスクをスキップします。 - /// - public virtual void Skip() - { - if (this.IsBouyomiChan) { - this.auditoreObject.Skip(); - } - } - - public virtual void ToggleMute() - { - if (this.IsMuted) { - this.Volume = this._last_Volume <= 0 ? 50 : this._last_Volume; - } - else { - this._last_Volume = this.Volume; - this.Volume = 0; + public class AuditoreClient : IAuditoreClient, IDisposable + { + #region フィールド + + private readonly AuditoreRefObject auditoreObject; + private readonly IpcClientChannel clientChannel; + + private bool disposedValue = false; + + private int _last_Volume; + + #endregion + + #region プロパティ + + /// + /// 棒読みちゃんのプロセスが起動およびプラグインが読み込まれているかどうかを確認します。 + /// + public bool IsBouyomiChan => this.IsProcessRunning(); + + /// + /// ミュート状態かどうかを取得します。 + /// + public bool IsMuted => (this.IsBouyomiChan && this.Volume <= 0); + + /// + /// タスクが保留されているかどうかを設定または取得します。 + /// + public bool Pause { + get => !this.IsBouyomiChan && this.auditoreObject.Pause; + set { + if (!this.IsBouyomiChan) return; + this.auditoreObject.Pause = value; + } + } + + /// + /// 音量を設定または取得します。 + /// + public int Volume { + get => this.IsBouyomiChan ? this.auditoreObject.Volume : 0; + set { + if (!this.IsBouyomiChan) return; + this.auditoreObject.Volume = value; + } + } + + /// + /// 話速を設定または取得します。 + /// + public int TalkSpeed { + get => this.IsBouyomiChan ? this.auditoreObject.TalkSpeed : 50; + set { + if (!this.IsBouyomiChan) return; + this.auditoreObject.TalkSpeed = value; + } + } + + /// + /// トーンを設定または取得します。 + /// + public int Pitch { + get => this.IsBouyomiChan ? this.auditoreObject.Pitch : 50; + set { + if (!this.IsBouyomiChan) return; + this.auditoreObject.Pitch = value; + } + } + + /// + /// 現在のタスクID取得します。 + /// + public int CurrentTaskId { + get => this.IsBouyomiChan ? this.auditoreObject.CurrentTaskId : -1; + } + + /// + /// 現在のタスク数を取得します。 + /// + public int TaskCount { + get => this.IsBouyomiChan ? this.auditoreObject.TaskCount : -1; + } + + /// + /// このライブラリーのバージョンを取得します。 + /// + public string Version { + get => this.IsBouyomiChan ? this.auditoreObject.Version : "Error"; + } + + #endregion + + ~AuditoreClient() { + this.Dispose(false); + } + + public AuditoreClient() { + // IPC クライアントチャンネルを作成 + this.clientChannel = new IpcClientChannel(); + + // チャンネルを登録します + ChannelServices.RegisterChannel(this.clientChannel, true); + + // リモートオブジェクトの型を登録します + RemotingConfiguration.RegisterWellKnownClientType( + typeof(AuditoreRefObject), + Constants.IPC + ); + + this.auditoreObject = new AuditoreRefObject(); + } + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます。 + public virtual int Push(string text) => this.PushCore(text); + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 話速 + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます。 + public virtual int Push(string text, int talkSpeed) => this.PushCore(text, talkSpeed); + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 話速 + /// 音量 + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます。 + public virtual int Push(string text, int talkSpeed, int volume) => this.PushCore(text, talkSpeed, volume); + + /// + /// タスクにテキストメッセージを追加します + /// + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// テキストメッセージ + /// 話速 + /// 音量 + /// このタスクのIDが返されます。 + public virtual int PushCore(string text, int talkSpeed = -1, int volume = -1) + => this.IsBouyomiChan ? + this.auditoreObject.PushText(text, talkSpeed, volume) : -1; + + /// + /// 予約されているタスクをすべて削除します。 + /// + public virtual void ClaerAll() { + if (this.IsBouyomiChan) { + this.auditoreObject.ClearAll(); + } + } + + /// + /// 全てのタスクをキャンセルします。 + /// + public virtual void Reset() { + if (this.IsBouyomiChan) { + this.auditoreObject.ClearAll(); + this.auditoreObject.Skip(); + } + } + + /// + /// 現在進行中のタスクをスキップします。 + /// + public virtual void Skip() { + if (this.IsBouyomiChan) { + this.auditoreObject.Skip(); + } + } + + public virtual void ToggleMute() { + if (this.IsMuted) { + this.Volume = this._last_Volume <= 0 ? 50 : this._last_Volume; + } + else { + this._last_Volume = this.Volume; + this.Volume = 0; + } + } + + protected virtual void Dispose(bool disposing) { + if (!this.disposedValue) { + try { + ChannelServices.UnregisterChannel(this.clientChannel); } - } - - protected virtual void Dispose(bool disposing) - { - if (!this.disposedValue) { - try { - ChannelServices.UnregisterChannel(this.clientChannel); - } - catch (Exception ex) { - Debug.WriteLine(ex.Message); - } - - this.disposedValue = true; + catch (Exception ex) { + Debug.WriteLine(ex.Message); } - } - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } + this.disposedValue = true; + } + } - private bool IsProcessRunning(string moduleName = "Plugin_Auditore.dll") - { - try { - var process = Process.GetProcesses().FirstOrDefault(x => x.ProcessName == "BouyomiChan"); - if (process == null) { - return false; - } + public void Dispose() { + this.Dispose(true); + GC.SuppressFinalize(this); + } - return process.Modules.OfType().Any(x => x.FileName.Contains(moduleName)); - } - catch { - return false; + private bool IsProcessRunning(string moduleName = "Plugin_Auditore.dll") { + try { + var process = Process.GetProcesses().FirstOrDefault(x => x.ProcessName == "BouyomiChan"); + if (process == null) { + return false; } - } - } + + return process.Modules.OfType().Any(x => x.FileName.Contains(moduleName)); + } + catch { + return false; + } + } + } } diff --git a/src/Auditore.Remoting/IAuditore.cs b/src/Auditore.Remoting/IAuditore.cs index ff24a70..4ab66f5 100644 --- a/src/Auditore.Remoting/IAuditore.cs +++ b/src/Auditore.Remoting/IAuditore.cs @@ -21,95 +21,95 @@ namespace Auditore.Remoting { - public interface IAuditoreClient - { - /// - /// ミュート状態かどうかを取得します。 - /// - bool IsMuted { get; } - - /// - /// タスクが保留されているかどうかを設定または取得します。 - /// - bool Pause { get; set; } - - /// - /// 音量を設定または取得します。 - /// - int Volume { get; set; } - - /// - /// 話速を設定または取得します。 - /// - int TalkSpeed { get; set; } - - /// - /// トーンを設定または取得します。 - /// - int Pitch { get; set; } - - /// - /// 現在のタスクID取得します。 - /// - int CurrentTaskId { get; } - - /// - /// 現在のタスク数を取得します。 - /// - int TaskCount { get; } - - /// - /// このライブラリーのバージョンを取得します。 - /// - string Version { get; } - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます - int Push(string text); - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 話速 - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます - int Push(string text, int talkSpeed); - - /// - /// タスクにテキストメッセージを追加します。 - /// - /// テキストメッセージ - /// 話速 - /// 音量 - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// このタスクのIDが返されます - int Push(string text, int talkSpeed, int volume); - - /// - /// タスクにテキストメッセージを追加します - /// - /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します - /// テキストメッセージ - /// 話速 - /// 音量 - /// このタスクのIDが返されます - void ClaerAll(); - - /// - /// 予約されているタスクをすべて削除します。 - /// - void Reset(); - - /// - /// 全てのタスクをキャンセルします。 - /// - void Skip(); - - void ToggleMute(); - } + public interface IAuditoreClient + { + /// + /// ミュート状態かどうかを取得します。 + /// + bool IsMuted { get; } + + /// + /// タスクが保留されているかどうかを設定または取得します。 + /// + bool Pause { get; set; } + + /// + /// 音量を設定または取得します。 + /// + int Volume { get; set; } + + /// + /// 話速を設定または取得します。 + /// + int TalkSpeed { get; set; } + + /// + /// トーンを設定または取得します。 + /// + int Pitch { get; set; } + + /// + /// 現在のタスクID取得します。 + /// + int CurrentTaskId { get; } + + /// + /// 現在のタスク数を取得します。 + /// + int TaskCount { get; } + + /// + /// このライブラリーのバージョンを取得します。 + /// + string Version { get; } + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます + int Push(string text); + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 話速 + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます + int Push(string text, int talkSpeed); + + /// + /// タスクにテキストメッセージを追加します。 + /// + /// テキストメッセージ + /// 話速 + /// 音量 + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// このタスクのIDが返されます + int Push(string text, int talkSpeed, int volume); + + /// + /// タスクにテキストメッセージを追加します + /// + /// 強制的にテキストメッセージをミュート状態に関わらず、タスクに追加します + /// テキストメッセージ + /// 話速 + /// 音量 + /// このタスクのIDが返されます + void ClaerAll(); + + /// + /// 予約されているタスクをすべて削除します。 + /// + void Reset(); + + /// + /// 全てのタスクをキャンセルします。 + /// + void Skip(); + + void ToggleMute(); + } } diff --git a/src/Auditore.Test/Program.cs b/src/Auditore.Test/Program.cs index f726fac..63e2195 100644 --- a/src/Auditore.Test/Program.cs +++ b/src/Auditore.Test/Program.cs @@ -24,17 +24,16 @@ namespace Auditore.Test { - static class Program - { - /// - /// アプリケーションのメイン エントリ ポイントです。 - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new frmMain()); - } - } + static class Program + { + /// + /// アプリケーションのメイン エントリ ポイントです。 + /// + [STAThread] + static void Main() { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new frmMain()); + } + } } diff --git a/src/Auditore.Test/frmMain.cs b/src/Auditore.Test/frmMain.cs index 3a1c30b..12c9274 100644 --- a/src/Auditore.Test/frmMain.cs +++ b/src/Auditore.Test/frmMain.cs @@ -19,94 +19,85 @@ #endregion +using System; +using System.Windows.Forms; + namespace Auditore.Test { - using System; - using System.Windows.Forms; + public partial class frmMain : Form + { + private readonly Remoting.AuditoreClient client = new Remoting.AuditoreClient(); + + public frmMain() { + this.InitializeComponent(); + this.Text = $"{this.Text} - {Application.ProductVersion}"; + this.UpdateData(); + } + + private void UpdateData() { + try { + this.trackBarTest.Value = this.client.Volume; + this.labelVolume.Text = $"音量 : {this.client.Volume}"; - public partial class frmMain : Form - { - private readonly Remoting.AuditoreClient client = new Remoting.AuditoreClient(); + this.trackBar1.Value = this.client.TalkSpeed; + this.labelSpeed.Text = $"速度 : {this.client.TalkSpeed}"; - public frmMain() - { - this.InitializeComponent(); - this.Text = $"{this.Text} - {Application.ProductVersion}"; + this.labelTaskId.Text = $"タスク Id : {this.client.CurrentTaskId}"; + this.labelTaskCount.Text = $"タスク数 : {this.client.TaskCount}"; + + this.labelUpdatedAt.Text = DateTime.Now.ToString(); + } + catch (Exception ex) { + MessageBox.Show(ex.Message, "取得に失敗しました", MessageBoxButtons.OK, MessageBoxIcon.Warning); + this.labelUpdatedAt.Text = "取得に失敗しました"; + } + } + + private void ButtonSend_Click(object sender, EventArgs e) { + try { + var taskId = this.client.Push(this.textBoxMessage.Text); + this.label7.Text = $"タスク Id : {taskId}"; this.UpdateData(); - } - - private void UpdateData() - { - try { - this.trackBarTest.Value = this.client.Volume; - this.labelVolume.Text = $"音量 : {this.client.Volume}"; - - this.trackBar1.Value = this.client.TalkSpeed; - this.labelSpeed.Text = $"速度 : {this.client.TalkSpeed}"; - - this.labelTaskId.Text = $"タスク Id : {this.client.CurrentTaskId}"; - this.labelTaskCount.Text = $"タスク数 : {this.client.TaskCount}"; - - this.labelUpdatedAt.Text = DateTime.Now.ToString(); - } - catch (Exception ex) { - MessageBox.Show(ex.Message, "取得に失敗しました", MessageBoxButtons.OK, MessageBoxIcon.Warning); - this.labelUpdatedAt.Text = "取得に失敗しました"; - } - } - - private void ButtonSend_Click(object sender, EventArgs e) - { - try { - var taskId = this.client.Push(this.textBoxMessage.Text); - this.label7.Text = $"タスク Id : {taskId}"; - this.UpdateData(); - } - catch (Exception ex) { - MessageBox.Show(ex.Message, "送信に失敗しました", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private void trackBarTest_Validating(object sender, System.ComponentModel.CancelEventArgs e) - { - try { - this.client.Volume = (sender as TrackBar).Value; - } - catch (Exception ex) { - MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private void trackBar1_Validating(object sender, System.ComponentModel.CancelEventArgs e) - { - try { - this.client.TalkSpeed = (sender as TrackBar).Value; - } - catch (Exception ex) { - MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - this.UpdateData(); - } - - private void trackBarTest_Scroll(object sender, EventArgs e) - { + } + catch (Exception ex) { + MessageBox.Show(ex.Message, "送信に失敗しました", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void trackBarTest_Validating(object sender, System.ComponentModel.CancelEventArgs e) { + try { this.client.Volume = (sender as TrackBar).Value; - this.labelVolume.Text = $"音量 : {this.client.Volume}"; - } - - private void trackBar1_Scroll(object sender, EventArgs e) - { + } + catch (Exception ex) { + MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void trackBar1_Validating(object sender, System.ComponentModel.CancelEventArgs e) { + try { this.client.TalkSpeed = (sender as TrackBar).Value; - this.labelSpeed.Text = $"速度 : {this.client.TalkSpeed}"; - } - - private void button2_Click(object sender, EventArgs e) - { - MessageBox.Show($"IsBouyomiChan: {this.client.IsBouyomiChan}"); - } - } + } + catch (Exception ex) { + MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { + this.UpdateData(); + } + + private void trackBarTest_Scroll(object sender, EventArgs e) { + this.client.Volume = (sender as TrackBar).Value; + this.labelVolume.Text = $"音量 : {this.client.Volume}"; + } + + private void trackBar1_Scroll(object sender, EventArgs e) { + this.client.TalkSpeed = (sender as TrackBar).Value; + this.labelSpeed.Text = $"速度 : {this.client.TalkSpeed}"; + } + + private void button2_Click(object sender, EventArgs e) { + MessageBox.Show($"IsBouyomiChan: {this.client.IsBouyomiChan}"); + } + } }