AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Mehrere WAV aus Resource gleichzeitig abspielen
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere WAV aus Resource gleichzeitig abspielen

Ein Thema von Danny92 · begonnen am 6. Aug 2017 · letzter Beitrag vom 14. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#1

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 7. Aug 2017, 13:26
Doch schon, aber ich habe darauf gewartet, dass du etwas zeigst wie du etwas versucht hast.

Schau dir mal die Doku zu BASS_StreamCreateFile an:
https://www.un4seen.com/doc/#bass/BA...reateFile.html
Speziell den ersten und vierten Parameter. Da sollte dir etwas auffallen.

Erklärung zum vierten Parameter:
Wenn du nur einen Pointer auf einen Speicherbereich übergibst, kann BASS anders als bei einer Datei nicht selbst feststellen wie lang dieser Speicherbereich ist.

Außerdem fehlt die Fehlerauswertung. Dazu steht da auch ein Hinweis drin:
Zitat:
Return value
If successful, the new stream's handle is returned, else 0 is returned. Use BASS_ErrorGetCode to get the error code.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 7. Aug 2017, 13:41
procedure TForm1.FormCreate(Sender: TObject);
var
rs: TResourceStream;
begin
rs:=TResourceStream.Create(hInstance,'intro','WAV' );
rs.Position:=0;
strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Si ze,0);
BASS_ChannelPlay(handle,false);
rs.Free;
end;

Sieht das so besser aus?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#3

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 7. Aug 2017, 13:58
Auf den ersten Blick ja, aber du solltest noch den Rückgabewert prüfen und ggf. den Fehlercode abrufen, wenn es nicht geklappt hat.

Dann kommen wir zum nächsten Befehl. Aktuell übergibst du das Handle des Formulars an BASS_ChannelPlay. Das macht keinen Sinn, meinst du nicht auch?
http://www.un4seen.com/doc/#bass/BASS_ChannelPlay.html
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 7. Aug 2017, 14:06
procedure TForm1.FormCreate(Sender: TObject);
var
rs: TResourceStream;
code: bool;
begin
rs:=TResourceStream.Create(hInstance,'intro','WAV' );
rs.Position:=0;
strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Si ze,0);
//BASS_ErrorGetCode;
code:=BASS_ChannelPlay(strs,false);
showmessage(inttostr(integer(code)));
rs.Free;
end;

Also würde das in etwa so aussehen? Wenn ich die Rückmeldung ausgebe, kommt 0 zurück. Scheint also alles in Ordnung zu sein? Höre aber trotzdem nichts...ich seh's nicht.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.088 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 8. Aug 2017, 00:46
procedure TForm1.FormCreate(Sender: TObject);
var
rs: TResourceStream;
code: bool;
begin
rs:=TResourceStream.Create(hInstance,'intro','WAV' );
rs.Position:=0;
strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Si ze,0);
//BASS_ErrorGetCode;
code:=BASS_ChannelPlay(strs,false);
showmessage(inttostr(integer(code)));
rs.Free;
end;

Also würde das in etwa so aussehen? Wenn ich die Rückmeldung ausgebe, kommt 0 zurück. Scheint also alles in Ordnung zu sein? Höre aber trotzdem nichts...ich seh's nicht.
Na ja, wenn du die Meldung ausgibst und da 0 zurückkommt, dann bedeutet das, dass BASS_ChannelPlay False zurückgegeben hat, und das würde ich so interpretieren dass da etwas NICHT in Ordnung ist.
Ich weiß aber nicht, was das falsch ist.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#6

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 8. Aug 2017, 03:24
Welchen Wert hat denn strs?
Das ist ja erst einmal wichtig um zu schauen, ob das Laden erfolgreich war.
Denn ich sehe kein BASS_Init, so dass dort ggf. als Fehler auftritt, dass das nicht aufgerufen wurde.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 9. Aug 2017, 00:23
Ja die BASS_Init hat noch gefehlt. Jetzt spielt es.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs:=TResourceStream.Create(hInstance,'intro','WAV');
  Bass_Init(-1,44100,0,Application.Handle,nil);
  rs.Position:=0;
  strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Size,0);
  BASS_ChannelPlay(strs,false);
  rs.Free;
end;
Noch eine letzte Frage: Sieht das soweit in Ordnung aus? Programmiertechnisch betrachtet Die Rückgabewerte brauch ich für den Fall ja eigentlich nicht wirklich oder? Wie würde das sonst eleganterweise aussehen? Und wenn ich bei ChannelPlay den zweiten Parameter Restart auf true setze, spielt es trotzdem nur einmal. Bestimmt hab ich da was übersehen?

Auf jeden Fall ein großes Danke!

Geändert von Danny92 ( 9. Aug 2017 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 9. Aug 2017, 08:37
Rückgabewerte von Funktionen die einem einen Fehlercode liefern sollte man immer auswerten um im Programmablauf entsprechend darauf reagieren zu können.

Irgendwann versucht du bspw. mal eine Datei abzuspielen die defekt ist. Wenn du die Rückgabewerte jetzt nicht auswertest und entsprechende Fehlermeldungen anzeigst/protokollierst, dann wunderst du dich warum kein Sound kommt. Wenn du dann irgendwann darauf kommst das die Datei defekt ist, dann sagst du dir: "Wieso habe ich damals in mein Programm keine Fehlerbehandlung eingebaut?! Dann wäre mir die halbe Stunde Suche erspart geblieben!"


Und ein Hinweis: Fasse SourceCode doch bitte in Delphi-Tags ein (das Delphi Helm Symbol über dem Editor). Dein SourceCode sieht dann gleich viel besser aus und lässt sich auch viel leichter lesen.

Code:
[DELPHI]
  SourceCode hier
[/DELPHI]
Beispiel wie dein SourceCode dann aussehen würde:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs:=TResourceStream.Create(hInstance,'intro','WAV' );
  Bass_Init(-1,44100,0,Application.Handle,nil);
  rs.Position:=0;
  strs:=BASS_StreamCreateFile(true,rs.Memory,0,rs.Si ze,0);
  BASS_ChannelPlay(strs,false);
  rs.Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 10. Aug 2017, 13:11
Ok das hab ich soweit verstanden.

Nun noch das letzte Problem: Die bass.dll wird ja noch verwendet. Die muss ich in die Resource als RCDATA mit einbinden zum kompilieren, was ich schon mal getan habe.
Wie kann ich nun zur Laufzeit auf diese zugreifen?

Ich hab schon einiges mit PBTMemoryModule ausprobiert, wo mir Delphi aber nicht wirklich weiterhilft.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: byte;
  ms: TMemoryStream;
  rs: TResourceStream;
  m_DLLDataSize: int64;
  mp_DllData: Pointer;
  btMM: PBTMemoryModule;
begin
  if 0 <> FindResource(hInstance, 'DllDatei', RT_RCDATA) then
  begin
    rs := TResourceStream.Create(hInstance, 'DllDatei', RT_RCDATA);
    ms := TMemoryStream.Create;
    try
      ms.LoadFromStream(rs);

      ms.Position := 0;
      m_DllDataSize := ms.Size;
      mp_DllData := GetMemory(m_DllDataSize);

      ms.Read(mp_DllData^, m_DllDataSize);
    finally
      ms.Free;
      rs.Free;
    end;
  end;
**btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
**try
****if btMM = nil then Abort;
****@m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd');
****if @m_TestCallstd = nil then Abort;
****m_TestCallstd('Das ist ein DLL-Speicher Aufruf!');
**except
****Showmessage(Ein Fehler ist enstanden bei Aufruf der DLL : ' + BTMemoryGetLastError);
end;
if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
end;
Sowas hab ich schon gefunden, Delphi kann mit PBTMemoryModule nix anfangen.

Kann mir da noch jemand helfen bitte?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#10

AW: Mehrere WAV aus Resource gleichzeitig abspielen

  Alt 10. Aug 2017, 13:34
Google hilft:
https://github.com/DSPlayer/memorymodule

Aber gerade bei einem Spiel sehe ich die Notwendigkeit nicht. Da ist es doch eher komisch, wenn nicht noch DLLs und andere Dateien neben der Exe liegen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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