I'm writing a basic writing app in C# and I wanted to have the program make typewriter sounds as you typed. I've hooked the KeyPress event on my RichTextBox to a function that uses a SoundPlayer to play a short wav file every time a key is pressed, however I've noticed after a while my computer slows to a crawl and checking my processes, audiodlg.exe was using 5 GIGABYTES of RAM.
The code I'm using is as follows:
I initialise the SoundPlayer as a global variable on program start with
SoundPlayer sp = new SoundPlayer("typewriter.wav")
Then on the KeyPress event I simply call
sp.Play();
Does anybody know what's causing the heavy memory usage? The file is less than a second long, so it shouldn't be clogging the thing up too much.
Don't use SoundPlayer
- use the waveOut...
API instead:
http://www.codeproject.com/Articles/4889/A-full-duplex-audio-player-in-C-using-the-waveIn-w
SoundPlayer
is more like a toy than a production-ready component, although I'm sure the MS intern that wrote it meant well. :)
Update: if you use the linked sample and get familiar with the code, you'll see what's probably wrong with the SoundPlayer
implementation. Playing audio with the waveOut...
functions involves two in-memory buffers: one small one for the header, and one potentially large buffer than contains the actual sample data. The hotfix article you linked to mentions the leak of a few hundred bytes each time Play
is called, which means the code is probably instantiating a new header each time and then not disposing of it properly. (This is assuming SoundPlayer
wraps the waveOut...
API - I don't know whether this is the case or not)
Programmers take for granted the maxim "don't reinvent the wheel". Well, sometimes the wheel desperately needs reinventing.