Вверх ↑
Ответов: 209
Рейтинг: 3
#1: 2007-03-26 12:34:14 ЛС | профиль | цитата
User108,
А можно ли запрограмировать сам процесс вывода звука на карту вообще без bass.dll, чтоб из элементов был только один InlineCode и кнопка.

Можно и для ввода и для вывода и для обработки одновременно. Только придется доработать элемент MainForm для обработки сообщений драйвера звуковухи (к сожалению в HiAsm пока нет элемента для обработки различных сообщений). Далее в фрагментах кода цветом обозначено что нужно добавить.
В файле hiMainForm:
...
uses Windows,Kol,Share,Win,Messages,[color]mmsystem[/color]{,KOLMHToolTip};
...
В декларациях:
 
   ...
[color] _event_onWimData:THI_Event;
_event_onWomData:THI_Event;[/color]
...
В обработчике сообщений:
function THIMainForm._onMessage;
begin
case Msg.message of
WM_COPYDATA: _hi_OnEvent(_event_OnCopyData,Msg.LParam);
[color]MM_WIM_DATA: _hi_OnEvent(_event_OnWimData{,Msg.lParam});
MM_WOM_DONE: _hi_OnEvent(_event_OnWomData{,Msg.wParam});[/color]
WM_ACTIVATE:
if Msg.WParam > 0 then
В файле конфигурации в разделе Methods(MainForm.ini)
[color]onWimData=Получено сообщение MM_WIM_DATA|2|
onWomData=Получено сообщение MM_WOM_DATA|2|[/color]
А ниже пример:
Add(MainForm,10417117,28,49)
{
Left=20
Top=105
link(onWimData,10295199:doMsgIn,[(134,104)(134,214)])
link(onWomData,2212758:doChangeValue,[(215,111)(215,181)])
}
Add(InlineCode,10295199,208,201)
{
@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..10000] 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;|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);|50: procedure _Set1(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;|33: inbuffer:array[0..7] of TBuffer;|34: outbuffer:array[0..7] of TBuffer;|18: tempbuf: TBuffer;|19: tempbuf1: TBuffer;|30: whdi:array[0..7] of TWaveHdr;|30: whdo:array[0..7] 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;|8: begin|16: case umsg of|21: wim_open: begin|22: end;|40: wim_data: for i:=0 to m-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[k],tempbuf,WaveDataLength);|42: PostMessage(Hand,MM_WIM_DATA,0,0);|59: whdi[k].dwFlags:=whdi[k].dwFlags and not WHDR_DONE;|71: WaveInAddBuffer(hwi,@whdi[k],sizeof(whdi[k]));//sizeof(whdi[i])|11: end;|9: end;|21: wim_close: begin|22: end;|8: end;|7: end;|0:|24: procedure WaveOutProc;|17: var i:integer;|9: begin|17: case umsg of|22: wom_open: begin|23: end;|41: wom_done: for i:=0 to n-1 do begin|59: if ((whdo[i].dwFlags and WHDR_DONE) = WHDR_DONE) and|30: (stop=false) then begin|15: L := i;|59: whdo[L].dwFlags:=whdo[L].dwFlags and not WHDR_DONE;|51: move(tempbuf1,outbuffer[L],WaveDataLength);|42: PostMessage(Hand,MM_WOM_DONE,0,0);|51: WaveOutWrite(hwo,@whdo[L],sizeof(whdo[L]));|11: end;|9: end;|21: wom_close: begin|22: end;|8: end;|7: end;|0:|76: procedure THiAsmClass.doStart(var _Data:TData; Index:word);//Запуск записи|17: var i:integer;|8: begin|59: m := 2; n :=2;//Кол-во буферов записи и воспроизведения|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(60);|21: WaveInStart(hwi);|7: end;|0:|60: procedure THiAsmClass.doMsgIn;//Обработка сообщений записи|8: begin|53: //Здесь можно вставить любую нужную Вам обработку|42: move(tempbuf,tempbuf1,WaveDataLength);|26: _hi_OnEvent(onStream);|7: end;|0:|63: procedure THiAsmClass.doStream(var _Data:TData; Index:word);|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:|59:procedure THiAsmClass._Set1(Var Item:TData; var Val:TData);|20:var ind,tb1:integer;|5:begin|27: ind := ToIntIndex(Item);|25: tb1 := ToInteger(Val);|23: tempbuf[ind] := tb1;|4:end;|0:|56:procedure THiAsmClass.ArrI(var _Data:TData; Index:word);|5:begin|19: if Arr = nil then|45: Arr := CreateArray(_Set1,_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.|
link(Channels,3000402:Value,[(214,152)(146,152)])
link(Freq,13768856:Value,[(221,138)(202,138)])
link(BuffSize,9546174:Value,[(228,131)(258,131)])
link(Bit,8479506:Value,[(235,139)(321,139)])
link(Handle,10417117:Handle,[(242,158)(34,158)])
}
Add(Button,16365871,91,182)
{
Left=85
Top=35
Caption="ПУСК"
link(onClick,10295199:doStart,[(165,188)(165,207)])
}
Add(Button,16315327,98,266)
{
Left=85
Top=80
Caption="СТОП"
link(onClick,10295199:doStop,[(169,272)(169,228)])
}
Add(Memory,3000402,140,70)
{
Default=Integer(2)
}
Add(Memory,13768856,196,70)
{
Default=Integer(44100)
}
Add(Memory,9546174,252,70)
{
Default=Integer(16000)
}
Add(Memory,8479506,315,77)
{
Default=Integer(16)
}
Add(LED,2212758,371,175)
{
Left=210
Top=40
}

[size=-2]------ Добавлено в 12:34
Упс. Цвет почему то не работает.
карма: 0

0