Могу объяснить. Есть два варианта реализации, первый - по таймеру, приходит сообщение от винды - издаётся клик. Сообщения "должны" приходить ровно, но реально предел точности системы - 10 мс, время переключения потоков. А во-вторых, если система ещё чем-то занята, это время вообще может сильно варировать. Потому и плавает.
Я по-другому сделал, у меня создаётся непрерывный поток и шлётся на саундкарту.
Даже если должна быть тишина, просто посылается тишина (нулевые сэмплы).
Получается примерно то же, что и в случае с проигрыванием готового файла, просто этот "файл" генерируется на лету. Единственная проблема - если есть другие сильногрузящие процессы, тогда у моего может не хватить времени подгрузить очередную порцию в буфер саундкарты. Но это с любой программой так, хоть с тем же Винампом - запустите что-то тяжёлое, тоже будет "заикаться".