Главная страница
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.026 c
15-1210606096
User1
2008-05-12 19:28
2008.06.22
ADOTable & свойство CursorLocation


15-1210753383
Vlad Oshin
2008-05-14 12:23
2008.06.22
настроить редактор для заготовок кода


11-1177247346
bessam
2007-04-22 17:09
2008.06.22
Где, как UpDown прикрутить к текстовому полю


2-1211998877
deled
2008-05-28 22:21
2008.06.22
узнать цвет пикселя в Image


15-1210094937
SKIPtr
2008-05-06 21:28
2008.06.22
нет спящего режима на компе