{\r
if ( this.Device.e出力デバイス != ESoundDeviceType.DirectSound )\r
{\r
- this.nDInputTimerCounter = this.ctDInputTimer.nシステム時刻ms;\r
- this.nSoundTimerCounter = this.nシステム時刻ms;\r
- //Debug.WriteLine( "BaseCounter: " + nDInputTimerCounter + ", " + nSoundTimerCounter );\r
+ try\r
+ {\r
+ this.nDInputTimerCounter = this.ctDInputTimer.nシステム時刻ms;\r
+ this.nSoundTimerCounter = this.nシステム時刻ms;\r
+ //Debug.WriteLine( "BaseCounter: " + nDInputTimerCounter + ", " + nSoundTimerCounter );\r
+ }\r
+ catch ( Exception e )\r
+ // サウンド設定変更時に、timer.Dispose()した後、timerが実際に停止する前にここに来てしまう場合があり\r
+ // その際にNullReferenceExceptionが発生する\r
+ // timerが実際に停止したことを検出してから次の設定をすべきだが、実装が難しいため、\r
+ // ここで単に例外破棄することで代替する\r
+ {\r
+ Trace.TraceInformation("FDK: CSoundTimer.SnapTimers(): 例外発生しましたが、継続します。" + e.Message );\r
+ }\r
}\r
}\r
public long nサウンドタイマーのシステム時刻msへの変換( long nDInputのタイムスタンプ )\r
if ( timer != null )\r
{\r
timer.Change( System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite );\r
+ // ここで、実際にtimerが停止したことを確認するコードを追加すべきだが、やり方わからず。\r
+ // 代替策として、SnapTimers()中で、例外発生を破棄している。\r
timer.Dispose();\r
timer = null;\r
}\r
\r
public ISoundDevice Device = null; // debugのため、一時的にprotectedをpublicにする。後で元に戻しておくこと。\r
//protected Thread thSendInput = null;\r
- protected Thread thSnapTimers = null;\r
+ //protected Thread thSnapTimers = null;\r
private CTimer ctDInputTimer = null;\r
private long nDInputTimerCounter = 0;\r
private long nSoundTimerCounter = 0;\r