Add(MainForm,2953706,56,112) { } Add(InlineCode,10638232,112,114) { @Hint=#10:RecordData| WorkPoints=#21:doStart=Начало записи|30:doMsgIn=Сообшение записи блока|33:doStream=Поток на воспроизведение|20:doStop=Стоп процесса| EventPoints=#28:onStream=Поток данных записи|25:onPlay=блок PLAY заполнен| VarPoints=#18:ArrI=Массив записи|24:ArrO=Массив проигрывания| DataPoints=#8:Channels|4:Freq|8:BuffSize|3:Bit|6:Handle| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|47:uses kol,Share,Debug,mmsystem,Windows,Messages;|47:type Tbuffer=array[0..20000] of smallint;//8191|4:type|28: THiAsmClass = class(TDebug)|0:|10: private|22: wfx:TWaveFormatEx;|16: hwi:HWaveIn;|16: hwo:HWaveIn;|15: Arr:PArray;|16: Arr1:PArray;|19: value:smallint;|12: protected|0:|9: public|28: _prop_BuffSize:integer;|28: _prop_Channels:integer;|24: _prop_Freq:integer;|23: _prop_Bit:integer;|26: _prop_Handle:integer;|0:|26: _data_Data:THI_Event;|0:|40: Channel,BitsPerSample,Rate:integer;|0:|51: Channels ,Freq,BuffSize,Bit,Handle: THI_Event;|0:|24: onStream:THI_Event;|22: onPlay:THI_Event;|0:|50: procedure doMsgIn(var _Data:TData; Index:word);|50: procedure doStart(var _Data:TData; Index:word);|51: procedure doStream(var _Data:TData; Index:word);|49: procedure doStop(var _Data:TData; Index:word);|47: procedure ArrI(var _Data:TData; Index:word);|47: procedure ArrO(var _Data:TData; Index:word);|27: function _Count:integer;|56: function _Get(Var Item:TData; var Val:TData):boolean;|49: procedure _Set(var Item:TData; var Val:TData);|5: end;|0:|63:procedure waveInProc( hwi:HWAVEIN; uMsg:UINT; dwInstance:DWORD;|40:dwParam1:DWORD; dwParam2:DWORD);stdcall;|64:procedure waveOutProc( hwo:HWAVEIN; uMsg:UINT; dwInstance:DWORD;|40:dwParam1:DWORD; dwParam2:DWORD);stdcall;|0:|3:var|14: stop:boolean;|34: inbuffer:array[0..31] of TBuffer;|35: outbuffer:array[0..31] of TBuffer;|18: tempbuf: TBuffer;|19: tempbuf1: TBuffer;|31: whdi:array[0..31] of TWaveHdr;|31: whdo:array[0..31] of TWaveHdr;|24: WaveDataLength:integer;|14: Hand:integer;|17: k,L,m,n:integer;|0:|14:implementation|19: var leng:integer;|0:|23: procedure WaveInProc;|17: var i:integer;|18: St:PStream;|8: begin|16: case umsg of|21: wim_open: begin|22: end;|38: wim_data: for i:=0 to 1 do begin|59: if ((whdi[i].dwFlags and WHDR_DONE) = WHDR_DONE) and|30: (stop=false) then begin|15: k := i;|49: move(inbuffer[i],tempbuf,WaveDataLength);|42: PostMessage(Hand,MM_WIM_DATA,0,0);|59: whdi[i].dwFlags:=whdi[i].dwFlags and not WHDR_DONE;|71: WaveInAddBuffer(hwi,@whdi[i],sizeof(whdi[i]));//sizeof(whdi[i])|11: end;|9: end;|21: wim_close: begin|22: end;|8: end;|7: end;|0:|24: procedure WaveOutProc;|19: var i,j:integer;|9: begin|17: case umsg of|22: wom_open: begin|23: end;|39: wom_done: for i:=0 to 1 do begin|59: if ((whdo[i].dwFlags and WHDR_DONE) = WHDR_DONE) and|30: (stop=false) then begin|15: L := i;|59: whdo[i].dwFlags:=whdo[i].dwFlags and not WHDR_DONE;|51: move(tempbuf1,outbuffer[i],WaveDataLength);|42: PostMessage(Hand,MM_WOM_DONE,0,0);|51: WaveOutWrite(hwo,@whdo[i],sizeof(whdo[i]));|11: end;|9: end;|21: wom_close: begin|22: end;|8: end;|7: end;|0:|76: procedure THiAsmClass.doStart(var _Data:TData; Index:word);//Запуск записи|19: var i,X:integer;|8: begin|59: m := 2; n :=4;//Кол-во буферов записи и воспроизведения|72: Hand := ReadInteger(_Data,Handle,_prop_Handle);//Адрес главного окна|86: WaveDataLength := ReadInteger(_Data,BuffSize,_prop_BuffSize);//число байт на буфер|33: leng := WaveDataLength div 4;|70: BitsPerSample := ReadInteger(_Data,Bit,_prop_Bit);//Бит на выборку|73: Channel := ReadInteger(_Data,Channels,_prop_Channels);//число каналов|47: Rate := ReadInteger(_Data,Freq,_prop_Freq);|23: //Структура формата|29: wfx.nChannels := Channel;|38: wfx.wFormatTag := WAVE_FORMAT_PCM;|31: wfx.nSamplesPerSec := Rate;|40: wfx.wBitsPerSample := BitsPerSample;|62: wfx.nBlockAlign := wfx.nChannels*wfx.wBitsPerSample div 8;|71: wfx.nAvgBytesPerSec := Rate*wfx.nChannels*wfx.wBitsPerSample div 8;|20: wfx.cbSize := 0;|77: WaveInOpen(@hwi,WAVE_MAPPER,@wfx,dword(@WaveInProc),0,CALLBACK_FUNCTION);|79: WaveOutOpen(@hwo,wave_mapper,@wfx,dword(@WaveOutProc),0,callback_function);|23: //Заголовки буферов|28: for i:=0 to m-1 do begin|36: whdi[i].lpData:=@inbuffer[i,0];|62: whdi[i].dwBufferLength:=WaveDataLength;//sizeof(Tbuffer);|24: whdi[i].dwFlags:=0;|8: end;|28: for i:=0 to n-1 do begin|37: whdo[i].lpData:=@outbuffer[i,0];|62: whdo[i].dwBufferLength:=WaveDataLength;//sizeof(Tbuffer);|24: whdo[i].dwFlags:=0;|8: end;|0:|73: for i:=0 to m-1 do WaveInPrepareHeader(hwi,@whdi[i],sizeof(whdi[i]));|69: for i:=0 to m-1 do WaveInAddBuffer(hwi,@whdi[i],sizeof(whdi[i]));|74: for i:=0 to n-1 do WaveOutPrepareHeader(hwo,@whdo[i],sizeof(whdo[i]));|66: for i:=0 to n-1 do WaveOutWrite(hwo,@whdo[i],sizeof(whdo[i]));|18: stop := false;|16: //sleep(50);|21: WaveInStart(hwi);|7: end;|0:|60: procedure THiAsmClass.doMsgIn;//Обработка сообщений записи|19: var StI:PStream;|8: begin|26: _hi_OnEvent(onStream);|7: end;|0:|63: procedure THiAsmClass.doStream(var _Data:TData; Index:word);|20: var StO:PStream;|8: begin|24: _hi_OnEvent(onPlay);|7: end;|0:|61: procedure THiAsmClass.doStop(var _Data:TData; Index:word);|18: var i:integer;|9: begin|18: stop := true;|22: waveinreset(hwi);|23: waveoutreset(hwo);|16: sleep(200);|76: for i:=0 to m-1 do WaveInUnprepareheader(hwi,@whdi[i],sizeof(whdi[i]));|77: for i:=0 to n-1 do WaveOutUnprepareheader(hwo,@whdo[i],sizeof(whdo[i]));|22: WaveInClose(hwi);|23: WaveOutClose(hwo);|8: end;|0:|36:function THiAsmClass._Count:integer;|5:begin|28: Result := WaveDataLength;|4:end;|0:|65:function THiAsmClass._Get(Var Item:TData; var Val:TData):boolean;|16:var ind:integer;|5:begin|27: ind := ToIntIndex(Item);|29: Val.data_type := data_int;|29: Val.idata := tempbuf[ind];|4:end;|0:|58:procedure THiAsmClass._Set(Var Item:TData; var Val:TData);|20:var ind,tb1:integer;|5:begin|27: ind := ToIntIndex(Item);|25: tb1 := ToInteger(Val);|24: tempbuf1[ind] := tb1;|4:end;|0:|56:procedure THiAsmClass.ArrI(var _Data:TData; Index:word);|5:begin|19: if Arr = nil then|43: Arr := CreateArray(nil,_Get,_Count,nil);|32: _data.data_type := data_array;|30: _data.idata := integer(Arr);|4:end;|0:|56:procedure THiAsmClass.ArrO(var _Data:TData; Index:word);|5:begin|20: if Arr1 = nil then|44: Arr1 := CreateArray(_Set,nil,_Count,nil);|32: _data.data_type := data_array;|31: _data.idata := integer(Arr1);|4:end;|0:|4:end.| }