Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi .XM Datei als Resource laden (https://www.delphipraxis.net/151392-xm-datei-als-resource-laden.html)

Alois 16. Mai 2010 07:54


.XM Datei als Resource laden
 
Hallo,

wenn ich über die bass.dll ein .XM Musikstück direkt von einer Datei abspiele funktioniert es.
Meine versuche es als Resource einzubinden und abzuspielen schlagen fehl. Hat jemand eine eine Idee was ich falsch mache?

so geht's:
Delphi-Quellcode:
BASS_Init(-1, 44100, 0, 0, nil);
XMFileName := ExtractFilePath(ParamStr(0)) + 'music.xm';
XMStream := BASS_MusicLoad(False, PChar(XMFileName), 0, 0,
   bass.BASS_MUSIC_STOPBACK or bass.BASS_MUSIC_RAMP, 0);
und so geht's nicht:
Delphi-Quellcode:
{$R Chiptunes.RES}

...

function TformAbout.LoadFromResourceID(ResourceID: Integer;
  ResourceTyp: PChar): Pointer;
var
  HResInfo: HRSRC;
  HGlobal: THandle;
begin
  HResInfo := FindResource(HInstance, MAKEINTRESOURCE(ResourceID), ResourceTyp);
  HGlobal := LoadResource(HInstance, HResInfo);
  if HGlobal = 0 then
    raise EResNotFound.Create('Can''t load resource: ' + IntToStr(ResourceID));
  Result := LockResource(HGlobal);
end;

...

BASS_Init(-1, 44100, 0, 0, nil);
XMStream := BASS_MusicLoad(False, LoadFromResourceID(100, RT_RCDATA), 0, 0, BASS_MUSIC_STOPBACK or BASS_MUSIC_RAMP, 0);
Den Resource-Stream lade ich über die Chiptunes.rc Datei die ich vorher mit BRCC32.exe Chiptunes.rc generiert habe:
Delphi-Quellcode:
100 RCDATA DISCARDABLE "music.xm"
Gruss Alois ;)

Luckie 16. Mai 2010 08:06

Re: .XM Datei als Resource laden
 
Befindet sich die Datei auch wirklich in der Ressource? Hast du das mal mit einem Ressourceneditor überprüft? Wird sie aus der Ressource auch korrekt extrahiert? Befindet sie sich dann auch auf der Festplatte als Datei (vollständig und unbeschädigt)? Befindet sie sich an der gewünschten Stelle*?

Gibt es irgendwelche Fehlermeldungen von der bass.dll?

Das würde mir jetzt mal so als Fehlerquelle einfallen.

*) Wobei das Anwendungsverzeichnis, wie bei dir, nicht sehr günstig ist, da dort dem Anwender eventuell Schreibrechte fehlen, um die Datei dort erstellen zu können.

Alois 16. Mai 2010 08:13

Re: .XM Datei als Resource laden
 
Ich habe versuchsweise mal einen Pointer erstellt und mir den Memory-Dump dazu angesehen. Der Pointer verweist auf den Speicherinhalt der Musikdatei.

Delphi-Quellcode:
var
  TestPtr: Pointer;

...

TestPtr := LoadFromResourceID(100, RT_RCDATA);
XMStream := BASS_MusicLoad(False, TestPtr, 0, 0, BASS_MUSIC_STOPBACK or BASS_MUSIC_RAMP, 0);
Fehlermeldungen von bass.dll gibt es keine.

Gruss Alois ;)

Alois 16. Mai 2010 09:42

Re: .XM Datei als Resource laden
 
Ich habe einen Link gefunden der mich weiter gebracht hat.
Und so geht's:

Chiptunes.RC
Delphi-Quellcode:
XMMUSIC RCDATA "music.xm"
Ausschnitt aus dem Programm:
Delphi-Quellcode:
Resource := TResourceStream.Create(HInstance, PChar('XMMUSIC'), RT_RCDATA);
GetMem(Data, Resource.Size);
Resource.Read(Data^, Resource.Size);
XMStream := BASS_MusicLoad(True, Data, 0, Resource.Size, BASS_MUSIC_STOPBACK or BASS_MUSIC_RAMP, 0);
BASS_ChannelPlay(XMStream, True);
FreeMem(Data);
FreeAndNil(Resource);
Gruss Alois ;)

Alois 16. Mai 2010 10:09

Re: .XM Datei als Resource laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und im Anhang eine kleine Demo:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz