Q&A

...............
1  COMMENTS
  • Profile
    최용일 2004.05.18 23:01
    안녕하세요. 최용일입니다.

    흠... 중지가 안되는것은 당연합니다. 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;

    ^^ 항상 즐코하세요...