Jump to content
Fórum Script Brasil
  • 0

Wave e arquivo de recurso


kartter

Question

Boa tarde pessoal,

Criei um arquivo de recurso que contêm alguns waves que minha aplicação utiliza.

Para executar o wave eu utilizo:

PlaySound(PChar('ABC'),HInstance, snd_ASync or snd_Memory or snd_Resource);

onde ABC é o apelido criado no arquivo de recurso.

Funciona perfeitamente, porém só funciona na primeira execução. Se eu tentar executar esta linha várias vezes, ele só executa o WAV na primeira vez.

Alguém sabe porque isto acontece?

Abraços

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

function playInside(const szName: String): Boolean;
var
  FindHandle, ResHandle: THandle;
  ResPtr: Pointer;
begin
  Result := False;
  FindHandle := FindResource(HInstance, szName, 'WAVE');
  Result := LongBool(FindHandle);
  if  then
  begin
    ResHandle := LoadResource(HInstance, FindHandle);
    Result := LongBool(ResHandle); 
    if (Result) then
    begin
      ResPtr := LockResource(ResHandle);
      if Assigned(ResPtr) then
        SndPlaySound(PChar(ResPtr), snd_ASync or snd_Memory);
      UnlockResource(ResHandle);
    end;
    FreeResource(FindHandle);
  end;
end;

if playInside('nome do recurso') then

showmessage('aee') else

showmessage(':(');

testa ai não pude testar porque to sem delphi aqui...

abrs

Link to comment
Share on other sites

  • 0

Churc,

Funcionou igual a minha rotina. Na primeira vez que chamo

if playInside('nome do recurso') then

ele toca o wave, porém se chamo novamente, já não toca mais, apesar da linha acima sempre retornar "True"

Link to comment
Share on other sites

  • 0

Hmm... essa função está completa tipo carregando em tempo de execução e limpando da memória...

Por isso pensei que resolveria, limpando da memória estaria livre para tocar novamente...

Só por testes, já tentou em outro computador?

Link to comment
Share on other sites

  • 0

experimente assim

uses mmsystem;

 procedure TForm1.Button1Click(Sender: TObject);
 var
   hFind, hRes: THandle;
   Song: PChar;
 begin
  hFind := FindResource(HInstance, 'ABC', 'WAVE');
  if hFind <> 0 then begin
    hRes:=LoadResource(HInstance, hFind);
    if hRes <> 0 then begin
      Song:=LockResource(hRes);
      if Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory);
      UnlockResource(hRes);
    end;
    FreeResource(hFind);
  end;
 end;

abraço

Link to comment
Share on other sites

  • 0

Para arquivos WAV, nós precisamos um indicador para o recurso carregado na memória,nós precisamos carregar usando o API:

function GetResourceAsPointer(ResName: pchar; ResType: pchar;

                                out Size: longword): pointer;

  var

    InfoBlock: HRSRC;

    GlobalMemoryBlock: HGLOBAL;

  begin

    InfoBlock := FindResource(hInstance, resname, restype);

    if InfoBlock = 0 then

      raise Exception.Create(SysErrorMessage(GetLastError));

    size := SizeofResource(hInstance, InfoBlock);

    if size = 0 then

      raise Exception.Create(SysErrorMessage(GetLastError));

    GlobalMemoryBlock := LoadResource(hInstance, InfoBlock);

    if GlobalMemoryBlock = 0 then

      raise Exception.Create(SysErrorMessage(GetLastError));

    Result := LockResource(GlobalMemoryBlock);

    if Result = nil then

      raise Exception.Create(SysErrorMessage(GetLastError));

  end;



  function GetResourceAsString(ResName: pchar; ResType: pchar): string;

  var

    ResData: PChar;

    ResSize: Longword;

  begin

    ResData := GetResourceAsPointer(resname, restype, ResSize);

    SetString(Result, ResData, ResSize);

  end;
procedure TForm1.FormCreate(Sender: TObject);

  var
    sample_wav: pointer;
    size: longword;

  begin
    sample_wav := GetResourceAsPointer('ABC', 'wave', size);

  end;
Uma vez que nós temos o recurso wave carregado na memória, nós podemos tocá-lo quantas vezes quisermos usando o API sndPlaySound declarado na unidade MMSystem:

procedure TForm1.Button1Click(Sender: TObject);
  begin
    sndPlaySound(sample_wav, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);


  end;

Pode ser que ajude.

Abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...