Статьи Королевства Дельфи

         

while not Terminated do begin


И наконец, вот он, ЗВУК!

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;

Важно: нет необходимости повторно готовить буферы функцией waveOutPrepareHeader, просто пишите данные в память и играйте… Когда Вы насладитесь звуком (все это пищание надоест), нужно выключить машинку:

// завершение работы с аудиоустройством waveOutReset(hwo); waveOutUnprepareHeader(hwo, @wh[0], sizeof(WAVEHDR)); waveOutUnprepareHeader(hwo, @wh[1], sizeof(WAVEHDR)); // освобождение памяти VirtualFree(buf[0],0,MEM_RELEASE); WaveOutClose(hwo);

И освобождаем наш объект-событие.

CloseHandle(hEvent);

Все, наступила тишина…

Итак, мы разобрались с тремя вопросами:

  • как узнать, есть ли устройство вывода звука,
  • как сгенерировать звук и
  • как вывести звук.


Далее по плану: как менять громкость и вообще работать с микшером и что такое fullduplex.

Пример программы подготовлен для Delphi5. Скачать — 5.8K

Литература

Гордеев О. В. Программирование звука в Windows. СПб.: БХВ — Санкт-Петербург 1999 384 с.

Сергей Козлов
Специально для


Содержание  Назад  Вперед