Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sounds gleichzeitig abspielen (https://www.delphipraxis.net/156882-sounds-gleichzeitig-abspielen.html)

w4rheart 18. Dez 2010 19:11

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

turboPASCAL 18. Dez 2010 19:27

AW: Sounds gleichzeitig abspielen
 
Zitat:

Wie mache ich das am besten? Bass.dll würde ich am liebsten vermeiden.
Dann nimm Bei Google suchenfmod. :stupid: ;)

An ansonsten mit waveoutopen, waveoutwrite etc. pp. das Rad neu erfinden.

hathor 18. Dez 2010 19:44

AW: Sounds gleichzeitig abspielen
 
Der Mediaplayer kann als Komponente mehrfach ins Programm eingebunden werden und funktioniert parallel und unabhängig.

w4rheart 18. Dez 2010 20:18

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

lbccaleb 18. Dez 2010 21:06

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von w4rheart (Beitrag 1069294)
Muss/kann ich dann immer einen neuen mediaplayer erstellen?

MfG

Klar, aber irgendwann ist der Speicher voll... ...was allerdings seine Zeit brauchen wird :)

w4rheart 18. Dez 2010 21:55

AW: Sounds gleichzeitig abspielen
 
Wie funktioniert das ganz denn?
ich kenne mich mit Mediaplayern etc. nicht aus.

Kann da jemand evtl. ein Biespiel posten?

w4rheart 19. Dez 2010 14:44

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?

lbccaleb 19. Dez 2010 15:05

AW: Sounds gleichzeitig abspielen
 
Na genauso wie andere Komponenten auch:

Delphi-Quellcode:
var
MediaPlayer: TMediaPlayer;

MediaPlayer := TMediaPlayer.Create(Application);
MediaPlayer.Parent := Self;
...

w4rheart 23. Dez 2010 02:21

AW: Sounds gleichzeitig abspielen
 
Hallo,

Ich habe nun folgendes entdeckt:
OpenAL

inklusive Links zu Tutorials:
http://www.noeska.com/doal/tutorials.aspx

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

w4rheart 24. Dez 2010 15:43

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:
..
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;
MfG

smart 24. Dez 2010 22:25

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von w4rheart (Beitrag 1070359)
Sooo, Freunde der Sonne ;)
Ich habe es immer noch nicht hingekriegt :D

Hi, mal eine dumme Frage, wieso nimmst Du nicht den MediaPlayer so wie lbccaleb es Dir vorgeschlagen hat. Da hast Du überhaupt keine Probleme und kannst so viele Sounds paralel abspielen wie Du möchtest und weniger Code hast Du auch?

w4rheart 24. Dez 2010 22:45

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

Daniel Schuhmann 24. Dez 2010 22:53

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von w4rheart (Beitrag 1069288)
Wie mache ich das am besten? Bass.dll würde ich am liebsten vermeiden.

Back to the roots. Wenn Du BASS verwenden willst, dann mach es doch einfach. Für jedes abzuspielende Ereignis einen eigenen Channel erstellen und schon laufen die Sounds parallel ohne Probleme.

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 :)

smart 24. Dez 2010 23:37

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;

turboPASCAL 24. Dez 2010 23:43

AW: Sounds gleichzeitig abspielen
 
Ich so: http://www.delphipraxis.net/1069276-post2.html

hathor 25. Dez 2010 02:02

AW: Sounds gleichzeitig abspielen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hathor (Beitrag 1069293)
Der Mediaplayer kann als Komponente mehrfach ins Programm eingebunden werden und funktioniert parallel und unabhängig.

Bedingung ist: Ein Soundfile darf nur einmal geöffnet werden.
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.

turboPASCAL 25. Dez 2010 15:10

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.

hathor 25. Dez 2010 17:25

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...)

BUG 25. Dez 2010 18:17

AW: Sounds gleichzeitig abspielen
 
BloodyQuest benutzt openAL, den Code kannst du dir angucken und wenn du dort einen (Code-)Happen findest, der dir schmeckt, darfst du ihn behalten.

w4rheart 31. Dez 2010 00:45

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:
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;
Ich habe Openal installiert und auch die OpenAl32.dll in das Verzeichnis kopiert, kein Erfolg.
Was könnte der Fehler sein?

MfG

w4rheart 31. Dez 2010 17:17

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.

hathor 31. Dez 2010 18:26

AW: Sounds gleichzeitig abspielen
 
Es kann doch nicht so schwierig sein,
Vorschläge anzunehmen.

...sonst ist es total sinnlos, zu antworten!

w4rheart 31. Dez 2010 18:54

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

DelphiMini 1. Jan 2011 11:05

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

w4rheart 1. Jan 2011 14:01

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

w4rheart 2. Jan 2011 00:16

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

BUG 2. Jan 2011 13:17

AW: Sounds gleichzeitig abspielen
 
Evtl. ist das hier was für dich ... steht aber unter LGPL und muss noch kompiliert werden. Die DLL findest du auf der Seite. Ausprobiert habe ich es auch nicht.

turboPASCAL 3. Jan 2011 14:40

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)

lbccaleb 3. Jan 2011 16:58

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von turboPASCAL (Beitrag 1071993)
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

Das versteh ich jetzt nicht! Die beruht doch auf der Bass.dll???

hathor 3. Jan 2011 18:44

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?

lbccaleb 3. Jan 2011 18:58

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von hathor (Beitrag 1072037)
@lbccaleb:

"Da er aber nix mit der BASS.DLL machen will, hier ein Beispiel für die Leichtigkeit..."

Du nix verstehn deutsch?

Leicht gereizt?
Auch das fett schreiben ändert nichts daran dass er die Bass.dll vermeiden möchte...

w4rheart 3. Jan 2011 19:53

AW: Sounds gleichzeitig abspielen
 
Zitat:

Zitat von turboPASCAL (Beitrag 1071993)
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)

Wow, ich habe bisher nirgends so ein leicht verständliches Beispiel mit der BASS.dll gefunden!
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

rollstuhlfahrer 3. Jan 2011 20:04

AW: Sounds gleichzeitig abspielen
 
dann musst du 2 Channel machen und jedem der Channel 1x die Datei zum laden geben.

Bernhard

w4rheart 3. Jan 2011 20:33

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

w4rheart 5. Jan 2011 15:40

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

turboPASCAL 5. Jan 2011 15:51

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).

w4rheart 6. Jan 2011 14:57

AW: Sounds gleichzeitig abspielen
 
^ Okay! Wäre sehr nett, wenn Du das machen könntest ;)

MfG

hathor 6. Jan 2011 19:40

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.

alfold 6. Jan 2011 20:18

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

w4rheart 10. Jan 2011 11:08

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.
Seite 1 von 2  1 2      

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