Delphi звук через системный динамик
Периодически сталкиваюсь с задачей воспроизведения звука в windows приложениях исключительно через системный динамик.
В старые добрые времена ОС DOS в прародителе делфи - компиляторе языка Pascal, была функция Beep у которой параметром передавалась частота и кажись длительность воспроизведения. Так вот в API современных версий Windows основанных на NT (а это и win2000 и XP и последующие) описана аналогичная функция
BOOL Beep
(DWORD dwFreq, // частота, Гц
DWORD dwDuration // продолжительность, мс
);
которая по сути тем же и занимается ![]()
однако для не NT - основанных систем эта функция не работает, точнее ее параметры игнорируются.
так вот в этом случае приходит на помощь незабвенный ассемблер, на базе которого и основано предлагаемое мною решение:
-
procedure BeepInSpeaker(Freq: Word; Duration: Integer);
-
var
-
Ver: TOsVersionInfo;
-
begin
-
Ver.dwOSVersionInfoSize := SizeOf(Ver);
-
GetVersionEx(Ver);
-
if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then
-
Windows.Beep(Freq, Duration)
-
else begin
-
asm
-
movzx ecx, Freq
-
mov eax, 1193180 // тактовая частота
-
sub edx, edx
-
div ecx // преобразование частоты в делитель
-
mov ecx, eax
-
mov al,0b6H
-
out 43H,al // управляющие слово
-
mov al,cl
-
out 42h,al // младший байт делителя
-
mov al,ch
-
out 42h,al // старший байт делителя
-
in al,61H
-
or al,03H
-
out 61H,al // включить звук
-
end;
-
sleep(Duration); // пауза на время звучани
-
asm
-
in al,61H
-
and al,0fcH
-
out 61H,al // выключить звук по окончанию Duration
-
end;
-
end;
-
end;
Разместить у себя на ресурсе или в ЖЖ:
На любом форуме в своем сообщении:




19 июня, 2008 в 12:02
оооо, спасиба огромное, то, что мне нужно))