Problem z zasobami i odtwarzaniem wav

0

Witam.
Od razu na wstępie powiem że delphi i pascal to nie moje języki ;)

Mam do napisania pewien projekt. W zasobach przechowuję pliki wav i pliki jpeg. Jednak z plikami jpeg nie mam problemów.

Procedura ma za zadanie odegrać plik wav po naciśnięciu buttona. Jako że są to pliki wav a nie mp3 itd to postanowiłem zastosować funkcję PlaySound()

Zawartość procedury:

procedure Tjakrobi.bgrajClick(Sender: TObject);
begin
TResourceStream.CreateFromID(hInstance, 21, 'WAVE');
PlaySound('pies.wav', hInstance, SND_ALIAS + SND_RESOURCE);
end;

I tu na moje oko powinno działać, jednak zwraca error że zasób o id 21 nie istnieje tak samo jak bym nawet wczytywał po nazwie. Gdzie popełniam błąd ?

0

Do odtwarzania tylko mp3 czy wav polecem mimo wszystko, niż zawodnego TMediaPlayer czy kombinacje z innymi funkcjami - użyć biblioteki bass.dll. Przeanalizuj sobie kod dołączony do tego posta. Program używa bass.dll umieszczonej w zasobach dzięki modułowi dllloader.pas. Natomiast inny moduł o nazwie a_bass_lib_resource.pas - to proste użycie podstawowych możliwości wspomnianej blbioteki. Mi Kaspersky ostrzega przy uruchomieniu o podejrzanej aktywności programu. Możesz śmiało potwierdzić jeżeli Twój antywirus by też panikował albo przeanalizować wcześniej całe źródło. Nie jest to kod szkodliwy, tylko może taka metoda Hooka na myszkę się niektórym programom antywirusowym nie podoba, jednak ja zrobiłem to najprościej jak potrafiłem, bo kiedyś ktoś pytał czy da radę napisać, tak działający program.

0
Delphi help napisał(a)

SND_ALIAS
The pszSound parameter is a system-event alias in the registry or the WIN.INI file. Do not use with either SND_FILENAME or SND_RESOURCE.

Wypróbuj taką funkcję:

function PlayWaveFromResource(Wave: string): Boolean;
begin
  Result:= true;
  if FindResource(HINSTANCE, PChar(Wave), 'WAVE') <> 0
  then PlaySound(PChar(Wave), HINSTANCE, SND_RESOURCE or SND_ASYNC)
  else Result:= false;
end;

Oczywiście zakładam, ze poprawnie dodałeś pliki wave do zasobów

0

Teraz po naciśnięciu błędu nie wyświetla, nic się po prostu nie dzieje.

Zasoby dodawałem już 2 metodami plikiem brrc32 i w tym nowszym delphi można już przez program dodawać.

0

nie wiem skad wziales swoj kod, bo ja pierwsze widze rowiazanie z tym CreateFromId... i w ogole jak te dwie linijki kodu sie maja do siebie?
zerknij na: http://www.lukas-home-page.ovh.org/artykuly/delphi-zasoby.php
o ile dobrze pamietam wystarczy wlasnie zwykle:

PlaySound('NazwaZasobu', hInstance, SND_ASYNC + SND_RESOURCE);
0

Ja dodam tylko, że CreateFromID można użyć tylko jeżeli zasoby są odpowiednio zidentowane w pliku *.rc. Na przykład kiedyś zrobilem prostą bazę cheatow do gier na podstawie znalezionych w sieci cheatów i wpisy tam wyglądały tak...

#1  rcdata  "CHT\cht_001.txt"
#2  rcdata  "CHT\cht_002.txt"
#3  rcdata  "CHT\cht_003.txt"

Cheatów było 1604 i program powstawał jeszcze w Delphi 3, ale wtedy właśnie wyczytałem w pomocy, że CreateFromID inaczej używa pamięć przy wczytywaniu zaosbów i to mi pomogło, bo wcześniej przy zwykłym Create kiedy zasobów było tak na oko więcej niż tysiąć to exek nie dał się uruchomić i sypało błędami. Także ważny jest sposób podania nazwy zasobu oraz jego typu przede wszystkim.

0

huh tyle kombinowania a zadziałało na:

PlaySound('mp3\pies.wav',hInstance,SND_ASYNC or SND_ALIAS); 

Jednak mój błąd to odczytuje nadal z katalogu, nie z zasobów. Nie wiem czemu nadal wywala mi błąd że plik w zasobach nie istnieje.

21 WAVE "mp3\pies.wav" 

1 użytkowników online, w tym zalogowanych: 0, gości: 1