Do odtworzenia mp3 lub modułu z zasobów wykorzystaj poniższy kod. To unit zawierający najprostsze
funkcje do odtworzenia plików wav/mp3/ogg lub modułu mod/s3m/it/xm z dysku lub z zasobów. Jeżeli
odtwarzasz plik z zasobów to musi on być dołączony oczywiście do źródla, a wcześniej stworzony przy
użyciu brcc2.exe z podkatalogu bin. A plik rc musi wyglądać na przykład tak jak tutaj poniżej pokazuje:
nazwa_zasobu rcdata "DANE\plik.mp3"
I teraz jeżeli funkcja InicjujBibliotekeBass zwróci True to odtwarzasz mp3 lub wav z zasobów używając
do tego procedury OdtwarzajDzwiekZasoby. Oczywiście moduł nie korzysta ze wszystkich możliwości w
jakie wyposażono bass.dll. Więcej przykładów także w Delphi i samą bibliotekę, znajdziesz na stronie:
http://un4seen.com/download.php?bass24 a jeżeli chodzi o odtarzanie bez użycia biblioteki to nie za
bardzo wiem, nie mam też pomysłu jak odtworzyć filmik z zasobów, lecz pewnie i do tego są biblioteki.
unit bassfile;
interface
uses
Forms, Windows, Dialogs, SysUtils;
const
Sound_Dll_Nazwa = 'bass.dll';
BASS_SAMPLE_LOOP = 4;
BASS_MUSIC_RAMPS = $400;
BASS_STREAM_PRESCAN = $20000;
BASS_MUSIC_PRESCAN = BASS_STREAM_PRESCAN;
type
HMUSIC = DWORD;
HSTREAM = DWORD;
BOOL = LongBool;
{$WARNINGS OFF}
var
Chn : DWord;
Dll_H : THandle;
MyResource : HRSRC;
MyGlobal : HGLOBAL;
PResource : Pointer;
ResSize : Integer;
BASS_Init : function(device : Integer; freq, flags : DWORD; win : HWND; clsid : PGUID) : BOOL; stdcall;
BASS_MusicLoad : function(mem : BOOL; f : Pointer; offset, length, flags, freq : DWORD) : HMUSIC; stdcall;
BASS_StreamCreateFile : function(mem : BOOL; f : Pointer; offset, length, flags : DWORD) : HSTREAM; stdcall;
BASS_ChannelPlay : function(handle : DWORD; restart : BOOL) : BOOL; stdcall;
BASS_ChannelStop : function(handle : DWORD) : BOOL; stdcall;
BASS_Free : function : BOOL; stdcall;
function InicjujBibliotekeBass : boolean;
procedure ZwolnijBibliotekeBass;
procedure OdtwarzajDzwiekPlik(NazwaPliku : PChar; CzyLoop : boolean);
procedure OdtwarzajModulPlik(NazwaPliku : PChar; CzyLoop : boolean);
procedure OdtwarzajDzwiekZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
procedure OdtwarzajModulZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
procedure ZatrzymajOdtwarzanie;
implementation
function InicjujBibliotekeBass : boolean;
begin
Result := True;
if not FileExists(Sound_Dll_Nazwa) then
begin
Result := False;
MessageBox(Application.Handle,
PChar('Nie można znaleźć pliku: ' + Sound_Dll_Nazwa + '!' + #13#10 +
'Odtwarzanie dźwieków nie będzie możliwe.'),
PChar(Application.Title), MB_OK + MB_ICONERROR);
Exit;
end;
Dll_H := LoadLibrary(PChar(Sound_Dll_Nazwa));
if Dll_H = 0 then
begin
Result := False;
MessageBox(Application.Handle,
PChar('Nie można załadować pliku: ' + Sound_Dll_Nazwa + '!' + #13#10 +
'Odtwarzanie dźwieków nie będzie możliwe.'),
PChar(Application.Title), MB_OK + MB_ICONERROR);
Exit;
end;
BASS_Init := GetProcAddress(Dll_H, 'BASS_Init');
BASS_MusicLoad := GetProcAddress(Dll_H, 'BASS_MusicLoad');
BASS_StreamCreateFile := GetProcAddress(Dll_H, 'BASS_StreamCreateFile');
BASS_ChannelPlay := GetProcAddress(Dll_H, 'BASS_ChannelPlay');
BASS_ChannelStop := GetProcAddress(Dll_H, 'BASS_ChannelStop');
BASS_Free := GetProcAddress(Dll_H, 'BASS_Free');
if (@BASS_Init = nil)
or (@BASS_MusicLoad = nil)
or (@BASS_StreamCreateFile = nil)
or (@BASS_ChannelPlay = nil)
or (@BASS_ChannelStop = nil)
or (@BASS_Free = nil) then
begin
Result := False;
MessageBox(Application.Handle,
PChar('Nieprawidłowa biblioteka: ' + Sound_Dll_Nazwa + '!' + #13#10 +
'Odtwarzanie dźwieków nie będzie możliwe.'),
PChar(Application.Title), MB_OK or MB_ICONERROR);
Exit;
end;
if not BASS_Init(-1, 44100, 0, Application.Handle, nil) then
begin
Result := False;
MessageBox(Application.Handle,
'Błąd podczas inicjalizacji audio!',
PChar(Application.Title), MB_OK + MB_ICONERROR);
Exit;
end;
end;
procedure ZwolnijBibliotekeBass;
begin
BASS_Free;
FreeLibrary(Dll_H);
end;
procedure OdtwarzajDzwiekPlik(NazwaPliku : PChar; CzyLoop : boolean);
var
Loopowanie : integer;
SoundFileName : PChar;
begin
if (CzyLoop = True) then
begin
Loopowanie := BASS_SAMPLE_LOOP;
end
else
begin
Loopowanie := 0;
end;
SoundFileName := NazwaPliku;
Chn := BASS_StreamCreateFile(False, SoundFileName, 0, 0, Loopowanie);
BASS_ChannelPlay(Chn, False);
end;
procedure OdtwarzajModulPlik(NazwaPliku : PChar; CzyLoop : boolean);
var
Loopowanie : integer;
ModuleFileName : PChar;
begin
if (CzyLoop = True) then
begin
Loopowanie := BASS_SAMPLE_LOOP;
end
else
begin
Loopowanie := 0;
end;
ModuleFileName := NazwaPliku;
Chn := BASS_MusicLoad(False, ModuleFileName, 0, 0, Loopowanie, 0);
BASS_ChannelPlay(Chn, False);
end;
procedure OdtwarzajDzwiekZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
var
Loopowanie : integer;
SoundResourceName : PChar;
begin
if (CzyLoop = True) then
begin
Loopowanie := BASS_SAMPLE_LOOP;
end
else
begin
Loopowanie := 0;
end;
SoundResourceName := NazwaZasobu;
MyResource := FindResource(HInstance, SoundResourceName, RT_RCDATA);
if MyResource = 0 then
begin
MessageBox(Application.Handle,
'Nie można znaleźć zasobu z dźwiękiem!',
PChar(Application.Title), MB_OK + MB_ICONWARNING);
Exit;
end;
MyGlobal := LoadResource(HInstance, MyResource);
PResource := LockResource(MyGlobal);
ResSize := SizeOfResource(HInstance, MyResource);
Chn := BASS_StreamCreateFile(True, PResource, 0, ResSize, Loopowanie);
BASS_ChannelPlay(Chn, False);
FreeResource(MyGlobal);
end;
procedure OdtwarzajModulZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
var
Loopowanie : integer;
ModuleResourceName : PChar;
begin
if (CzyLoop = True) then
begin
Loopowanie := BASS_SAMPLE_LOOP;
end
else
begin
Loopowanie := 0;
end;
ModuleResourceName := NazwaZasobu;
MyResource := FindResource(HInstance, ModuleResourceName, RT_RCDATA);
if MyResource = 0 then
begin
MessageBox(Application.Handle,
'Nie można znaleźć zasobu z modułem muzycznym!',
PChar(Application.Title), MB_OK + MB_ICONWARNING);
Exit;
end;
MyGlobal := LoadResource(HInstance, MyResource);
PResource := LockResource(MyGlobal);
ResSize := SizeOfResource(HInstance, MyResource);
Chn := BASS_MusicLoad(True, PResource, 0, ResSize, Loopowanie, 0);
BASS_ChannelPlay(Chn, False);
FreeResource(MyGlobal);
end;
procedure ZatrzymajOdtwarzanie;
begin
BASS_ChannelStop(Chn);
end;
{$WARNINGS ON}
end.