Форум: "Media";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
ВнизЗвук и буферы Найти похожие ветки
← →
Жидкое стекло © (2007-06-20 22:29) [0]Изучаю пример с Королевства Делфи:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=534
(генерация звука определённой частоты через Waveform Audio)
И мне не понятен следующий код:
I:=0;
while not Terminated do begin
// передача очередного буфера драйверу для проигрывания
waveOutWrite(hwo, @wh[I], sizeof(WAVEHDR));
WaitForSingleObject(hEvent, INFINITE);
I:= I xor 1;
// генерация буферов каналов
Generator(CnlBuf[0],Typ[0], Freq[0], Lev[0], BlockSize div 2, tPred[0]);
Generator(CnlBuf[1],Typ[1], Freq[1], Lev[1], BlockSize div 2, tPred[1]);
// смешивание буферов каналов в очередной буфер вывода
Mix(buf[I],CnlBuf[0],CnlBuf[1], BlockSize div 2);
// ожидание конца проигрывания и освобождения предыдущего буфера
end;
точнее...
Насколько я знаю, когда устройство освобождает буфер (флаг WHDR_DONE), ему нужно как можно быстрее подсунуть следующий, иначе будут щелчки. Однако в коде происходит следующее: ожидается возвращение буфера и только потом второй буфер заполняется и передаётся устройству (P.S: Это как я пониманию код, ессно).
Конечно же, я попробовал поменять местами WaitForSingleObject(hEvent, INFINITE) и генерацию сигнала... и появились щелчки. Так где я не прав?
← →
Сергей М. © (2007-06-21 12:05) [1]Алгоритм, реализованный в примере по ссылке, ущербен в принципе, потому что в нем отсутствует анализ флага WHDR_DONE.
Повторный вызов waveOutWrite следует выполнять не раньше чем драйвер установит этот флаг.
← →
Жидкое стекло © (2007-06-23 13:01) [2]>Сергей М. © (21.06.07 12:05) [1]
В другом примере с использованием потока, который я видел, после waveOutWrite вызывался цикл с Sleep(1), в котором ожидался WHDR_DONE. Я побоялся его использоваться, потому что 1) поток всё время работает 2) может быть задержка в миллисекунду.
Но всё таки, не могу понять, почему тот пример работает?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.043 c