MIDIs und WAVEs abspielen in BCB 6
-
Hi,
ich möchte WAVEs und MIDIs in Borland C++ Builder 6 benutzen. Die Funktion, um eine WAVE-Datei alleine abzuspielen, funktioniert.
PlaySound("Sounds/crash.wav", NULL, SND_ASYNC | SND_FILENAME );
Jedoch versuche ich schon die ganze Zeit einen Weg zu finden, mehrere WAVEs gleichzeitig wiederzugeben. Mit waveOut sollte das funktionieren. Jedoch verstehe ich das nicht richtig und weiß auch gar nicht, welche waveOut Funktion ich benutzen muss, was ich beachten muss und so weiter.
Außerdem möchte ich das Gleiche mit MIDIs machen können. Bei MIDIs weiß ich aber nicht einmal, wie sie abgespielt werden.
Gibt es irgendwo eine kostenfreie Bibkiothek, die mir den Umgang erleichtert oder kann mir jemand anders helfen, indem er mir einen Codeschnipsel zur Verfügung stellt?
-
Wie wäre es damit:
void Play(String Path, String Alias, int Volume) { String mci, mci2; mci = "open "; mci += "\""; mci += Path; mci += "\""; mci += " alias "; mci += Alias; mci += " wait"; mciSendString(mci.c_str(), 0, 0, 0); String Seta; Seta += "setaudio "; Seta += Alias; Seta += " Volume to "; Seta += IntToStr(Volume); mciSendString(Seta.c_str(), 0, 0, 0); mci2 = "play "; mci2 += Alias; mci2 += " from 0"; mciSendString(mci2.c_str(), 0, 0, 0); }
Beispiel:
Play("Dateipfad.wav","DasHierMussVariieren",500 /*HalbeLautstärke*/);
Das zweite ist der Name, den der Treiber bekommt, mit unterschiedlichen Namen, lassen sich auch unterschiedliche Sounds gleichzeitig abspielen.
Der Codeschnipsel ist nicht schön, erfüllt aber seinen Zweck.EDIT: Das müsste ALLES können, solang codecs installiert sind
-
kann das sein, dass sich nach öfterem benutzen der Speicher flutet? was kann man dagegen tun?
wird der Sound deletet, indem man ihn stopt? oder muss ich ein dyn. objekt erzeugen indem ich die sounds abspiele?
-
Kann mir vielleicht bitte einer sagen, warum ich nach öfterem Abspielen der Sounds ein Crash bekomme? Das Programm hängt sich plötzlich auf und das CPU-Fenster öffnet sich.
Der Quellcode sieht wie folgt aus...void TfrmMain::SoundsLaden()//Sounds initialisieren { AnsiString a; a = "open resources/sounds/boom.wav alias Boom"; mciSendString(a.c_str(), NULL, 0, NULL); a = "open resources/sounds/crash.wav alias Crash"; mciSendString(a.c_str(), NULL, 0, NULL); a = "open resources/sounds/bomb.wav alias Bomb"; mciSendString(a.c_str(), NULL, 0, NULL); a = "open resources/sounds/kotz.wav alias Kotz"; mciSendString(a.c_str(), NULL, 0, NULL); a = "open resources/sounds/laser.wav alias Laser"; mciSendString(a.c_str(), NULL, 0, NULL); } void TfrmMain::Play(String Alias)//Sounds abspielen { AnsiString a = "play \"" + Alias + "\" from 0"; mciSendString(a.c_str(), NULL, 0, NULL); } void TfrmMain::SoundsLoeschen()//Sounds deleten { mciSendString("stop all", NULL, 0, NULL); mciSendString("close all", NULL, 0, NULL); }
Beim OnClose vom Formular werden die Sounds erst geclosed. Während dem Programm spiele ich die Sounds alle abwechselnd ab.
Vorher hatte ich jeden Sound beim Abspielen immer neu geöffnet und auch nicht geclosed. Trotzdem bekomme ich auf diese Weise auch den selben Fehler.
Kann mir vielleicht einer helfen, oder ist mciSendString nicht dafür ausgelegt, viele Sounds abzuspielen?
-
Hallo
Wenn du mehr zu MCI wissen willst, frag mal im WinAPI-Forum nach. Eventuell weiß dort einer weiter.
Vermutlich ist es aber sinnvoller, gleich DirectX oder eine andere spezialisierte Soundbibliothek zu verwenden. Die Forumssuche hier im Builder-Forum oder im Spiele-Forum sollte dir weiterhelfen.bis bald
akari