Ir para conteúdo
Fórum Script Brasil
  • 0

Wave e arquivo de recurso


kartter

Pergunta

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 para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...