kartter Postado Abril 23, 2012 Denunciar Share Postado Abril 23, 2012 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 24, 2012 Denunciar Share Postado Abril 24, 2012 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') thenshowmessage('aee') elseshowmessage(':(');testa ai não pude testar porque to sem delphi aqui...abrs Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kartter Postado Abril 24, 2012 Autor Denunciar Share Postado Abril 24, 2012 Churc,Funcionou igual a minha rotina. Na primeira vez que chamo if playInside('nome do recurso') thenele toca o wave, porém se chamo novamente, já não toca mais, apesar da linha acima sempre retornar "True" Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Abril 24, 2012 Denunciar Share Postado Abril 24, 2012 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 25, 2012 Denunciar Share Postado Abril 25, 2012 experimente assimuses 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 chai0304 Postado Maio 3, 2012 Denunciar Share Postado Maio 3, 2012 Funcionou igual a minha rotina. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Maio 21, 2012 Denunciar Share Postado Maio 21, 2012 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
kartter
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
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.