56151


Naudio.dllを使用して、ストリーミングでlan接続先の端末共有フォルダに置いてある音声ファイルを再生しています。  
play()メソッドを呼んだ時(音声ファイル再生中)にlanケーブルを抜くと、アプリが応答なしで固まってしまいます。  
再生中に音声ファイルへのアクセスが出来なくなったことを検知する方法はありますでしょうか。

・Naudio  
<https://github.com/naudio/NAudio>


CC BY-SA 4.0
2019-06-26T22:54:18.290
56125
2019-06-27T22:56:15.313
2019-06-26T23:13:38.023
32228
32228
question
c# audio-streaming
Naudio.dllによるリソースアクセスエラー検出方式が知りたい


いずれも、@774RRさんコメントのように、タイムリに通知されるかどうか疑問がありますが、以下のような通知や監視方法が考えられます。

NAudio.dll自身で言えば、`waveOut.Play()`メソッドで`PlaybackStopped`イベントが通知される可能性が考えられます。要因は`e.Exception`プロパティに入るでしょう。  
あるいは`AudioFileReader`の`read`メソッドでExceptionが発生する可能性が考えられます。

[再生の停止 - NAudio | C# プログラミング解説](https://so-
zou.jp/software/tech/programming/c-sharp/media/audio/naudio/#no5)

> 再生の停止  
>  Stop()で停止を指示できます。ただし直ちに停止するわけではなく、PlaybackStoppedイベントの発生までは停止していません。
[code]

>     private void Method()
>     {
>         if (waveOut.PlaybackState != PlaybackState.Stopped)
>         {
>             EventHandler<StoppedEventArgs> handler = null;
>             handler = delegate
>             {
>                 waveOut.PlaybackStopped -= handler;
>                 Method(); // ここで停止を確認してから、再帰的に呼び出す
>             };
>             waveOut.PlaybackStopped += handler;
>             waveOut.Stop(); // 停止を指示。まだ停止していない
>             return;
>         }
>         // ここでは停止している
>     }
>  
[/code]

他に [.NETでリアルタイム再生ソフトの作成](https://tomosoft.jp/design/?p=39926) のソースの最後部分とか。

>
[code]

>     private void OnPlaybackStopped(object sender, StoppedEventArgs e)
>     {
>         Debug.WriteLine("Playback Stopped");
>         if (e.Exception != null)
>         {
>             MessageBox.Show(String.Format("Playback Error {0}",
> e.Exception.Message));
>         }
>     }
>  
[/code]

[AudioFileReader - NAudio | C# プログラミング解説](https://so-
zou.jp/software/tech/programming/c-sharp/media/audio/naudio/#audio-file-
reader)

> AudioFileReader  
>  オーディオ ファイルの読み込みを容易にするためのクラスです。
[code]

>     AudioFileReader reader = new AudioFileReader("sample.wav");
>     if (reader.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) //
> つねにIeeeFloat？
>     {
>         float[] samples = new float[reader.Length / reader.BlockAlign *
> reader.WaveFormat.Channels];
>         reader.Read(samples, 0, samples.Length);
>         // ステレオの音声ならば、偶数番目が左のデータで奇数番目が右となる
>     }
>  
[/code]

>
> 読み込み時にはすべてのデータを読み込む必要があります。さもなくばSystem.ArgumentException例外が発生し、「Must read
> complete blocks」と通知されます。
>
> byte配列での読み込み時 … reader.Length  
>  float配列での読み込み時 … reader.Length / (reader.BlockAlign *
> reader.WaveFormat.Channels)

* * *

または、NAudio.dll自身にはネットワークの切断を検出出来ない場合でも、.NET Frameworkに[FileSystemWatcher
Class](https://docs.microsoft.com/ja-
jp/dotnet/api/system.io.filesystemwatcher?view=netframework-4.8)
という機能があって、「ファイル
システムの変更通知を待機し、ディレクトリまたはディレクトリ内のファイルが変更されたときにイベントを発生させます。」となっています。

> 使用FileSystemWatcherの指定したディレクトリ内の変更を監視します。
> 指定したディレクトリのファイルとサブディレクトリ内の変更を確認できます。 ローカル コンピューター、ネットワーク ドライブ、またはリモート
> コンピューター上のファイルを監視するコンポーネントを作成することができます。

[FileSystemWatcher.Error Event](https://docs.microsoft.com/ja-
jp/dotnet/api/system.io.filesystemwatcher.error?view=netframework-4.8)
が、「接続が失われた場合など」に発生すると書かれています。

> 何かできないようにするたびに、このイベントが発生します、FileSystemWatcherオブジェクトからの変更を監視します。 オブジェクトは、リモート
> ディレクトリ内の変更の監視と、そのディレクトリへの接続が失われた場合など、Errorイベントが発生します。

NAudio.dllを使用するアプリケーション側で、この機能を使って監視するということも考えられます。

英語版StackOverflowで関連する以下のような記事があります。  
[FileSystemWatcher and network
disconnect?](https://stackoverflow.com/q/281573/9014308)  
[I need a event to detect Internet
connect/disconnect](https://stackoverflow.com/q/4457773/9014308)  
[FileSystemWatcher Network
Disconnect](https://stackoverflow.com/q/9161993/9014308)  
[C# FileSystemWatcher watch changes on network drive which is only done by
current system](https://stackoverflow.com/q/48616955/9014308)

ちなみに、Windows/C#に限らず、Javaで類似の機能を実現した記事もあります。  
[ネットワークが切断されたことをアラームで知らせるツールを作る（解説付き）](http://argius.hatenablog.jp/entry/2016/02/24/174543)


CC BY-SA 4.0
2019-06-27T14:32:32.273
56151
2019-06-27T14:40:36.373
2019-06-27T14:40:36.373
26370
26370
56125
answer


> play()メソッドを呼んだ時(音声ファイル再生中)にlanケーブルを抜くと、アプリが応答なしで固まってしまいます。  
>  再生中に音声ファイルへのアクセスが出来なくなったことを検知する方法はありますでしょうか。

「再生中に音声ファイルへのアクセスが出来なくなったこと」は「応答なしで固まる」の直接の原因であっても真の原因ではありません。

Windowsにおける「応答なし」とはOSからの描画・UI操作命令に対してアプリケーションが応答しなかったことを示しているにすぎず、ファイルアクセス等は関係ありません。ではなぜ応答なしとなってしまうかというと、UIスレッドでファイルアクセス等を行っているため、UI処理が滞るためです。

ですので、音声の再生を別スレッドで実行すればUIスレッドが専有されることもなく滞らなくなります。


CC BY-SA 4.0
2019-06-27T22:56:15.313
56161
2019-06-27T22:56:15.313
4236
56125
answer