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 с.
Сергей Козлов Специально для
Содержание Назад Вперед