Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ton über den Gehäuse internen Lautsprecher! (https://www.delphipraxis.net/3694-ton-ueber-den-gehaeuse-internen-lautsprecher.html)

Trouble_Maker 25. Mär 2003 21:07


Ton über den Gehäuse internen Lautsprecher!
 
Hiho leute! Ich möchte einen Ton/Töne aus dem internen Lautsprecher (also nicht über die normalen PC-Boxen) "abspiele"
iCh habe es mit folgendem Code probiert:

Code:

  Windows NT/2000/XP:
  Windows.Beep(dwFreq, dwDuration);

  dwFreq : frequency, in hertz, of the sound.
  dwDuration : duration, in milliseconds, of the sound.




// Windows 9x/NT-Platforms:

procedure SetPort(address, Value: Word);
var
  bValue: Byte;
begin
  bValue := trunc(Value and 255);
  asm
    mov dx, address
    mov al, bValue
    out dx, al
  end;
end;

function GetPort(address: Word): Word;
var
  bValue: Byte;
begin
  asm
    mov dx, address
    in al, dx
    mov bValue, al
  end;
  GetPort := bValue;
end;

procedure Sound(aFreq, aDelay: Integer);

  procedure DoSound(Freq: Word);
  var
    B: Byte;
  begin
    if Freq > 18 then
    begin
      Freq := Word(1193181 div Longint(Freq));
      B   := Byte(GetPort($61));

      if (B and 3) = 0 then
      begin
        SetPort($61, Word(B or 3));
        SetPort($43, $B6);
      end;

      SetPort($42, Freq);
      SetPort($42, Freq shr 8);
    end;
  end;

  procedure Delay(MSecs: Integer);
  var
    FirstTickCount: LongInt;
  begin
    FirstTickCount := GetTickCount;
    repeat
      Sleep(1);
      //or use Application.ProcessMessages instead of Sleep
    until ((GetTickCount - FirstTickCount) >= Longint(MSecs));
  end;
   
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    Windows.Beep(aFreq, aDelay);
  end
  else
  begin
    DoSound(aFreq);
    Delay(aDelay);
  end;
end;

procedure NoSound;
var
  Value: Word;
begin
  if not (Win32Platform = VER_PLATFORM_WIN32_NT) then
  begin
    Value := GetPort($61) and $FC;
    SetPort($61, Value);
  end;
end;


// Example:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Sound(500, 1000);
  Sound(700, 1000);
  Sound(900, 1000);
  NoSound;
end;
bei mir findet er aber das "NoSound" am ende nicht!!! Diese habe ich probeweiße entfernt und gestartet! Ich musste den Rechner neustarten, weil mir das Piepen total auf die nerven ging! Und ich wusste nicht, wie ich das ausschalte!
Kann mir jemand helfen ?!?

cu Trouble_Maker

Trouble_Maker 25. Mär 2003 21:22

oh cool!
Hat jetzt komischerweiße doch geklappt *freu*
...
Jetzt aber trotzdem noch ne Frage! Ich möchte den Sound abspielen, aber dann soll er erst aufhören, wenn ein Button geklickt wird!
ICh kann doch jetzt nicht einfach das NoSound in die Procedure von dem Button schreiben !?!

Danke

Trouble_Maker

sakura 25. Mär 2003 21:39

Doch, kannst Du. Das geht aber nur unter Windows 95/98, unter NT beendet die Beep-Funktion den Sound von allein.

...:cat:...

Trouble_Maker 25. Mär 2003 22:07

is das dann nur unter NT oder auch 2000 und XP ?!?

Danke

Trouble_Maker

sakura 26. Mär 2003 08:16

2000 und XP sind auch NT Systeme ;-) Von daher auch bei denen.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz