System - PC-Lautsprecher (Speaker) unter Windows



  • Hallo!

    Es gibt in der WinAPI ja die Funktion Beep(). Deren Parameter unter Win98 ignoriert werden. Wie ist es dennoch möglich unter Win98 einen Signalton über den Pc-Lautsprecher auszugeben. Ich habe zwar irgendwo schon Code gefunden für C++. Aber irgendwie gings dann doch nicht!

    Danke

    [ Dieser Beitrag wurde am 30.06.2002 um 18:38 Uhr von Jansen editiert. ]



  • Ich denke, ich habe da eine ausgereifte Lösung, ich arbeite viel damit, ist vielleicht mal was für die FAQ. Das ganze arbeitet unter allen Windows-Versionen, indem zunächst die Version abgefrag wird.

    void Delay(int MSecs)
    {
      unsigned long FirstTickCount;
      FirstTickCount=GetTickCount();
    
      do
      {
        MSG msg;
    
        if (PeekMessage (&msg, NULL, NULL, NULL, PM_REMOVE))
        {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
        else
        {
          Sleep(0);
        }
      }
      while ((GetTickCount() - FirstTickCount) < (unsigned long)(MSecs));
    }
    
    void Play(int Frequency, int Duration)
    {
      unsigned long dwVersion = GetVersion();
    
      if (dwVersion < 0x80000000)
        Beep (Frequency, Duration);
      else
      {
        unsigned short pitch = (unsigned short) (Frequency);
        asm mov bx, pitch
        asm mov ax, 34DDh
        asm mov dx, 0012h
        asm cmp dx, bx
        asm jnb Stop
        asm div bx
        asm mov bx,ax
        asm in al, 61h
        asm test al, 3
        asm jne J1
        asm or al, 3
        asm out 61h, al
        asm mov al, 0B6h
        asm out 43h, al
        J1:
        asm mov al, bl
        asm out 42h, al
        asm mov al, bh
        asm out 42h, al
        Stop:
        Delay(Duration);
        asm in al, 61h
        asm and al, 0fch
        asm out 61h, al
      }
    }
    

    [ Dieser Beitrag wurde am 13.03.2002 um 16:27 Uhr von Jansen editiert. ]



  • Danke, kommt in die FAQ.

    Anzumerken wäre evtl. noch, dass Besitzer der BCB-Standardversionen hier wahrscheinlich leer ausgehen, da letztere üblicherweise ohne Assemblercompiler ausgeliefert werden.

    PS: Habe mir erlaubt, zur besseren Lesbarkeit die Codeeinrückungen zu optmieren.

    Edit:
    Zum Thema BCB-Standard und Assembler siehe auch
    hier.

    [ Dieser Beitrag wurde am 27.02.2003 um 12:44 Uhr von Jansen editiert. ]


Anmelden zum Antworten