Using NAudio 1.6.0.0
When the code below is running in a console application under Windows Embedded Standard 8, it doesn't raise the "PlaybackStopped" event.
The exact same application works fine under Windows 7 (haven't tested it under "normal" Windows 8).
I also tried to change the wavePlayer to the following (with the given result):
- DirectSoundOut: Plays the sound, doesn't raise the event
- WaveOut: Doesn't play the sound at all
- WaveOutEvent: Plays the sound, doesn't raise the event
- AsioOut: Plays the sound, doesn't raise the event
I also tried (after reading some postings on StackOverflow) to use the WaveChannel32 (with padding disabled) in many of the above situations (including DirectSoundOut) and none resulted in the event being fired.
```
internal class FileItem : ItemBase
{
private readonly IWavePlayer wavePlayer;
private readonly WaveStream reader;
private bool disposed;
public FileItem(string fileName)
{
this.fileName = fileName;
this.wavePlayer = new new DirectSoundOut();
this.reader = new AudioFileReader(fileName);
this.wavePlayer.Init(this.reader);
this.wavePlayer.PlaybackStopped += this.WavePlayerOnPlaybackStopped;
}
public override void Start()
{
this.wavePlayer.Play();
}
public override void Stop()
{
this.wavePlayer.Stop();
}
public override void Dispose()
{
if (this.disposed)
{
return;
}
this.disposed = true;
ThreadPool.QueueUserWorkItem(
s =>
{
this.wavePlayer.PlaybackStopped -= this.WavePlayerOnPlaybackStopped;
this.wavePlayer.Stop();
this.reader.Dispose();
this.wavePlayer.Dispose();
});
}
private void WavePlayerOnPlaybackStopped(object sender, StoppedEventArgs e)
{
this.RaiseCompleted(EventArgs.Empty);
}
}
```
(Code simplified to focus on real issue; might not compile "as is")
Comments: I'm afraid I don;t really know what is going on. I'd investigate whether there is an issue raising events via SyncContext in Windows Embedded Standard, since that is what NAudio is doing (you can view the code). If you can't debug directly, I'd take a copy of WaveOutEvent source code and put some logging statements in, to see if it is trying to raise PlaybackStopeed.
When the code below is running in a console application under Windows Embedded Standard 8, it doesn't raise the "PlaybackStopped" event.
The exact same application works fine under Windows 7 (haven't tested it under "normal" Windows 8).
I also tried to change the wavePlayer to the following (with the given result):
- DirectSoundOut: Plays the sound, doesn't raise the event
- WaveOut: Doesn't play the sound at all
- WaveOutEvent: Plays the sound, doesn't raise the event
- AsioOut: Plays the sound, doesn't raise the event
I also tried (after reading some postings on StackOverflow) to use the WaveChannel32 (with padding disabled) in many of the above situations (including DirectSoundOut) and none resulted in the event being fired.
```
internal class FileItem : ItemBase
{
private readonly IWavePlayer wavePlayer;
private readonly WaveStream reader;
private bool disposed;
public FileItem(string fileName)
{
this.fileName = fileName;
this.wavePlayer = new new DirectSoundOut();
this.reader = new AudioFileReader(fileName);
this.wavePlayer.Init(this.reader);
this.wavePlayer.PlaybackStopped += this.WavePlayerOnPlaybackStopped;
}
public override void Start()
{
this.wavePlayer.Play();
}
public override void Stop()
{
this.wavePlayer.Stop();
}
public override void Dispose()
{
if (this.disposed)
{
return;
}
this.disposed = true;
ThreadPool.QueueUserWorkItem(
s =>
{
this.wavePlayer.PlaybackStopped -= this.WavePlayerOnPlaybackStopped;
this.wavePlayer.Stop();
this.reader.Dispose();
this.wavePlayer.Dispose();
});
}
private void WavePlayerOnPlaybackStopped(object sender, StoppedEventArgs e)
{
this.RaiseCompleted(EventArgs.Empty);
}
}
```
(Code simplified to focus on real issue; might not compile "as is")
Comments: I'm afraid I don;t really know what is going on. I'd investigate whether there is an issue raising events via SyncContext in Windows Embedded Standard, since that is what NAudio is doing (you can view the code). If you can't debug directly, I'd take a copy of WaveOutEvent source code and put some logging statements in, to see if it is trying to raise PlaybackStopeed.