soundkarte/ speaker dierkt ansprechen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • soundkarte/ speaker dierkt ansprechen

      hallo,
      wie kann ich mit der "kernel32.dll" funktion "beep" direkt den speaker resp. die soundkarte ansteuern? endziel soll sein, das eben aus den lautsprechern ein ton mit definierter frequenz und definierter dauer kommen soll.
      soweit ich gml richtig verstanden habe, muß man immer funktionswerte an eine variable zurückgeben [wie z.b.: aaa=external_call(...)] - soweit so gut, aber was nutzt es mir, wenn der rückgabewert in der variablen steht und ich ihn nicht an die soundkarte senden kann? brauche ich eine weitere dll-funktion? oder ist mein vorhaben mit gm nicht machbar? oder bin ich völlig auf dem holzweg? hat mich überhaupt einer verstanden *lol*?
      greetz kaische :o)
      i am not as think, as you stupid i am.
    • Du musst dir erst mal selber eine Dll schreiben, die mit der Kernel32.dll kommuniziert. Der Game Maker kann nämlich bei Dlls nur mit den Datentypen PChar und Double (in Delphi, weiß nicht was das in anderen Programmiersprachen ist) arbeiten. Deswegen musst du eine Dll programmieren, die beispielsweise eine Hertzzahl in Double in einen Wert umwandelt, mit dem dann die Kernel32.dll was anfangen kann.

      Edit: Ich hab mich mal ein bisschen eingelesen, das Beep der WinAPI steuert den kleinen Lautsprecher im PC, nicht die normalen Lautsprecher oder die Soundkarte an. Das heißt nur der Lautsprecher im PC piept (und ich kann das nicht hören, da mein Gehäuse keinen Pieper hat).
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • ?( zum einen sind frequenz und dauer vom typ her single (was von der logik immer in double paßt) und zum anderen versteh ich nicht, warum ich mit der kernell32 komunizieren soll, wo ich doch nur den funktionsumfang dieser nutzen will - komunizieren will ich doch mit der soundkarte...der witz an der sache ist, daß mir die ganze sache vor ~10 jahren an der uni mal geglückt ist (vb 4.0 oder 5.0 oder so), ich aber keinerlei aufzeichnungen oder source-codes mehr habe :(
      i am not as think, as you stupid i am.
    • Das Beep piept nicht auf der Soundkarte, das tönt im PC Speaker.
      Und kommunizieren musst du ja mit der Dll, du musst der ja sagen was sie tun soll. Also Beep mit Parametern aufrufen.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • sorry, raff ich net :( das mit dem speaker war mir schon klar... und das es kein berauschendes ergebnis ist, paßt schon. aber wie ich den dem "beep" hantiere, leuchtet mir einfach net ein... ich glaub ich hab hier ein sehr grundlegendes verständnisproblem mit die comjuta *ächz*

      ich habe folgende funktion
      global.frequenz = external_define("kernel32.dll","beep",dll_stdcall,ty_real,2,ty_real, ty_real)

      und diesen rückgabewert
      external_call(global.frequenz,440,500) -> bem.: 440 ist frequenz, 500 dauer in milisek.

      und eben hier ärger mit gm ;) weil ich den external_call - à la "ausgabe = external_call(...) -zuweisen muß und nicht direkt verarbeiten kann ...

      bestimmt, hast du mir schon längst die antwort gegeben, aber ich hab sie nicht gecheckt *lol*
      i am not as think, as you stupid i am.
    • ha! hab ich gemacht (sogar schon vor deiner antwort *g*) und beim kompilieren kommt:

      ERROR in
      action number 1
      of Create Event
      for object controller:

      Error defining an external function.


      ich hab also beim external_define nen fehler!?

      mein api-viewer übersetzt den befehl beep für delphi folgendermaßen:
      function Beep (dwFreq : Integer; dwDuration : Integer) : Integer; stdcall; external 'kernel32' name 'Beep'

      ich seh kein land ....
      i am not as think, as you stupid i am.
    • Eben, Integer. Und Integer ist nicht Double. Integer hat 32bit, Double 64bit. Da der Game Maker kein Integer kann, kannst du das nicht so einfach deklarieren sondern musst eine Dll entwickeln, die Double von GM annimmt und Beep dann mit Integer aufruft.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • jeppa - eben dies hab ich auch grad nachgelesen ... nu, dann muß ich mich nem anderen projekt widmen, da ich keine programmierumgebung hab, mit der ich dll's schreiben kann... oder warten bis jemand ne dll liefert, die das kann, was ich ich will *loool*

      fettes danke für deine hilfe!

      greetz kaische :)
      i am not as think, as you stupid i am.
    • Ich hab dir schnell ne Dll gebastelt. Den Aufruf müsstest du selber verdrahten können, sähe so aus:

      GML-Quellcode

      1. global.frequenz=external_define("gm_beep.dll","beep",dll_stdcall,ty_real,2,ty_real,ty_real);
      2. external_call(global.frequenz,440,500);


      Kann das leider nicht testen, da mein PC keinen Speaker drin hat. Aber da keine Fehler auftreten müsste es theoretisch laufen, probier es einfach mal aus.
      Dateien
      • gm_Beep.zip

        (8,73 kB, 261 mal heruntergeladen, zuletzt: )
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • WOOOOOOOOW! 8o
      ich bin dein fan, von jetzt bis zum ende aller tage - laß dir knutschen ;) *lol*
      det funzt wiedsau! ich weiß gar net wie mir wird *ggg*
      wie geht sowas? ich bin im fieber und will das auch können...

      ich glaub zwar net, daß ich mich in irgendeiner weise mal revanchieren kann (es sei denn du brauchst paar schicke midis *g*)

      viel spaß noch beim korrigieren der geistigen ergüsse deiner penäler ;) ;) ;)

      thx & greetz kaische :)
      i am not as think, as you stupid i am.
    • nönö - da is nix lahm! die is so, wie ICH sie haben wollte *kicher*
      aber musik, naja MUSIK kann man damit nicht machen - außer man will sein atari aus den 70ern reanimieren oder ein handy des letzten jahrtausends mit feinsten klingeltönen verzieren (sofern man sie denn druffgejuckelt kriecht ;))
      i am not as think, as you stupid i am.
    • @Andre: Die Tatsache, dass das Spiel pausiert wird wenn du die DLL aufrufst liegt darin, dass der GM DLLs asynchron aufruft, das heisst er wartet auf den Rueckgabewert der DLL bevor er fortfaehrt. Es gibt DLLs, vor allem DLLs die Funktionen dauerhaft oder in schleifen ausfuehren, die diesen Effekt umgehen indem sie einen eigenen Thread starten. Aber deren Programmierung ist zumindest in C (und afaik auch in Delphi, right, WA?) zu umstaendlich fuer etwas billiges wie ein Biep.

      Das asynchrone Aufrufen ist uebrigens nicht auf den GM beschraenkt sondern ist das Standardverfahren fuer so gvut wie alle Programmiersprachen.
    • Original von T-Moe
      @Andre: Die Tatsache, dass das Spiel pausiert wird wenn du die DLL aufrufst liegt darin, dass der GM DLLs asynchron aufruft, das heisst er wartet auf den Rueckgabewert der DLL bevor er fortfaehrt. Es gibt DLLs, vor allem DLLs die Funktionen dauerhaft oder in schleifen ausfuehren, die diesen Effekt umgehen indem sie einen eigenen Thread starten. Aber deren Programmierung ist zumindest in C (und afaik auch in Delphi, right, WA?) zu umstaendlich fuer etwas billiges wie ein Biep.

      Das asynchrone Aufrufen ist uebrigens nicht auf den GM beschraenkt sondern ist das Standardverfahren fuer so gvut wie alle Programmiersprachen.


      Ja, die Frage ist jetzt, ob der Beep die Abarbeitung des Delphi Codes hindert, oder ob der einfach ausgelöst wird und gleich der Rückgabewert kommt. So wie es aussieht scheint es ja nicht zu stoppen. Mit Threads in Delphi hab ich mich schon etwas beschäftigt, habe mal auf ne Anfrage hin ne spezielle Variante der Image Conversion Dll gemacht.
      Ist aber wirklich nicht mein Fachgebiet :P
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • Hm, schade. Habs jetzt mal ausprobiert und festgestellt, dass es leider das Spiel pausiert. Falls sich da eine Lösung finden ließe, wäre das toll... Ansonsten, nya...

      €dit:
      700. Post!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von King Andre ()