kartter Posted April 23, 2012 Report Share Posted April 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 Quote Link to comment Share on other sites More sharing options...
0 Churc Posted April 24, 2012 Report Share Posted April 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 Quote Link to comment Share on other sites More sharing options...
0 kartter Posted April 24, 2012 Author Report Share Posted April 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" Quote Link to comment Share on other sites More sharing options...
0 Churc Posted April 24, 2012 Report Share Posted April 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? Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted April 25, 2012 Report Share Posted April 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 Quote Link to comment Share on other sites More sharing options...
0 chai0304 Posted May 3, 2012 Report Share Posted May 3, 2012 Funcionou igual a minha rotina. Quote Link to comment Share on other sites More sharing options...
0 António44 Posted May 21, 2012 Report Share Posted May 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 Quote Link to comment Share on other sites More sharing options...
Question
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 to comment
Share on other sites
6 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.