Ну я не могу все тонкости рассказать, поэтому и отсылаю к QSound.
Но как мне кажется суть вашей проблемы в том, что событие по таймеру это не событие, которое будет обработано через n-мс, на это есть масса причин, поэтому я предлагаю вам поставить таймер прерывания на 900 мс, а реальное прошедшее время узнавать с помощью QElapsedTimer
1) Вы соединили слот с сигналом в режиме авто. Т.к. это тоже самое что DirectConnection, т.е. по окончании записи высылается сигнал об ее окончании. Вызывается завершение лупа, но на этот момент он не запущен и ничего не происходит. Запускается луп и там застреваем.
1.Б) Если мы сделаем QueueConnection, то мы тупо заполним буфер и выйдем из цикла.
2) В Qt есть уже готовый класс QSound, думаю, что ковыряясь в его исходниках можно многое почерпнуть