I have an app where I do this... Here's what I'm doing:
- Wait for the playback buffers to drain
- You can do this by feeding empty buffers to NAudio for long enough to ensure silence to the speakers. No more than 150ms is required in most cases, but you can control it by setting the buffer size when you create the playback instance (WaveOut, WasapiOut, etc.).
- Pause playback
- Seek source
- Resume playback
My app actually double-buffers, so instead of "Resume playback", I actually fill my primary buffer and allow that to trigger the resume.
The only downside is that the seek doesn't happen instantly. In practice, most of the delay is waiting for the decoder to seek, so it's a non-issue for me.