Реклама

Партнеры

Немного о Песочнице Google (Sandbox). Про важность возможностей
мая 26

Delphi звук через системный динамик

Периодически сталкиваюсь с задачей воспроизведения звука в windows приложениях исключительно через системный динамик.
В старые добрые времена ОС DOS в прародителе делфи - компиляторе языка Pascal, была функция Beep у которой параметром передавалась частота и кажись длительность воспроизведения. Так вот в API современных версий Windows основанных на NT (а это и win2000 и XP и последующие) описана аналогичная функция
BOOL Beep
(DWORD dwFreq, // частота, Гц
DWORD dwDuration // продолжительность, мс
);
которая по сути тем же и занимается :smile:
однако для не NT - основанных систем эта функция не работает, точнее ее параметры игнорируются.

так вот в этом случае приходит на помощь незабвенный ассемблер, на базе которого и основано предлагаемое мною решение:

DELPHI:
  1. procedure BeepInSpeaker(Freq: Word; Duration: Integer);
  2. var
  3. Ver: TOsVersionInfo;
  4. begin
  5. Ver.dwOSVersionInfoSize := SizeOf(Ver);
  6. GetVersionEx(Ver);
  7. if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then
  8. Windows.Beep(Freq, Duration)
  9. else begin
  10. asm
  11. movzx ecx, Freq
  12. mov eax, 1193180 // тактовая частота
  13. sub edx, edx
  14. div ecx // преобразование частоты в делитель
  15. mov ecx, eax
  16. mov al,0b6H
  17. out 43H,al // управляющие слово
  18. mov al,cl
  19. out 42h,al // младший байт делителя
  20. mov al,ch
  21. out 42h,al // старший байт делителя
  22. in al,61H
  23. or al,03H
  24. out 61H,al // включить звук
  25. end;
  26. sleep(Duration); // пауза на время звучани
  27. asm
  28. in al,61H
  29. and al,0fcH
  30. out 61H,al // выключить звук по окончанию Duration
  31. end;
  32. end;
  33. end;

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Есть одно мнение на “Delphi звук через системный динамик”

  1. Автор:Zed

    оооо, спасиба огромное, то, что мне нужно))

Оставить ответ