Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#1: 2007-03-25 09:37:28 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:55:24
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2007-03-25 17:02:56 ЛС | профиль | цитата
User108, там сейчас не моно. В правый канал идет каждое нечетное слово, в левый каждое четное. Поэтому для вывода данных по разным каналам нужно поставить проверку на четность итерации.
карма: 26
0
Гость
Ответов: 17029
Рейтинг: 0
#3: 2007-03-25 19:27:52 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:55:25
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#4: 2007-03-25 21:22:02 ЛС | профиль | цитата
1. DirectX. Однако подробнее об этом лучше почитать на сайте разработчика.
2. можно и это является предпочтительнее. Кусок схемы ниже нужно прикрепить к точке Data вместо компонента EventFromData в стандартном примере BASS_Stream.sha
code_1136.txt
карма: 26
0
файлы: 1code_1136.txt [506B] [440]
Гость
Ответов: 17029
Рейтинг: 0
#5: 2007-03-25 23:05:59 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:55:25
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#6: 2007-03-26 02:12:51 ЛС | профиль | цитата
User108 писал(а):
А можно ли запрограмировать сам процесс вывода звука на карту вообще без bass.dll, чтоб из элементов был только один InlineCode и кнопка

можно. С использованием DirectX или API из mmsystem.

User108 писал(а):
А с вашим примером почувствовал что использование InlineCode вместо стандартных компонентов реально ускоряет программу...

Стандартный пакет HiAsm не предназначен для создания программ реального времени активно занимающиеся обработкой данных. В будущем планируется сделать альтернативный Windows пакет, базирующийся на принципах кодогенерации из пакета PHP и позволяющий на стандартной элементной базе собирать программы, не уступающие по качеству и скорости "ручному" программированию.
карма: 26
0
Ответов: 209
Рейтинг: 3
#7: 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
Ответов: 16884
Рейтинг: 1239
#8: 2007-03-26 13:09:36 ЛС | профиль | цитата
***
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 9906
Рейтинг: 351
#9: 2007-03-26 13:56:01 ЛС | профиль | цитата
ХЭМ писал(а):
к сожалению в HiAsm пока нет элемента для обработки различных сообщений

Так взял бы и сделал
Наверное времени больше потратил на сожаления об этом
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#10: 2007-03-26 17:01:47 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:55:25
карма: 0

0
Ответов: 9906
Рейтинг: 351
#11: 2007-03-26 17:07:04 ЛС | профиль | цитата
ХЭМ писал(а):
Упс. Цвет почему то не работает

1) тега "однострочная" вроде
2) внутри <code> ничего не должно работать по определению
3) а какой цвет ты ожидал увидеть, кстати ???
карма: 9

0
Ответов: 2125
Рейтинг: 159
#12: 2007-03-26 17:09:32 ЛС | профиль | цитата
User108 писал(а):
а здесь случайно не пропущено что-то после then

А тэги-то форумовские (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


[size=-2]------ Добавлено в 17:09
Galkov писал(а):
а какой цвет тв ожидал увидеть, кстати ???

Видимо просто цвет Вот есть-же чёрно-белые телевизоры, а есть цветные
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#13: 2007-03-26 17:27:57 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:55:25
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#14: 2007-03-26 17:39:43 ЛС | профиль | цитата
User108 писал(а):
а в чем в общих чертах отличие алгоритма кодогенерации пакета PHP от оного в Delphi ?

в Delphi исторически сложилось так, что каждый компонент(исключая встроенных в среду) представляет из себя полноценный объект с торчащими наружу методами и свойствами. В итоге построение схем сводится к банальному привязыванию метода одного компонента к свойству другого. Ну и внешнее задание статических св-тв(те, что на вкладке св-ва в среде) конечно же. Со временем были внесены кое-какие дополнения, призваные несколько улучшить качество кода. Такой подход достаточно прост, прозрачен для пользователя и надежен(т.е. исключает любые неверные включения в схеме). Однако минус является то, что он не оптимален по объему коду и тем более не оптимален по скорости исполнения.
в PHP каждый компонент это не объект, а некоторый скрипт(шаблон), который в зависимости от св-тв компонента генерирует небольшой кусочек кода - именно такой кусочек, который хотел пользователь. Ничего лишнего. В итоге генерируемый код по качеству практически не уступает тому, который можно написать в InlineCode. Однако минусами тут является то, что являлось плюсами в Delphi: даже простой компонент потребует от пользователя знания всей технологии генерации кода; этот подход не является прозрачным поскольку большая часть скрипта это анализ окружения компонента, на основе которого генерируется код(и как следствие один и тот же компонент может впринципе генерировать совершенно разный конечный код); он не надежен, т.е. автор компонента может написать синтаксически верный скрипт(понятный кодогенератору), но дающий синтаксически неверный код(не понятный компилятору).
карма: 26
0
Ответов: 2058
Рейтинг: 28
#15: 2007-03-26 17:48:56 ЛС | профиль | цитата
Если вдруг будете переходить на новую технология (для покета Delphi) то нельзя терять совместимость со старой. Разработчик компонентов по своему усматрения будет выбирать в каком ввиде делать ему компоненты.
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)