Главная страница
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.016 c
1-1195132473
DerbyW
2007-11-15 16:14
2008.06.22
Генерация интерфейсов для WebService(SOAP) на основании WSDL


2-1211652384
programmer90
2008-05-24 22:06
2008.06.22
Free Pascal на Delphi -"поймать и удержать"


15-1210504788
Nucer
2008-05-11 15:19
2008.06.22
Определения и сохранение изменений файла


3-1198907019
mefodiy
2007-12-29 08:43
2008.06.22
Торможение программы в локальной сети


15-1210238925
@!!ex
2008-05-08 13:28
2008.06.22
Кто не прав.