pc-speaker ohne Beep()
-
hoi
ich würde gerne sounds via pc-speaker ausgeben...
in der winapi gibt es dafür ja die funktion beep(freq, duration), das problem mit diesem befehl ist nur, dass sie das programm für soviele millisekunden, wie im parameter "duration" angegeben, anhält (ddas ist ein problem, weill ich die erzeugten töne gerne im hintergrund abspielen würde, also nebenbei noch user input und output stattfinden kann)
nun habe ich mich etwas im netz umgeschaut (u.A. auch hier in den faq und mit der suche). dabei habe ich die funktionen sound() und nosound() aus dos.h gefunden. doch wenn ich diese benutzen will, bekiomme ich einen compiler error, dass diese funktionen nicht definiert sein (ich benutze visual c++ 2005 express (die beta) und habs auch schon mit dem vc .net 2003 toolkit versucht).
aber ich habe noch weiter gesucht und eine möglichkeit gefunden, den pc-speaker direkt anzusprechen ( http://fly.cc.fer.hr/GDM/articles/sndmus/speaker1.html ) der link zeigt jedoch nur die theorie, also hab ich wieder weiter gesucht, wie ich nun diese ports ansprechen kann. gefunden habe ich outport und outportb, aber auch diese funktionen sind nirgends in meinen standard libs zu finden.
anscheinend funktionieren die aber sowieso nicht auf windows xp (für das ich programmiere)die frage nun: wie kann ich töne via pc speaker ausgeben, ohne das durch beep() ausgelöste delay? warum kennt meine lib sound()/nosound() nicht, und wie komme ich daran? wenn garnicht, gibt es eine andere möglichkeit auf ports zu schreiben, außer outport und co.? mit CreateFile ist das doch möglich, aber was muss ich für parameter angeben, um auf die "pc-speaker-ports" zuzugreifen?
puh langer text
aber ich hoffe ihr könnt mir helfen,
danke schonmal
-
Kannste nicht Beep in einen Thread auslaggern?
-
ja, an sowas habe ich auch schon gedacht, hatte mit das so vorgestellt.
der hauptthread setzt, wenn er einen "piep benötigt (^^)" eine variable auf true,
der "beep-thread" prüft nun, ob diese variable true ist und ruft dann Beep auf, ansonsten "legt er sich schlafen" (sleep(1) o.Ä.).
könnte das so klappen, oder gibt es da andere vorschläge?die andere frage besteht weiter, gibt es irgendeine möglichkeit, den "ps speaker port" anzusprechen (in winxp)?
ich habe noch etwas weite rgesucht und das hier gefunden:
http://www.geekhideout.com/iodll.shtml
klingt ja recht gut^^ hat damit vll jemand schon erfahrung? empfehlenswert?
-
Ich wuerde das auch mit Threads loesen. Der "Trick" ist einfach, dass ein neuer (Arbeits-) Thread gestartet wird und du ihm die Parameter für die Beep Funktion übergibst und eine globale/statische Funktion aufrufst, in welcher dann die Beep Funktion direkt ausgeführt wird. Da brauchst du keine zusaetzlichen Variablen, so wie Du dir das gedacht hast. Der Thread wird quasi gestartet, führt den Beep aus und beendet sich. Willst du einen weiteren Beep startest du ihn neu.
Gruss,
DeSoVoDaMu
-
hm ja, so gehts auch^^ ich denk halt imma n bissl komplizierter

aber ist es denn nicht ein wenig "overhead", jedesmal, wenn man piepen will, einen thread zu erstellen? besonders, wenn man damit soundeffekte oder gar musik erstellen will (also viele Beep()´s hintereinander). denn ich denke, einen thread zu erstellen ist nicht gerade eine der schnellsten aktionen, oder??ich hab jetz diese IO.DLL mal getestet, funktioniert recht gut, hab mir jetz eigene sound(freq)/nosound() funktionen geschrieben, allerdings weiß ich auch hier nicht, ob das bei komplexen sound effekten effizient ist, immer un d immer wieder in die ports zu schreiben

was meint ihr, was ist schneller/effizienter..?

danke schonmal für die bisherigen vorschläge(btw, ich rede die ganze zeit von "komplexen sound effekten oder gar musik", ich weiß, heutzutage gibt es midi, wav, mp3, etc. aber ich würds halt gerne via pc-speaker machn, wegen des retro feelings
)
-
vielleicht eine warteschlange erstellen die der thread dann hintereinander abarbeitet.
-
Was schneller und effizienter ist? - DirectX
Also ich glaube Beep() ist auch nicht gerade effizient, wenn es um Soundeffekte geht... ich mein... sone Billigvariante von "Alle meine Entchen" geht damit evtl. noch ganz gut, aber wenn du darüber hinaus willst, wird es nicht nur schwierig, sondern auf einigen Systemen (ich denke da an PCs < 300 MHz) sogar unmöglich. Da brauchst du wirklich spezielle Ressourcen, wie eben DirectX oder was es für Sounds halt noch so gibt... oder du implizierst den Windows Media Player (wie im BCB die TMediaPlayer Komponente).
-
ja schon klar, dass ich mit Beep o.Ä. keine ganzen orchester oder sowas nachspielen kann _"
mir geht es auch eher um wie gesagt "retro-sounds", wie in älteren spielen, wie pacman, etc. und vll kleine alarm sounds oder so^^
-
Ich würde das folgendermaßen realisieren:
1. Einen separaten thread anlegen, der die Funktion
WaitForSingleObject(hEvent,INFINITE);aufruft und das in einer Endlosschleife (Thread-Proc).
2. Der Hauptthread löst immer einfach den Event aus und der passende Sound wird abgespielt. Der Thread-Proc könnte eine Indikatorvariable abchecken, an der erkannt wird welcher Sound kommen soll.
MfG. Tolga.
PS: Ich habs nicht besonders anschaulich erklärt, da ich Eigeninitiative hoch schätze. MSDN wird dir weiterhelfen.
-
ok, danke, werd mich da nochmal schlaulesen.