Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Генерация звукого сигнала на встроенном динамике

Delphi , Мультимедиа , Speaker

Генерация звукого сигнала на встроенном динамике


procedure Sound(Frequency, Duration: Integer);
asm
   push edx
   push eax
   mov eax, Win32Platform
   cmp eax, VER_PLATFORM_WIN32_NT
   jne @@9X
   call Windows.Beep
   ret
@@9X:
   pop eax
   pop edx
   push ebx
   push edx
   mov bx, ax
   mov ax, 34DDh
   mov dx, 0012h
   cmp dx, bx
   jnc @@2
   div bx
   mov bx, ax
   in al, 61h
   test al, 3
   jnz @@1
   or al, 3
   out 61h, al
   mov al, 0B6h
   out 43h, al
@@1:
   mov al, bl
   out 42h, al
   mov al, bh
   out 42h, al
   call Windows.Sleep
   in al, 61h
   and al, 0FCh
   out 61h, al
   jmp @@3
@@2:
   pop edx 
@@3:
   pop ebx
end;

Here's a translation of the provided text into Russian:

Код - это процедура Delphi под именем Sound, которая генерирует сигнал звука на внутреннем динамике. Процедура принимает два параметра: Frequency и Duration, оба типа Integer.

Вот что код делает:

  1. Он сначала проверяет, является ли платформой Windows 32-разрядной NT, используя константу Win32Platform из модуля Windows.
  2. Если платформа действительно является Windows 32-разрядной NT, он вызывает функцию Beep из модуля Windows, чтобы произвести звуковой сигнал.
  3. Если платформа не является Windows 32-разрядной NT (или если функция Beep fails для каких-либо причин), код продолжает выполнение альтернативного реализации.

Альтернативная реализация использует инструкции in, out и mov для прямого управления регистрами динамика. Это требует хорошего понимания аппаратной части и ее регистров, а также знаний программирования на ассемблере.

Вот что альтернативная реализация делает:

  1. Он перемещает значение 34DDh в регистр ax (нижние 16 бит) и значение 0012h в регистр dx.
  2. Он сравнивает значение в dx с значением в bx. Если dx не меньше или равно bx, он прыгает к метке @@1.
  3. Если dx меньше bx, он делит значение в ax на значение в bx с помощью оператора деления /.
  4. Он перемещает результат деления в регистр bx.
  5. Он читает текущее состояние динамика из порта 61h (регистр управления динамиком) и хранит его в регистре al.
  6. Если регистр al не равен нулю, он прыгает к метке @@1.
  7. Иначе, он устанавливает бит 3 в регистре al (что включает динамик), записывает новый значение обратно в порт 61h и затем перемещает значение 0B6h в регистр al.
  8. Он записывает значение в al в порт 42h (регистр данных динамика).
  9. Он читает текущее состояние динамика из порта 42h и хранит его в регистре bh.
  10. Он записывает значение в bh обратно в порт 42h.
  11. Он вызывает функцию Sleep, чтобы задержаться на короткое время (продолжительность, указанная параметром Duration).
  12. Он читает текущее состояние динамика из порта 61h и хранит его в регистре al.
  13. Он очищает нижние четыре бита регистра al с помощью оператора побитового И (and) с маской 0FCh.
  14. Он записывает новый значение обратно в порт 61h.
  15. Наконец, он прыгает к метке @@3.

В целом, этот код является quite low-level и требует хорошего понимания как программирования на Delphi, так и программирования на ассемблере.

Альтернативное решение:

Вместо использования языка ассемблера вы можете использовать функцию Windows API sndPlaySound или третьестороннюю библиотеку, которая предоставляет более современный и платформонезависимый способ производства звука. Например:

procedure Sound(Frequency, Duration: Integer);
begin
  sndPlaySound(PChar('sound.wav'), SND_FILENAME or SND_ASYNC);
  Sleep(Duration * 1000); // convert milliseconds to seconds
end;

В этом коде предполагается, что у вас есть файл WAV с именем sound.wav, содержащий желаемый звук. Вы можете заменить это на любой другой формат аудиофайла, поддерживаемый Windows.

Замечание: это подход более простой и портативный, чем оригинальный код на языке ассемблера. Однако он может не обеспечивать такой же уровень контроля над регистрами динамика, как оригинальный код.

Процедура Sound(Frequency, Duration: Integer) генерирует звуковой сигнал на встроенном динамике с заданной частотой и продолжительностью.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Speaker ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:59:38/0.0056829452514648/1