ACMOut1.Close; 해봤자 현재 사운드를 재생하는 놈은 PlayWaveStream에서 생성된 TACMOut.Create(nil) 이놈이니까요...
왜 이런식으로 했는지는 잘 모르겠지만... 암튼... PlayWaveStream이란 함수가 TForm1의 메소드가 아니니까 중지했는지의 여부를 알 수 있는 전역변수를 하나 생성하세요... PlayWaveStream에서는 이 전역변수의 상태에 따라서 중지하시면 됩니다. PlayWaveStream에서 생성한 TACMOut객체를 해제를 안하셨네요... 메모리누수의 원인입니다...
var
Form1: TForm1;
CanStopWave: Boolean;
procedure TForm1.Button1Click(Sender: TObject);
begin // 재생
CanStopWave := False;
try
ACMConvertor1.ChooseFormatOut(True);
PlayWaveStream(OpenFile,1024,ACMConvertor1.FormatOut);
except
showmessage('지원하지 않는 파일형식');
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin // 중지
CanStopWave := True;
end;
procedure PlayWaveStream(Stream:TStream;Size:integer;aFormat:TACMWaveFormat);
var
data:PChar;
gauage,buffersize:integer;
begin
Stream.Position := 0;
buffersize := 1024;
gauage := 0;
GetMem(data,buffersize);
With TACMOut.Create(nil) Do
begin
Open(aFormat);
while gauage <= Stream.Size do
begin
if CanStopWave then
begin
Close; // 중지
Break;
end;
Stream.Read(data^,buffersize);
Play(data^,buffersize);
gauage := gauage + buffersize;
end;
흠... 중지가 안되는것은 당연합니다. A란놈으로 재생하고 B란놈으로 중지시킬려고 하니까 그런검니다...
ACMOut1.Close; 해봤자 현재 사운드를 재생하는 놈은 PlayWaveStream에서 생성된 TACMOut.Create(nil) 이놈이니까요...
왜 이런식으로 했는지는 잘 모르겠지만... 암튼... PlayWaveStream이란 함수가 TForm1의 메소드가 아니니까 중지했는지의 여부를 알 수 있는 전역변수를 하나 생성하세요... PlayWaveStream에서는 이 전역변수의 상태에 따라서 중지하시면 됩니다. PlayWaveStream에서 생성한 TACMOut객체를 해제를 안하셨네요... 메모리누수의 원인입니다...
var
Form1: TForm1;
CanStopWave: Boolean;
procedure TForm1.Button1Click(Sender: TObject);
begin // 재생
CanStopWave := False;
try
ACMConvertor1.ChooseFormatOut(True);
PlayWaveStream(OpenFile,1024,ACMConvertor1.FormatOut);
except
showmessage('지원하지 않는 파일형식');
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin // 중지
CanStopWave := True;
end;
procedure PlayWaveStream(Stream:TStream;Size:integer;aFormat:TACMWaveFormat);
var
data:PChar;
gauage,buffersize:integer;
begin
Stream.Position := 0;
buffersize := 1024;
gauage := 0;
GetMem(data,buffersize);
With TACMOut.Create(nil) Do
begin
Open(aFormat);
while gauage <= Stream.Size do
begin
if CanStopWave then
begin
Close; // 중지
Break;
end;
Stream.Read(data^,buffersize);
Play(data^,buffersize);
gauage := gauage + buffersize;
end;
Free; // 메모리에서 해제
end;
end;
^^ 항상 즐코하세요...