![]() |
Sounds gleichzeitig abspielen
Hallo,
Ich habe schon mehrfach nach einer einfach praktikablen Lösung gesucht, und bin nicht wirklich fündig geworden. Ich habe 2 wav dateien "schuss.wav" und "explosion.wav". DAs ganze ist ein netzwerkspiel, es kommt also vor, dass gleichzeitig mehrere Spieler schiessen, oder explosionen auftreten. Beide wavs sollen also gleichzeitig abgespielt werden können, und es soll auch z.b. schuss.wav mehrmals gleichzeitig abgespielt werden (wenn 2 oder mehr spieler schiesse). Wie mache ich das am besten? Bass.dll würde ich am liebsten vermeiden. Könnte mir jemand eine einfachere Lösung präsentieren? MfG |
AW: Sounds gleichzeitig abspielen
Zitat:
![]() An ansonsten mit waveoutopen, waveoutwrite etc. pp. das Rad neu erfinden. |
AW: Sounds gleichzeitig abspielen
Der Mediaplayer kann als Komponente mehrfach ins Programm eingebunden werden und funktioniert parallel und unabhängig.
|
AW: Sounds gleichzeitig abspielen
^ aber kann ein Mediaplayer nicht immer nur ein Datei abspielen?
das Problem was ich habe ist, dass ich nicht weiss wie viele Wavs/wie of die Wave gleichzeitig abgespielt werden/wird! Das hängt davon wie viele benutzer im spiel sind und gleichzeitig z.b. schiessen. Muss/kann ich dann immer einen neuen mediaplayer erstellen? MfG |
AW: Sounds gleichzeitig abspielen
Zitat:
|
AW: Sounds gleichzeitig abspielen
Wie funktioniert das ganz denn?
ich kenne mich mit Mediaplayern etc. nicht aus. Kann da jemand evtl. ein Biespiel posten? |
AW: Sounds gleichzeitig abspielen
Wie erstelle ich denn einen Mediaplayer ohne den Mediaplayer auf die GUI (Form1) zu ziehen?
Der Owner muss ja von TComponent sein, was geb ich dem ganzen denn dann mit? |
AW: Sounds gleichzeitig abspielen
Na genauso wie andere Komponenten auch:
Delphi-Quellcode:
var
MediaPlayer: TMediaPlayer; MediaPlayer := TMediaPlayer.Create(Application); MediaPlayer.Parent := Self; ... |
AW: Sounds gleichzeitig abspielen
Hallo,
Ich habe nun folgendes entdeckt: OpenAL inklusive Links zu Tutorials: ![]() Allerdings kann ich keine Demo kompilieren. Habe mir die ganzen Header files wie Alut und Altypes geladen, der Compiler hängt aber bei folgender Zeile:
Delphi-Quellcode:
AlutInit(nil,argv); //(FormCreate)
Wenn ich es ohne Parameter übergebe wird kompiliert, allerdings erhalte ich darauf direkt nach dem Start eine Fehlermeldung: EAccessViolation read of 00000... Kennt sich jemand mit OpenAL aus, und kann mir dabei helfen? freundliche Grüße |
AW: Sounds gleichzeitig abspielen
Sooo, Freunde der Sonne ;)
Frohe Weihnachten euch Allen :) Ich habe es immer noch nicht hingekriegt :D Ich benutze jetzt OpenAL und kann damit auch Sounds übereinander abspielen! Allerdings werden die Sounds nicht richtig abgespielt. Der Explosion Sound wird zu leise und zu kurz(!!!) abgespielt. Der Schuss Sound wird immer 2x abespielt (???) Wie das sein kann verstehe ich nicht: Hier ein Ausschnitt aus meinem Code:
Delphi-Quellcode:
MfG
..
const numbuffers = 2; numsources = 2; schuss = 0; explosion = 1; var buffer : array [0..numbuffers] of TALuint; source : array [0..numsources] of TALuint; sourcepos: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0 ); sourcevel: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0 ); listenerpos: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0); listenervel: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0); listenerori: array [0..5] of TALfloat= ( 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); implementation constructor TSound.Create; var argv: array of PChar; format: TALEnum; size: TALSizei; freq: TALSizei; loop: TALInt; data: TALVoid; begin AlutInit(nil,argv); AlGenBuffers(numbuffers, @buffer); AlutLoadWavFile('sounds/bomb.wav', format, data, size, freq, loop); AlBufferData(buffer[explosion], format, data, size, freq); AlutUnloadWav(format, data, size, freq); AlutLoadWavFile('sounds/laserbeamz.wav', format, data, size, freq, loop); AlBufferData(buffer[schuss], format, data, size, freq); AlutUnloadWav(format, data, size, freq); AlGenSources(numsources, @source); AlSourcei ( source[schuss], AL_BUFFER, buffer[schuss]); AlSourcef ( source[schuss], AL_PITCH, 1.0 ); AlSourcef ( source[schuss], AL_GAIN, 1.0 ); AlSourcefv ( source[schuss], AL_POSITION, @sourcepos); AlSourcefv ( source[schuss], AL_VELOCITY, @sourcevel); AlSourcei ( source[schuss], AL_LOOPING, loop); AlSourcei ( source[explosion], AL_BUFFER, buffer[explosion]); AlSourcef ( source[explosion], AL_PITCH, 1.0 ); AlSourcef ( source[explosion], AL_GAIN, 1.0 ); AlSourcefv ( source[explosion], AL_POSITION, @sourcepos); AlSourcefv ( source[explosion], AL_VELOCITY, @sourcevel); AlSourcei ( source[explosion], AL_LOOPING, loop ); AlListenerfv ( AL_POSITION, @listenerpos); AlListenerfv ( AL_VELOCITY, @listenervel); AlListenerfv ( AL_ORIENTATION, @listenerori); end; procedure TSound.playsound ( pname : string ); begin if pname = 'schuss' then AlSourcePlay(source[schuss]) else if pname = 'explosion' then AlSourcePlay(source[explosion]); end; |
AW: Sounds gleichzeitig abspielen
Zitat:
|
AW: Sounds gleichzeitig abspielen
Nunja, es hat bei mir nicht geklappt.
Bzw. wenn ich sounds übereinander abspielen wollte, oder den gleichen sound mehrmals, brach der eine immer ab. MfG |
AW: Sounds gleichzeitig abspielen
Zitat:
Edit: Gibts hier ein Stroke-Out-Tag? Zu viel Weihnachten tut nicht gut. Verwenden und vermeiden klingt aber auch zu ähnlich. Naja. Mit Bass würde es jedenfalls trotzdem gehen :) |
AW: Sounds gleichzeitig abspielen
Ich würde das ganze so machen
Delphi-Quellcode:
var
MediaPlayer1: TMediaPlayer; MediaPlayer2: TMediaPlayer; MediaPlayer1 := TMediaPlayer.Create(Application); MediaPlayer1.Parent := Self; MediaPlayer2 := TMediaPlayer.Create(Application); MediaPlayer2.Parent := Self; MediaPlayer1.FileName := 'C:\Sound1.wav'; MediaPlayer1.Open; MediaPlayer1.Play; MediaPlayer2.FileName := 'C:\Sound2.wav'; MediaPlayer2.Open; MediaPlayer2.Play; |
AW: Sounds gleichzeitig abspielen
|
AW: Sounds gleichzeitig abspielen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Soll es mehrmals gleichzeitig gespielt werden, muss es unter verschiedenen Namen mehrfach vorhanden sein. Offensichtlich glaubt das keiner, deshalb hier ein Beispiel:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MPlayer, StdCtrls; type TForm1 = class(TForm) Button1: TButton; MediaPlayer1: TMediaPlayer; MediaPlayer2: TMediaPlayer; MediaPlayer3: TMediaPlayer; MediaPlayer4: TMediaPlayer; MediaPlayer5: TMediaPlayer; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Mediaplayer1.Play; Sleep(20); Mediaplayer2.Play; Sleep(20); Mediaplayer3.Play; Sleep(20); Mediaplayer4.Play; Sleep(20); Mediaplayer5.Play; end; end. |
AW: Sounds gleichzeitig abspielen
Der Nachteil vom MediaPlayer ist, das er bei dem öffnen einer Datei erst ein mal eine ganze Weile rumrödelt (irgend was sucht und oder vergleicht etc pp.).
Also eine "schöne" Lösung ist das nicht gerade. |
AW: Sounds gleichzeitig abspielen
Das liegt nicht am Mediaplayer, sondern an der Vorschaufunktion des Explorers
(ausschalten: regsvr32 /u shmedia.dll) oder am Virenscanner (den kann man auch konfigurieren - immer nur meckern tun die Doofen...) |
AW: Sounds gleichzeitig abspielen
![]() |
AW: Sounds gleichzeitig abspielen
Hallo nochmal!
Danke für den Link BUG, aber es klappt immer noch nicht. Hab mir das Programm von BloodyQuest angeschaut und versucht es zu übernehmen, allerdings erhalte ich eine Fehlermeldung; Invalid pointer operation in dieser Zeile:
Delphi-Quellcode:
Ich habe Openal installiert und auch die OpenAl32.dll in das Verzeichnis kopiert, kein Erfolg.
procedure TSounds.loadFile(path, name: string);
var buffer: PBuffer; format: TALEnum; size: TALSizei; freq: TALSizei; loop: TALInt; data: TALVoid; begin if not assigned(self) then exit; new(buffer); buffer^.name := name; AlGenBuffers(1, @buffer^.id); AlutLoadWavFile(path, format, data, size, freq, loop); AlBufferData(buffer^.id, format, data, size, freq); AlutUnloadWav(format, data, size, freq); FList.Add(buffer); // --> HIER! end; Was könnte der Fehler sein? MfG |
AW: Sounds gleichzeitig abspielen
^up
ich weiss nicht was ich tun soll. Es funktioniert immer noch nicht. keine ahnung was der Fehler da oben soll. Es kann doch nicht so schwierig sein 2 wavs unabhängig von einander abzuspielen. |
AW: Sounds gleichzeitig abspielen
Es kann doch nicht so schwierig sein,
Vorschläge anzunehmen. ...sonst ist es total sinnlos, zu antworten! |
AW: Sounds gleichzeitig abspielen
^ das tue ich doch!
Ich habe es bereits mit den mediaplayern versucht, wobei diese Lösung eher weniger elegant ist (auf der vorherigen Seite beschrieben). Man kann das zwar ales konfigurueren etc., allerdings soll das ganze ja nicht nur auf meinem Computer funktionieren, sondern auf allen. Danach hab ich mir den Link von BUG angeschaut, und nen Teil von BloodyQuest übernommen, der bei mir aber nicht funktioniert!!!!! (siehe meinen vorletzten Post) Der Ansatz in BloodyQuests Game ist für mich amehesten nachzuvollziehen (eigene Sound Klasse, einfache Initialisierung mit OpenAL) und so möchte ich es auch gerne machen. Und ich fände es sehr nett, wenn mir jemand dabei helfen würde. Ich glaube es liegt daran, dass doe OpenAl.pas sowie die .dll nicht zusammen passen? (Unterschiedliche Versionen) Welche muss man denn nehmen? Hat evtl. jemand ein Programm bei dem alles zusammen passt? MfG |
AW: Sounds gleichzeitig abspielen
Probier es doch mit einem Thread,
der den Sound abspielt und dann wieder gelöscht wird. Und dann nimmst du für jeden Sound einen neuen Thread. :-D |
AW: Sounds gleichzeitig abspielen
Okay hat sich erledigt, es funktioniert nun endlich :)
So fängt das neue Jahr schon mal gut an :D Ich habe jetzt die Soundklasse aus Bloodyquests Game übernommen, so funktioniert es wudnerbar. Das Problem lag vorhin an meinen wav files, irgendwie sind die kaputt gegangen :D Ich weiss nich wie, allerdings konnte man die nicht mhr öffnen. WIe auch immer. Ein frohes neues Jahr wünsche ich euch! MfG |
AW: Sounds gleichzeitig abspielen
Hallo nochmal!
Gibt es eine Möglichkeit OpenAl einzubinden ohne, dass man es vorher installieren muss? Kann man nicht einfach die dlls ins Projektverzeichnis kopieren, so dass diese dann benutzt werden? Ich habe schon die openal32.dll und alut.dll kopiert, allerdings kommt beim Start des Programms nun die Fehlermeldung, dass OpenAl nicht initialisiert werden konnte. Braucht man noch weitere dlls dafür? Oder gibt es eine andere Möglichkeit dies zu realisieren? Danke für eure Hilfe! MfG w4rheart |
AW: Sounds gleichzeitig abspielen
Evtl. ist
![]() |
AW: Sounds gleichzeitig abspielen
Liste der Anhänge anzeigen (Anzahl: 2)
Naja, ich hatte ja schon mal mit 'nem Zaunpfahl gewunken.
Da er aber nix mit der BASS.DLL machen will, hier ein Beispiel für die Leichtigkeit mit deren Umgang im Zusammenhang mit meiner kleinen SoundFX-Unit: (Quelltexte und alles andere mit drum und dran) |
AW: Sounds gleichzeitig abspielen
Zitat:
|
AW: Sounds gleichzeitig abspielen
@lbccaleb:
"Da er aber nix mit der BASS.DLL machen will, hier ein Beispiel für die Leichtigkeit..." Du nix verstehn deutsch? |
AW: Sounds gleichzeitig abspielen
Zitat:
Auch das fett schreiben ändert nichts daran dass er die Bass.dll vermeiden möchte... |
AW: Sounds gleichzeitig abspielen
Zitat:
Das finde ich sehr schön, und es hat für mich auch funktioniert. Danke dafür! :love: Das einzige was noch fehlt ist, dass man die selbe datei (soundfile) mehrfach abspielen können müsste. Wenn man momentan mehrmals auf zum Beispiel den "Bongo" Button klickt, wird der sound abgebrochen und von vorne abgespielt. Es sollte aber so sein, dass der alte sound weiterspielt und der neue darüber. Wie kann man das noch einfügen? MfG |
AW: Sounds gleichzeitig abspielen
dann musst du 2 Channel machen und jedem der Channel 1x die Datei zum laden geben.
Bernhard |
AW: Sounds gleichzeitig abspielen
^ Tut mir leid, mit dieser Lösung bin ich so nicht einverstanden.
Das ging bei OpenAl besser, da man Buffer verwenden konnte. Ich kann kann das so nicht machen, da ich nicht weiss wie oft die Soundfile gespielt werden soll! Meistens ist es nur 1x, aber es kann vorkommen, dass es 5x übereinander abgespielt werden muss! Gibt es mit Bass nicht auch eine Möglichkeit die File zu Buffern, oder etwas Ähnliches? MfG |
AW: Sounds gleichzeitig abspielen
Ist das mit der Bass.dll nicht möglich?
Wenn ich über die Suche bass.dll und buffer eingeben finde ich nur Tuts für Webradios oder Ähnliches... Gehts oder gehts nicht? Wenn ja, wie heisst das? MfG |
AW: Sounds gleichzeitig abspielen
Doch, das geht auch mit der Bass.dll bzw. mit der BASSMIX.DLL.
Ich habe nur leider keine Zeit 'n Demo zu bauen (warscheinlich erst am WE). |
AW: Sounds gleichzeitig abspielen
^ Okay! Wäre sehr nett, wenn Du das machen könntest ;)
MfG |
AW: Sounds gleichzeitig abspielen
Gerade getestet mit Bass.dll:
BASS_ChannelPlay(SineStream1, True) //oder false BASS_ChannelPlay(SineStream2, True) //oder false BASS_ChannelPlay(SineStream3, True) //oder false geht nicht! Wenn der nächste Stream gestartet wird, bricht der laufende Stream ab. |
AW: Sounds gleichzeitig abspielen
Ich weiss zwar nicht was/wie ihr es macht, aber ich kann zur gleichen Zeit die selbe wave abspielen ohne das ein sound abbricht!
Wie wäre es wenn er, das ganze auslagert in einen SoundThread! Bei jedem Klick der ein Schuss darstellt wird ein neuer Thread gestartet! Im thread selbst, brauch er nur zu überprüfen ob der sound zu ende ist und gibt den Thread wieder Frei. Eine Rückmeldung zum MainThread benötigt er ja im Prinzip nicht. So brauch man sich keine Gedanken machen wie oft nun ein Schuss/Explosion kommt! Soll nur als Anregung dienen :wink: Gruss alfold |
AW: Sounds gleichzeitig abspielen
^Mit Threads kenne ich mich nicht so gut aus. Funktioniert das nicht einfach mit der BASS.DLL? Oder der Bassmix.dll?
Bei OpenAL ging das ja recht gut mit dem buffern... MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz