Einzelnen Beitrag anzeigen

Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#1

Ton über den Gehäuse internen Lautsprecher!

  Alt 25. Mär 2003, 21:07
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
  Mit Zitat antworten Zitat