As the first thing I would remove your critical section handling. It makes no sense at all. Make it look like this:

[pascal]
while not terminated do
begin
updatebuffer;
sleep(50); //TODO: are there better ways to do this?
end;[/pascal]

I can't think of anything else. You could calculate the time you would need between updates by dividing your bitrate with your buffersize, but I don't think that'll make it better.

8% also sounds like a fine percentage to me