Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

Звук и буферы   Найти похожие ветки 

 
Жидкое стекло ©   (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 вся ветка

Текущий архив: 2008.06.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
2-1211959348
DmT
2008-05-28 11:22
2008.06.22
Терминал на канве


15-1210177626
Александр Иванов
2008-05-07 20:27
2008.06.22
Вложенные Repeater ы в ASP.NET


15-1209750409
AEN
2008-05-02 21:46
2008.06.22
Лисп


15-1205176108
builder
2008-03-10 22:08
2008.06.22
Если разница указывая адрес писать www или нет?


2-1211991044
rena
2008-05-28 20:10
2008.06.22
выход из процедуры