単純な MP3/WAV メディア プレーヤー領域を含むプログラムを作成しています。
NAudio サンプル プログラムに含まれるコードに従いました。これは、再生可能なオーディオ ファイルをカプセル化するために作成したクラスです。
public sealed class PlaybackContext : IDisposable {
private String _fileName;
private DirectSoundOut _dsoundOut;
private WaveStream _waveStream;
public PlaybackContext(String fileName) {
_fileName = fileName;
_dsoundOut = new DirectSoundOut( DirectSoundOut.DSDEVID_DefaultPlayback );
String ext = Path.GetExtension( fileName );
if( ext.Equals(".mp3", StringComparison.OrdinalIgnoreCase) ) {
_waveStream = new Mp3FileReader( fileName );
} else if( ext.Equals(".wav", StringComparison.OrdinalIgnoreCase) ) {
_waveStream = new WaveFileReader( fileName );
switch( _waveStream.WaveFormat.Encoding ) {
case WaveFormatEncoding.Pcm:
case WaveFormatEncoding.IeeeFloat:
break;
default:
_waveStream = new BlockAlignReductionStream( WaveFormatConversionStream.CreatePcmStream( _waveStream ) );
break;
}
}
_dsoundOut.Init( _waveStream );
}
public void Play() {
_dsoundOut.Play();
}
// hidden are the Pause/Stop/Dispose methods
MP3 ファイルでは問題なく動作しますが、Wave ファイルを再生しようとすると、次の例外が発生します。
Object contains non-primitive or non-blittable data.
System.ArgumentException
at System.Runtime.InteropServices.GCHandle.InternalAlloc(Object value, GCHandleType type)
at System.Runtime.InteropServices.GCHandle.Alloc(Object value, GCHandleType type)
at NAudio.Wave.DirectSoundOut.InitializeDirectSound()
at NAudio.Wave.DirectSoundOut.PlaybackThreadFunc()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Google で何も見つけられず、私のコードは x86 用にコンパイルされています (したがって、これは 64 ビットの問題ではありません)。そうでなければ私は立ち往生しています。
何か案は?