Q&A

  • 하이텔에서 구한 강좌인데, 한번 봐 주세요...
안녕하세요.. 사운드 녹음과 재생이라는 제목으로 올라온 강좌의 예제 입니다.

근데, 컴파일이 안되서요...

이걸 Delphi 1, 2 버전이라는데..... 저는 지금 Delphi 5 로 작업하고 있거든요..

어디를 고쳐야 하는지.. 아니면, 폼에 빠진게 있는지... 여러분의 도움을 부탁드립니다.



-------------------------------------------------------------------

Echo1.pas

-------------------------------------------------------------------

unit echo1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

MMSystem, WinTypes, WinProcs;



const

memBlockLength = 500;

type

Tmemblock = array[0..memblocklength] of byte;

PmemBlock = ^TmemBlock;



TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

private

{ Private declarations }

HwaveIn : PHWaveIn;

HWaveOut : PHWaveOut;

close_invoked, close_complete : boolean;

in_count, out_count : integer;

procedure MMOutDone(var msg : Tmessage);

message MM_WOM_DONE;

procedure MMInDone(var msg : Tmessage);

message MM_WIM_DATA;

public

{ Public declarations }

end;



{ TPCMWaveFormat = record

wf : TWaveFormat;

wBitsPerSample : Word;

end;

}



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

var

WaveFormat : PPCMWaveFormat;

Header : PWaveHdr;

memBlock : PmemBlock;

i, j : integer;

begin

WaveFormat := new(PPCMwaveFormat);

with WaveFormat^.wf do

begin

WFormatTag := WAVE_FORMAT_PCM;

NChannels := 1;

NSamplesPerSec := 11000;

NAvgBytesPerSec := 11000;

NBlockAlign := 1;

waveformat^.wBitsPerSample := 8;

end;



i := waveOutOpen(nil, 0, PWaveFormat(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);



if i<>0 then

application.messagebox('Error', 'Play format not supported', mb_OK);



i := waveInOpen(nil, 0, PWaveFormat(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);



if i<>0 then

application.messagebox('Error', 'Record format not supported', mb_OK);



HwaveOut := new(PHwaveOut);



i := waveOutOpen(HWaveOut, 0, Pwaveformat(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);



if i<>0 then

application.messagebox('Error', 'Problem creating play handle', mb_OK);



HwaveIn := new(PHwaveIn);

i := waveInOpen(HWaveIn, 0, Pwaveformat(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);



if i<>0 then

application.messagebox('Error', 'Problem creating record handle', mb_OK);



in_count := 0;

out_count := 0;



for j:=1 to 3 do

begin

Header := new(PWaveHdr);

memBlock := new(PmemBlock);



Header := new(PwaveHdr);

with header^ do

begin

lpdata := pointer(memBlock);

dwbufferlength := memblocklength;

dwbytesrecorded := 0;

dwUser := 0;

dwflags := 0;

dwloops := 0;

end;



i := waveInPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));



if i<>0 then

application.messagebox('In Prepare error', 'error', mb_OK);



i := waveInAddBuffer(HWaveIn^, Header, sizeof(TWaveHdr));



if i<>0 then

application.messagebox('Add buffer error', 'error', mb_OK);



inc(in_count);



end;



i := waveInStart(HwaveIn^);

if i<>0 then

application.messagebox('Start error', 'error', mb_ok);



close_invoked := false;

close_complete := false;

end;



procedure TForm1.MMOutDone(var msg:Tmessage);

var

Header : PWaveHdr;

i : integer;

begin

dec(out_count);



Header := PWaveHdr(msg.lparam);

i := waveOutUnPrepareHeader(HWaveOut^, Header, sizeof(TWavehdr));



if i<>0 then

application.messagebox('Out Un Prepare error', 'error', mb_ok);



dispose(Header^.lpdata);

dispose(Header);



if (out_count=0) then

begin

WaveOutClose(HWaveOut^);

HwaveOut := nil;

end;



if (in_count=0) and (out_count=0) then

begin

close_complete := true;

close;

end;

end;



procedure TForm1.MMInDone(var msg:Tmessage);

var

Header : PWaveHdr;

memBlock : PmemBlock;

i : integer;

begin

dec(in_count);

Header := PWaveHdr(msg.lparam);

i := waveInUnPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));



if i<>0 then

application.messagebox('In Un Prepare error', 'error', mb_ok);



if not(close_invoked) then

begin

i := waveOutPrepareHeader(HWaveOut^, Header, sizeof(TWavehdr));



if i<>0 then

application.messagebox('Out prepare error', 'error', mb_ok);



i := waveOutWrite(HWaveOut^, Header, sizeof(TWaveHdr));



if i<>0 then

application.messagebox('Wave out error', 'error', mb_ok);



inc(out_count);



Header := new(PWaveHdr);

memBlock := new(PmemBlock);



Header := new(PwaveHdr);

with header^ do

begin

lpdata := pointer(memBlock);

dwbufferlength := memblocklength;

dwbytesrecorded := 0;

dwUser := 0;

dwflags := 0;

dwloops := 0;

end;



i := waveInPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));



if i<>0 then

application.messagebox('In Prepare error', 'error', mb_ok);



i := waveInAddBuffer(HWaveIn^, Header, sizeof(TWaveHdr));



if i<>0 then

application.messagebox('Add buffer error', 'error', mb_ok);



inc(in_count);

end;



if (in_count=0) then

begin

WaveInClose(HWaveIn);

HWaveIn := nil;

end;



if (in_count=0) and (out_count=0) then

begin

close_complete := true;

close;

end;

end;





procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

if HWaveOut <> nil then

WaveOutReset(HWaveOut^);



if HwaveIn <> nil then

WaveInReset(HWaveIn^);



close_invoked := true;

canclose := close_complete;



end;



end.

----------------------------------------------------------------











3  COMMENTS
  • Profile
    최용일 2000.04.04 03:29
    델파이 5에서 데이터형이 약간 바뀌었습니다.



    WaveOutOpen에서 쓰이는 파라메터의 형이 PWaveFormat 에서 PWaveFormatEx로 바뀜



    아래와 같이 고치세요...



    > -------------------------------------------------------------------

    > Echo1.pas

    > -------------------------------------------------------------------

    > unit echo1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > MMSystem;

    ********************************************************************************

    =====> WinTypes, WinProcs; 삭제

    ********************************************************************************

    >

    > const

    > memBlockLength = 500;

    > type

    > Tmemblock = array[0..memblocklength] of byte;

    > PmemBlock = ^TmemBlock;

    >

    > TForm1 = class(TForm)

    > procedure FormCreate(Sender: TObject);

    > procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    > private

    > { Private declarations }

    > HwaveIn : PHWaveIn;

    > HWaveOut : PHWaveOut;

    > close_invoked, close_complete : boolean;

    > in_count, out_count : integer;

    > procedure MMOutDone(var msg : Tmessage);

    > message MM_WOM_DONE;

    > procedure MMInDone(var msg : Tmessage);

    > message MM_WIM_DATA;

    > public

    > { Public declarations }

    > end;

    >

    > { TPCMWaveFormat = record

    > wf : TWaveFormat;

    > wBitsPerSample : Word;

    > end;

    > }

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > var

    > WaveFormat : PPCMWaveFormat;

    > Header : PWaveHdr;

    > memBlock : PmemBlock;

    > i, j : integer;

    > begin

    > WaveFormat := new(PPCMwaveFormat);

    > with WaveFormat^.wf do

    > begin

    > WFormatTag := WAVE_FORMAT_PCM;

    > NChannels := 1;

    > NSamplesPerSec := 11000;

    > NAvgBytesPerSec := 11000;

    > NBlockAlign := 1;

    > waveformat^.wBitsPerSample := 8;

    > end;

    >

    > i := waveOutOpen(nil, 0, PWaveFormat(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);

    ********************************************************************************

    =====> i := waveOutOpen(nil, 0, PWaveFormatEx(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);

    ********************************************************************************

    >

    > if i<>0 then

    > application.messagebox('Error', 'Play format not supported', mb_OK);

    >

    > i := waveInOpen(nil, 0, PWaveFormat(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);

    ********************************************************************************

    =====> i := waveOutOpen(nil, 0, PWaveFormatEx(WaveFormat), 0, 0, WAVE_FORMAT_QUERY);

    ********************************************************************************

    >

    > if i<>0 then

    > application.messagebox('Error', 'Record format not supported', mb_OK);

    >

    > HwaveOut := new(PHwaveOut);

    >

    > i := waveOutOpen(HWaveOut, 0, Pwaveformat(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);

    ********************************************************************************

    =====> i := waveOutOpen(HWaveOut, 0, PwaveformatEx(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);

    ********************************************************************************

    >

    > if i<>0 then

    > application.messagebox('Error', 'Problem creating play handle', mb_OK);

    >

    > HwaveIn := new(PHwaveIn);

    > i := waveInOpen(HWaveIn, 0, Pwaveformat(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);

    ********************************************************************************

    =====> i := waveOutOpen(HWaveOut, 0, PwaveformatEx(WaveFormat), form1.handle, 0, CALLBACK_WINDOW);

    ********************************************************************************

    >

    > if i<>0 then

    > application.messagebox('Error', 'Problem creating record handle', mb_OK);

    >

    > in_count := 0;

    > out_count := 0;

    >

    > for j:=1 to 3 do

    > begin

    > Header := new(PWaveHdr);

    > memBlock := new(PmemBlock);

    >

    > Header := new(PwaveHdr);

    > with header^ do

    > begin

    > lpdata := pointer(memBlock);

    > dwbufferlength := memblocklength;

    > dwbytesrecorded := 0;

    > dwUser := 0;

    > dwflags := 0;

    > dwloops := 0;

    > end;

    >

    > i := waveInPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));

    >

    > if i<>0 then

    > application.messagebox('In Prepare error', 'error', mb_OK);

    >

    > i := waveInAddBuffer(HWaveIn^, Header, sizeof(TWaveHdr));

    >

    > if i<>0 then

    > application.messagebox('Add buffer error', 'error', mb_OK);

    >

    > inc(in_count);

    >

    > end;

    >

    > i := waveInStart(HwaveIn^);

    > if i<>0 then

    > application.messagebox('Start error', 'error', mb_ok);

    >

    > close_invoked := false;

    > close_complete := false;

    > end;

    >

    > procedure TForm1.MMOutDone(var msg:Tmessage);

    > var

    > Header : PWaveHdr;

    > i : integer;

    > begin

    > dec(out_count);

    >

    > Header := PWaveHdr(msg.lparam);

    > i := waveOutUnPrepareHeader(HWaveOut^, Header, sizeof(TWavehdr));

    >

    > if i<>0 then

    > application.messagebox('Out Un Prepare error', 'error', mb_ok);

    >

    > dispose(Header^.lpdata);

    > dispose(Header);

    >

    > if (out_count=0) then

    > begin

    > WaveOutClose(HWaveOut^);

    > HwaveOut := nil;

    > end;

    >

    > if (in_count=0) and (out_count=0) then

    > begin

    > close_complete := true;

    > close;

    > end;

    > end;

    >

    > procedure TForm1.MMInDone(var msg:Tmessage);

    > var

    > Header : PWaveHdr;

    > memBlock : PmemBlock;

    > i : integer;

    > begin

    > dec(in_count);

    > Header := PWaveHdr(msg.lparam);

    > i := waveInUnPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));

    >

    > if i<>0 then

    > application.messagebox('In Un Prepare error', 'error', mb_ok);

    >

    > if not(close_invoked) then

    > begin

    > i := waveOutPrepareHeader(HWaveOut^, Header, sizeof(TWavehdr));

    >

    > if i<>0 then

    > application.messagebox('Out prepare error', 'error', mb_ok);

    >

    > i := waveOutWrite(HWaveOut^, Header, sizeof(TWaveHdr));

    >

    > if i<>0 then

    > application.messagebox('Wave out error', 'error', mb_ok);

    >

    > inc(out_count);

    >

    > Header := new(PWaveHdr);

    > memBlock := new(PmemBlock);

    >

    > Header := new(PwaveHdr);

    > with header^ do

    > begin

    > lpdata := pointer(memBlock);

    > dwbufferlength := memblocklength;

    > dwbytesrecorded := 0;

    > dwUser := 0;

    > dwflags := 0;

    > dwloops := 0;

    > end;

    >

    > i := waveInPrepareHeader(HWaveIn^, Header, sizeof(TWavehdr));

    >

    > if i<>0 then

    > application.messagebox('In Prepare error', 'error', mb_ok);

    >

    > i := waveInAddBuffer(HWaveIn^, Header, sizeof(TWaveHdr));

    >

    > if i<>0 then

    > application.messagebox('Add buffer error', 'error', mb_ok);

    >

    > inc(in_count);

    > end;

    >

    > if (in_count=0) then

    > begin

    > WaveInClose(HWaveIn);

    ********************************************************************************

    =====> WaveInClose(HWaveIn^);

    ********************************************************************************

    > HWaveIn := nil;

    > end;

    >

    > if (in_count=0) and (out_count=0) then

    > begin

    > close_complete := true;

    > close;

    > end;

    > end;

    >

    >

    > procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    > begin

    > if HWaveOut <> nil then

    > WaveOutReset(HWaveOut^);

    >

    > if HwaveIn <> nil then

    > WaveInReset(HWaveIn^);

    >

    > close_invoked := true;

    > canclose := close_complete;

    >

    > end;

    >

    > end.

    > ----------------------------------------------------------------

    >

    >

    >

    >

    >

  • Profile
    이수정 2000.04.04 03:17
    안녕하세요.. 최용일님.. 정말 감사합니다.



    가르쳐 주신데로 하니까.. 컴파일이 잘 되었습니다.



    음.. 그런데, 좀 황당한것이.. 짐작은 했지만.. 폼에서 아무 동작을 할수가 없더군요...



    이걸 이용해서 녹음을 할려면... mediaplayer 컴포넌트의 녹음 부분에..

    연결 시켜 주면 되는건지...



    어떻게 하면 녹음을 할 수 있는지..



    여러가지 방안으로 해 보고 있겠습니다만...



    이글 보시고.. 아시는분 좀 알려 주세요...



    부탁 드립니다.





  • Profile
    최용일 2000.04.04 04:55
    글쿤요... 헐헐...



    저두 어떠한 일을 하는지는 잘 모르겠군요...



    폼만있구 아무것두 없으니... 녹음기의 일부분이랄수도 없구.. 쩝...



    이수정 wrote:

    > 안녕하세요.. 최용일님.. 정말 감사합니다.

    >

    > 가르쳐 주신데로 하니까.. 컴파일이 잘 되었습니다.

    >

    > 음.. 그런데, 좀 황당한것이.. 짐작은 했지만.. 폼에서 아무 동작을 할수가 없더군요...

    >

    > 이걸 이용해서 녹음을 할려면... mediaplayer 컴포넌트의 녹음 부분에..

    > 연결 시켜 주면 되는건지...

    >

    > 어떻게 하면 녹음을 할 수 있는지..

    >

    > 여러가지 방안으로 해 보고 있겠습니다만...

    >

    > 이글 보시고.. 아시는분 좀 알려 주세요...

    >

    > 부탁 드립니다.

    >

    >

    • 최종민
    • 2000.04.04 10:02
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이경문
      2000.04.19 17:15
      최종민 wrote: > 데이터 값들이 텍스트 형태로 저장되어 있습니다... > > 이 값들을 소리로 들려주기 ...
    • 최종민
      2000.04.20 08:29
      잘은 모르지만...TTS는 텍스트파일에 적혀있는 글자를... 즉 언어를 음성으로 바꾸지 않습니까... 제가 ...
    • 이경문
      2000.04.21 20:13
      글씨, 그러면 먼저 샘플링과 양자화에 대해서 아셔야 겠네요. 8000Hz 16Bit로 샘플링하는 경우에는 8000 *...
    • 정주희
    • 2000.04.04 08:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 아아 아무도 모르나요
      2000.04.05 00:05
      정주희 wrote: > 정말궁금해요 > procedure Tfrmchating1.MsgListChange(Sender: TObject); // Lstiedit...
    • 이명학
      2000.04.15 02:08
      이렇게 하시면 됩니다. 메모와 똑같이 자동으로 스크롤이 됩니다. RitchEdit1.Lines.Add(str); ...
    • 초보자
    • 2000.04.04 06:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 류종택
      2000.04.04 07:55
      Basic에서는 문자열 변수를 선언할 때.. 앞에 붙여 씁니다.. From 류.. 초보자 wrote: > 정말...
    • 정연
    • 2000.04.04 06:33
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Soona
    • 2000.04.04 06:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 류종택
      2000.04.04 07:59
      Var Ch : Char; bTemp, LowBit, HiBit : Byte; Begin bTemp:= Byte(Ch); // 아무 값이나.. ...
    • 구창민
      2000.04.04 05:19
      Castle Road wrote: > shellexecute를 사용하려 하니 unfined identifier라고 나옵니다. > 해당 유닛을 u...
    • seagod
    • 2000.04.04 04:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김지현
    • 2000.04.04 03:40
    • 3 COMMENTS
    • /
    • 0 LIKES
    • bluesky
      2000.04.04 03:52
      김지현 wrote: > 안녕하세요~ > > 쿼리를 이용해서 디비그리드에 뿌리고 있습니다.. > 근데.. 쿼리가 ...
    • 김지현
      2000.04.04 18:57
      bluesky wrote: > 김지현 wrote: > > 안녕하세요~ > > > > 쿼리를 이용해서 디비그리드에 뿌리고 있습...
    • blueSky
      2000.04.04 19:33
      김지현 wrote: > bluesky wrote: > > 김지현 wrote: > > > 안녕하세요~ > > > > > > 쿼리를 이용해서...
    • 최용일
      2000.04.04 09:38
      검색을 먼저 하셨으면 됐을텐데... 김후진님과 장진웅님의 답변입니다. ---------------------------...
    • nuki
    • 2000.04.04 02:53
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이수정
    • 2000.04.04 02:35
    • 3 COMMENTS
    • /
    • 2 LIKES
    • 최용일
      2000.04.04 03:29
      델파이 5에서 데이터형이 약간 바뀌었습니다. WaveOutOpen에서 쓰이는 파라메터의 형이 PWaveFormat 에...
    • 이수정
      2000.04.04 03:17
      안녕하세요.. 최용일님.. 정말 감사합니다. 가르쳐 주신데로 하니까.. 컴파일이 잘 되었습니다. ...
    • 최용일
      2000.04.04 04:55
      글쿤요... 헐헐... 저두 어떠한 일을 하는지는 잘 모르겠군요... 폼만있구 아무것두 없으니... 녹...
    • 델Man
    • 2000.04.04 02:29
    • 4 COMMENTS
    • /
    • 0 LIKES
    • bluesky
      2000.04.04 03:08
      델Man wrote: > 정말 몇 번씩 질문에 답해주시는 분들 정말 감사합니다. > sql문에서 "select A1, sum(...
    • 하데스
      2000.04.04 03:06
      델Man wrote: > 정말 몇 번씩 질문에 답해주시는 분들 정말 감사합니다. > sql문에서 "select A1, sum(...
    • 델Man
      2000.04.04 08:53
      파라독스 테이블을 사용하고 있어서 having절을 where로 바꿨습니다. 그러니까 에러는 나지 않는데 ...
    • blueSky
      2000.04.04 18:54
      델Man wrote: > > 파라독스 테이블을 사용하고 있어서 having절을 where로 바꿨습니다. 그러니까 에러...
    • 2000.04.04 02:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하데스
      2000.04.04 03:09
      진 wrote: > > 저기 트리거에서요 입고 테이블에 입고data가 삭제될 시에 자재테이블이 변하게 코딩이 ...
    • 이수정
    • 2000.04.04 02:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.04 04:49
      안녕하세요. 최용일입니다. 저두 델파이를 풀로 설치했는데 그런 파일은 없는데요. 델파이 win32헬프...
    • 델Man
    • 2000.04.04 01:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 류종택
      2000.04.04 01:43
      당연히 해당 값은 에디트 할 수 없습니다.. 함수에 대한 결과 값이며.. 그것은 여러 래코드에서 반영된 ...