Avatar billede simsen Mester
15. september 2011 - 00:13 Der er 1 løsning

Læse fra Resourcefil og afspille wave og mp3

Hej,

Jeg har nedenfor viste 2 koder, hvor jeg forsøger at aflæse res filen, jeg har oprettet og afspille henholdsvis en wave fil og en mp3 fil.

Min rc fil så ud som følgende inden jeg lavede en res fil:
Clock WAVE "C:\Users\Anja\My Documents\Koder til Internet Applikationer\Delphi\md2005code\md2005code\04\AbstractAnimalsNET\cat.wav"
MailBeep WAVE "c:\windows\media\notify.wav"
Cool AVI cool.avi
Intro RCDATA SleepAway.mp3

Når jeg forsøger at afkode og afspille wavefilen sker der intet (heller ingen fejl meddelelser). Jeg har forsøgt at gå ind med "run to curser" og forskellen fra at afspille wave filen direkte (i min udkommenteret linje) er at den sætter et tal ind i Song variablen... Skal den sætte et nummer ind (når den aflæser resourcen) eller er det teksten - hvis det er det sidste - hvor fejler jeg i min kode?

Når jeg forsøger at afkode og afspille mp3 filen, får jeg følgende fejl:
External exception C0000008 (som jeg kan google mig frem til betyder, jeg har givet en invalid handle)...Men så står jeg også af - hvad og hvor er det jeg gør noget forkert i koden?

mvh
simsen :-)

Mine koder:

procedure TForm1.Button1Click(Sender: TObject);
var
  hFind, hRes: THandle;
  Song : PChar;
begin
  hFind := FindResource(HInstance, 'MailBeep', 'WAVE');
  if hFind <> 0 then
  begin
    hRes := LoadResource(Hinstance, hFind);
    if hRes <> 0 then
    begin
      Song := LockResource(hRes);
      if Assigned(Song) then PlaySound(Song, 0, snd_Async OR snd_NODEFAULT);
      UnlockResource(hRes);
    end;
    FreeREsource(hFind);
  end;
  //PlaySound('c:\windows\media\notify.wav', 0, snd_Async OR snd_NODEFAULT)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  rStream: TResourceStream;
  fStream: TFileStream;
  fname : string;
begin
  //Extracts mp3 from exe
  fname := ExtractFileDir(Paramstr(0)) + 'SleepAway.mp3';
  rStream := TResourceStream.Create(hInstance, 'Intro', RT_RCDATA);
  try
    fStream := TFileStream.Create(fname, fmCreate);
    try
      fStream.CopyFrom(rStream, 0);
    finally
      fStream.Free
    end;
  finally
    fStream.Free
  end;
  //Play mp3
  MediaPlayer1.Close;
  MediaPlayer1.FileName := fname;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
  {MediaPlayer1.Close;
  MediaPlayer1.FileName := 'SleepAway.mp3';
  MediaPlayer1.Open;
  MediaPlayer1.Play;}
end;
Avatar billede simsen Mester
15. september 2011 - 11:38 #1
MP3 delen var fejlen, at jeg i finally havde skrevet:

fStream.Free

Det skal være rStream.Free;

Wave delen skal jeg bruge:

if Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory);

Dette undrer mig bare en lille smule, for jeg har googlet mig frem til at SndPlaySound er outdatet og man i stedet skal bruge PlaySound (som dog også kan bruges hvis man skriver stien til wave filen og ikke bruger resource stien).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester