Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 186

/ вопрос открыт /

Здравствуте, подскажите как сделать программную непрерывную задержку звука на 1-2сек. (например вход микрофон, выход колонки)
Спасибо.

Ed13 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ed13 (статус: Посетитель)
Вопрос отправлен: 4 декабря 2006, 11:04
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Ed13!

Данная тема достаточно сложная. Вот исходник для работы со звуком на низком уровне. Попробуйте разобраться. Удачи!!!

Приложение:
  1. Ниже приведен код, обрабатывающий аудиосигнал, получаемый со входа звуковой карты (SoundBlaster). Надеюсь он поможет разобраться вам с этой сложной темой.
  2.  
  3. Включенный в код модуль RECUNIT делает всю изнурительную работу по извлечению звука со входа звуковой карты.
  4.  
  5.  
  6.  
  7. var
  8. WaveRecorder: TWaveRecorder;
  9.  
  10. ...
  11.  
  12. WaveRecorder := TwaveRecorder(2048, 4); // 4 размером 2048 байт
  13.  
  14. { Устанавливает параметры дискретизации }
  15. with WaveRecorder.pWavefmtEx do
  16. begin
  17. wFormatTag := WAVE_FORMAT_PCM;
  18. nChannels := 1;
  19. nSamplesPerSec := 20000;
  20. wBitsPerSample := 16;
  21. nAvgBytesPerSec := nSamplesPerSec * (wBitsPerSample div 8) * nChannels;
  22. end;
  23.  
  24. // Затем используем вариантную запись, поскольку я не знаю
  25. // как получить адрес самого объекта
  26.  
  27. WaveRecorder.SetupRecord(@WaveRecorder);
  28.  
  29. // Начинаем запись
  30. WaveRecorder.StartRecord;
  31.  
  32. ...При каждом заполнении буфера вызывается
  33. процедура WaveRecorder.Processbuffer.
  34.  
  35. // Заканчиваем запись
  36. WaveRecorder.StopRecord;
  37. WaveRecorder.Destroy;
  38.  
  39.  
  40.  
  41.  
  42.  
  43. {
  44. Имя файла: RECUNIT.PAS V 1.01
  45. Создан: Авг 19 1996 в 21:56 на IBM ThinkPad
  46. Ревизия #7: Авг 22 1997, 15:01 на IBM ThinkPad
  47. -John Mertus
  48.  
  49. Данный модуль содержит необходимые процедуры для записи звука.
  50.  
  51. Версия 1.00 - первый релиз
  52. 1.01 - добавлен TWaveInGetErrorText
  53. }
  54.  
  55. {-----------------Unit-RECUNIT---------------------John Mertus---Авг 96---}
  56.  
  57. unit RECUNIT;
  58.  
  59. {*************************************************************************}
  60.  
  61. interface
  62.  
  63. uses
  64.  
  65. Windows, MMSystem, SysUtils, MSACM;
  66.  
  67. { Ниже определен класс TWaveRecorder для обслуживания входа звуковой }
  68. { карты. Ожидается, что новый класс будет производным от TWaveRecorder }
  69. { и перекроет TWaveRecorder.ProcessBuffer. После начала записи данная }
  70. { процедура вызывается каждый раз при наличии в буфере аудио-данных. }
  71.  
  72. const
  73.  
  74. MAX_BUFFERS = 8;
  75.  
  76. type
  77.  
  78. PWaveRecorder = ^TWaveRecorder;
  79. TWaveRecorder = class(TObject)
  80. constructor Create(BfSize, TotalBuffers: Integer);
  81. destructor Destroy; override;
  82. procedure ProcessBuffer(uMsg: Word; P: Pointer; n: Integer);
  83. virtual;
  84.  
  85. private
  86. fBufferSize: Integer; // Размер буфера
  87. BufIndex: Integer;
  88. fTotalBuffers: Integer;
  89.  
  90. pWaveHeader: array[0..MAX_BUFFERS - 1] of PWAVEHDR;
  91. hWaveHeader: array[0..MAX_BUFFERS - 1] of THANDLE;
  92. hWaveBuffer: array[0..MAX_BUFFERS - 1] of THANDLE;
  93. hWaveFmtEx: THANDLE;
  94. dwByteDataSize: DWORD;
  95. dwTotalWaveSize: DWORD;
  96.  
  97. RecordActive: Boolean;
  98. bDeviceOpen: Boolean;
  99.  
  100. { Внутренние функции класса }
  101. function InitWaveHeaders: Boolean;
  102. function AllocPCMBuffers: Boolean;
  103. procedure FreePCMBuffers;
  104.  
  105. function AllocWaveFormatEx: Boolean;
  106. procedure FreeWaveFormatEx;
  107.  
  108. function AllocWaveHeaders: Boolean;
  109. procedure FreeWaveHeader;
  110.  
  111. function AddNextBuffer: Boolean;
  112. procedure CloseWaveDeviceRecord;
  113.  
  114. public
  115. { Public declarations }
  116. pWaveFmtEx: PWaveFormatEx;
  117. WaveBufSize: Integer; // Размер поля nBlockAlign
  118. InitWaveRecorder: Boolean;
  119. RecErrorMessage: string;
  120. QueuedBuffers,
  121. ProcessedBuffers: Integer;
  122. pWaveBuffer: array[0..MAX_BUFFERS - 1] of lpstr;
  123. WaveIn: HWAVEIN; { Дескриптор Wav-устройства }
  124.  
  125. procedure StopRecord;
  126. function 477576218068 StartRecord: Boolean;
  127. Function477576218068 SetupRecord(P: PWaveRecorder): Boolean;
  128.  
  129. end;
  130.  
  131. {*************************************************************************}
  132.  
  133. implementation
  134.  
  135. {-------------TWaveInGetErrorText-----------John Mertus---14-Июнь--97--}
  136.  
  137. function TWaveInGetErrorText(iErr: Integer): string;
  138.  
  139. { Выдает сообщения об ошибках WaveIn в формате Pascal }
  140. { iErr - номер ошибки }
  141. { }
  142. {**********************************************************************}
  143. var
  144.  
  145. PlayInErrorMsgC: array[0..255] of Char;
  146.  
  147. begin
  148.  
  149. waveInGetErrorText(iErr, PlayInErrorMsgC, 255);
  150. TWaveInGetErrorText := StrPas(PlayInErrorMsgC);
  151. end;
  152.  
  153. {-------------InitWaveHeaders---------------John Mertus---14-Июнь--97--}
  154.  
  155. function TWaveRecorder.AllocWaveFormatEx: Boolean;
  156.  
  157. { Распределяем формат большого размера, требуемый для инсталляции ACM-в}
  158. { }
  159. {**********************************************************************}
  160. var
  161.  
  162. MaxFmtSize: UINT;
  163.  
  164. begin
  165.  
  166. { maxFmtSize - сумма sizeof(WAVEFORMATEX) + pwavefmtex.cbSize }
  167. if (acmMetrics(0, ACM_METRIC_MAX_SIZE_FORMAT, maxFmtSize) <> 0) > then
  168. begin
  169. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1087;&#1086;&#1083;&#1091;&#1095;&#1077;&#1085;&#1080;&#1103; &#1088;&#1072;&#1079;&#1084;&#1077;&#1088;&#1072; &#1092;&#1086;&#1088;&#1084;&#1072;&#1090;&#1072; &#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1075;&#1086; &#1089;&#1078;&#1072;&#1090;&#1080;&#1103;';
  170. AllocWaveFormatEx := False;
  171. Exit;
  172. end;
  173.  
  174. { &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1091;&#1088;&#1091; WAVEFMTEX }
  175. hWaveFmtEx := GlobalAlloc(GMEM_MOVEABLE, maxFmtSize);
  176. if (hWaveFmtEx = 0) then
  177. begin
  178. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1080;&#1103; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; &#1076;&#1083;&#1103; &#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1091;&#1088;&#1099; WaveFormatEx';
  179. AllocWaveFormatEx := False;
  180. Exit;
  181. end;
  182.  
  183. pWaveFmtEx := PWaveFormatEx(GlobalLock(hWaveFmtEx));
  184. if (pWaveFmtEx = nil) then
  185. begin
  186. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1086;&#1074;&#1082;&#1080; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; WaveFormatEx';
  187. AllocWaveFormatEx := False;
  188. Exit;
  189. end;
  190.  
  191. { &#1080;&#1085;&#1080;&#1094;&#1080;&#1072;&#1083;&#1080;&#1079;&#1072;&#1094;&#1080;&#1103; &#1092;&#1086;&#1088;&#1084;&#1072;&#1090;&#1072; &#1074; &#1089;&#1090;&#1072;&#1085;&#1076;&#1072;&#1088;&#1090;&#1077; PCM }
  192. ZeroMemory(pwavefmtex, maxFmtSize);
  193. pwavefmtex.wFormatTag := WAVE_FORMAT_PCM;
  194. pwavefmtex.nChannels := 1;
  195. pwavefmtex.nSamplesPerSec := 20000;
  196. pwavefmtex.nBlockAlign := 1;
  197. pwavefmtex.wBitsPerSample := 16;
  198. pwavefmtex.nAvgBytesPerSec := pwavefmtex.nSamplesPerSec *
  199. (pwavefmtex.wBitsPerSample div 8) * pwavefmtex.nChannels;
  200. pwavefmtex.cbSize := 0;
  201.  
  202. { &#1042;&#1089;&#1077; &#1091;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086;, &#1080;&#1076;&#1077;&#1084; &#1076;&#1086;&#1084;&#1086;&#1081; }
  203. AllocWaveFormatEx := True;
  204. end;
  205.  
  206. {-------------InitWaveHeaders---------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  207.  
  208. function TWaveRecorder.InitWaveHeaders: Boolean;
  209.  
  210. { &#1056;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100;, &#1086;&#1073;&#1085;&#1091;&#1083;&#1103;&#1077;&#1084; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1086;&#1082; wave &#1080; &#1080;&#1085;&#1080;&#1094;&#1080;&#1072;&#1083;&#1080;&#1079;&#1080;&#1088;&#1091;&#1077;&#1084; }
  211. { }
  212. {**********************************************************************}
  213. var
  214.  
  215. i: Integer;
  216.  
  217. begin
  218.  
  219. { &#1076;&#1077;&#1083;&#1072;&#1077;&#1084; &#1088;&#1072;&#1079;&#1084;&#1077;&#1088; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1082;&#1088;&#1072;&#1090;&#1085;&#1099;&#1084; &#1074;&#1077;&#1083;&#1080;&#1095;&#1080;&#1085;&#1077; &#1073;&#1083;&#1086;&#1082;&#1072;... }
  220. WaveBufSize := fBufferSize - (fBufferSize mod pwavefmtex.nBlockAlign);
  221.  
  222. { &#1059;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1084; wave-&#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1080; }
  223. for i := 0 to fTotalBuffers - 1 do
  224. with pWaveHeader[i]^ do
  225. begin
  226. lpData := pWaveBuffer[i]; // &#1072;&#1076;&#1088;&#1077;&#1089; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; waveform
  227. dwBufferLength := WaveBufSize; // &#1088;&#1072;&#1079;&#1084;&#1077;&#1088;, &#1074; &#1073;&#1072;&#1081;&#1090;&#1072;&#1093;, &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;
  228. dwBytesRecorded := 0; // &#1089;&#1084;&#1086;&#1090;&#1088;&#1080; &#1085;&#1080;&#1078;&#1077;
  229. dwUser := 0; // 32 &#1073;&#1080;&#1090;&#1072; &#1076;&#1072;&#1085;&#1085;&#1099;&#1093; &#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;
  230. dwFlags := 0; // &#1089;&#1084;&#1086;&#1090;&#1088;&#1080; &#1085;&#1080;&#1078;&#1077;
  231. dwLoops := 0; // &#1089;&#1084;&#1086;&#1090;&#1088;&#1080; &#1085;&#1080;&#1078;&#1077;
  232. lpNext := nil; // &#1079;&#1072;&#1088;&#1077;&#1079;&#1077;&#1088;&#1074;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1086;; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1073;&#1099;&#1090;&#1100; &#1085;&#1086;&#1083;&#1100;
  233. reserved := 0; // &#1079;&#1072;&#1088;&#1077;&#1079;&#1077;&#1088;&#1074;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1086;; &#1076;&#1086;&#1083;&#1078;&#1077;&#1085; &#1073;&#1099;&#1090;&#1100; &#1085;&#1086;&#1083;&#1100;
  234. end;
  235.  
  236. InitWaveHeaders := TRUE;
  237. end;
  238.  
  239. {-------------AllocWaveHeader----------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  240.  
  241. function TWaveRecorder.AllocWaveHeaders: Boolean;
  242.  
  243. { &#1056;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1080; &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1091;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072; }
  244. { }
  245. {***********************************************************************}
  246. var
  247.  
  248. i: Integer;
  249.  
  250. begin
  251.  
  252. for i := 0 to fTotalBuffers - 1 do
  253. begin
  254. hwaveheader[i] := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or
  255. GMEM_ZEROINIT, sizeof(TWAVEHDR));
  256.  
  257. if (hwaveheader[i] = 0) then
  258. begin
  259. { &#1055;&#1088;&#1080;&#1084;&#1077;&#1095;&#1072;&#1085;&#1080;&#1077;: &#1069;&#1090;&#1086; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1088;&#1080;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082; &#1091;&#1090;&#1077;&#1095;&#1082;&#1077; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080;, &#1085;&#1072;&#1076;&#1077;&#1102;&#1089;&#1100; &#1089;&#1082;&#1086;&#1088;&#1086; &#1080;&#1089;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; }
  260. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1080;&#1103; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; &#1076;&#1083;&#1103; wave-&#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072;';
  261. AllocWaveHeaders := FALSE;
  262. Exit;
  263. end;
  264.  
  265. pwaveheader[i] := GlobalLock(hwaveheader[i]);
  266. if (pwaveheader[i] = nil) then
  267. begin
  268. { &#1055;&#1088;&#1080;&#1084;&#1077;&#1095;&#1072;&#1085;&#1080;&#1077;: &#1069;&#1090;&#1086; &#1084;&#1086;&#1078;&#1077;&#1090; &#1087;&#1088;&#1080;&#1074;&#1077;&#1089;&#1090;&#1080; &#1082; &#1091;&#1090;&#1077;&#1095;&#1082;&#1077; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080;, &#1085;&#1072;&#1076;&#1077;&#1102;&#1089;&#1100; &#1089;&#1082;&#1086;&#1088;&#1086; &#1080;&#1089;&#1087;&#1088;&#1072;&#1074;&#1080;&#1090;&#1100; }
  269. RecErrorMessage := '&#1053;&#1077; &#1084;&#1086;&#1075;&#1091; &#1079;&#1072;&#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1086;&#1074;&#1072;&#1090;&#1100; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072; &#1076;&#1083;&#1103; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;';
  270. AllocWaveHeaders := FALSE;
  271. Exit;
  272. end;
  273.  
  274. end;
  275.  
  276. AllocWaveHeaders := TRUE;
  277. end;
  278.  
  279. {---------------FreeWaveHeader---------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  280.  
  281. procedure TWaveRecorder.FreeWaveHeader;
  282.  
  283. { &#1055;&#1088;&#1086;&#1089;&#1090;&#1086; &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1077;&#1084; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1091;&#1102; AllocWaveHeaders &#1087;&#1072;&#1084;&#1103;&#1090;&#1100;. }
  284. { }
  285. {***********************************************************************}
  286. var
  287.  
  288. i: Integer;
  289.  
  290. begin
  291.  
  292. for i := 0 to fTotalBuffers - 1 do
  293. begin
  294. if (hWaveHeader[i] <> 0) then
  295. begin
  296. GlobalUnlock(hwaveheader[i]);
  297. GlobalFree(hwaveheader[i]);
  298. hWaveHeader[i] := 0;
  299. end
  300. end;
  301. end;
  302.  
  303. {-------------AllocPCMBuffers----------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  304.  
  305. function TWaveRecorder.AllocPCMBuffers: Boolean;
  306.  
  307. { &#1056;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1080; &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1091;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; waveform. }
  308. { }
  309. {***********************************************************************}
  310. var
  311.  
  312. i: Integer;
  313.  
  314. begin
  315.  
  316. for i := 0 to fTotalBuffers - 1 do
  317. begin
  318. hWaveBuffer[i] := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE, fBufferSize);
  319. if (hWaveBuffer[i] = 0) then
  320. begin
  321. { &#1047;&#1076;&#1077;&#1089;&#1100; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1072; &#1091;&#1090;&#1077;&#1095;&#1082;&#1072; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; }
  322. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1080;&#1103; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; wave-&#1073;&#1091;&#1092;&#1077;&#1088;&#1072;';
  323. AllocPCMBuffers := False;
  324. Exit;
  325. end;
  326.  
  327. pWaveBuffer[i] := GlobalLock(hWaveBuffer[i]);
  328. if (pWaveBuffer[i] = nil) then
  329. begin
  330. { &#1047;&#1076;&#1077;&#1089;&#1100; &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1072; &#1091;&#1090;&#1077;&#1095;&#1082;&#1072; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; }
  331. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1073;&#1083;&#1086;&#1082;&#1080;&#1088;&#1086;&#1074;&#1072;&#1085;&#1080;&#1103; &#1087;&#1072;&#1084;&#1103;&#1090;&#1080; wave-&#1073;&#1091;&#1092;&#1077;&#1088;&#1072;';
  332. AllocPCMBuffers := False;
  333. Exit;
  334. end;
  335. pWaveHeader[i].lpData := pWaveBuffer[i];
  336. end;
  337.  
  338. AllocPCMBuffers := TRUE;
  339. end;
  340.  
  341. {--------------FreePCMBuffers----------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  342.  
  343. procedure TWaveRecorder.FreePCMBuffers;
  344.  
  345. { &#1054;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1077;&#1084; &#1080;&#1089;&#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1085;&#1085;&#1091;&#1102; AllocPCMBuffers &#1087;&#1072;&#1084;&#1103;&#1090;&#1100;. }
  346. { }
  347. {***********************************************************************}
  348. var
  349.  
  350. i: Integer;
  351.  
  352. begin
  353.  
  354. for i := 0 to fTotalBuffers - 1 do
  355. begin
  356. if (hWaveBuffer[i] <> 0) then
  357. begin
  358. GlobalUnlock(hWaveBuffer[i]);
  359. GlobalFree(hWaveBuffer[i]);
  360. hWaveBuffer[i] := 0;
  361. pWaveBuffer[i] := nil;
  362. end;
  363. end;
  364. end;
  365.  
  366. {--------------FreeWaveFormatEx--------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  367.  
  368. procedure TWaveRecorder.FreeWaveFormatEx;
  369.  
  370. { &#1055;&#1088;&#1086;&#1089;&#1090;&#1086; &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1077;&#1084; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1080; ExFormat headers }
  371. { }
  372. {***********************************************************************}
  373. begin
  374.  
  375. if (pWaveFmtEx = nil) then
  376. Exit;
  377. GlobalUnlock(hWaveFmtEx);
  378. GlobalFree(hWaveFmtEx);
  379. pWaveFmtEx := nil;
  380. end;
  381.  
  382. {-------------TWaveRecorder.Create------------John Mertus-----&#1040;&#1074;&#1075;--97--}
  383.  
  384. constructor TWaveRecorder.Create(BFSize, TotalBuffers: Integer);
  385.  
  386. { &#1059;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1084; wave-&#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1080;, &#1080;&#1085;&#1080;&#1094;&#1080;&#1072;&#1083;&#1080;&#1079;&#1080;&#1088;&#1091;&#1077;&#1084; &#1091;&#1082;&#1072;&#1079;&#1072;&#1090;&#1077;&#1083;&#1080; &#1076;&#1072;&#1085;&#1085;&#1099;&#1093; &#1080; }
  387. { &#1080; &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1073;&#1091;&#1092;&#1077;&#1088;&#1099; &#1076;&#1080;&#1089;&#1082;&#1088;&#1077;&#1090;&#1080;&#1079;&#1072;&#1094;&#1080;&#1080; }
  388. { BFSize - &#1088;&#1072;&#1079;&#1084;&#1077;&#1088; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1074; &#1073;&#1072;&#1081;&#1090;&#1072;&#1093; }
  389. { }
  390. {**********************************************************************}
  391. var
  392.  
  393. i: Integer;
  394. begin
  395.  
  396. inherited Create;
  397. for i := 0 to fTotalBuffers - 1 do
  398. begin
  399. hWaveHeader[i] := 0;
  400. hWaveBuffer[i] := 0;
  401. pWaveBuffer[i] := nil;
  402. pWaveFmtEx := nil;
  403. end;
  404. fBufferSize := BFSize;
  405.  
  406. fTotalBuffers := TotalBuffers;
  407. { &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; &#1076;&#1083;&#1103; &#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1091;&#1088;&#1099; wave-&#1092;&#1086;&#1088;&#1084;&#1072;&#1090;&#1072; }
  408. if (not AllocWaveFormatEx) then
  409. begin
  410. InitWaveRecorder := FALSE;
  411. Exit;
  412. end;
  413.  
  414. { &#1080;&#1097;&#1077;&#1084; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086;, &#1089;&#1086;&#1074;&#1084;&#1077;&#1089;&#1090;&#1080;&#1084;&#1086;&#1077; &#1089; &#1076;&#1086;&#1089;&#1090;&#1091;&#1087;&#1085;&#1099;&#1084;&#1080; wave-&#1093;&#1072;&#1088;&#1072;&#1082;&#1090;&#1077;&#1088;&#1080;&#1089;&#1090;&#1080;&#1082;&#1072;&#1084;&#1080; }
  415. if (waveInGetNumDevs < 1) then
  416. begin
  417. RecErrorMessage := '&#1053;&#1077; &#1085;&#1072;&#1081;&#1076;&#1077;&#1085;&#1086; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;, &#1089;&#1087;&#1086;&#1089;&#1086;&#1073;&#1085;&#1099;&#1093; &#1079;&#1072;&#1087;&#1080;&#1089;&#1099;&#1074;&#1072;&#1090;&#1100; &#1079;&#1074;&#1091;&#1082;';
  418. InitWaveRecorder := FALSE;
  419. Exit;
  420. end;
  421.  
  422. { &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; wave-&#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072; }
  423. if (not AllocWaveHeaders) then
  424. begin
  425. InitWaveRecorder := FALSE;
  426. Exit;
  427. end;
  428.  
  429. { &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; wave-&#1076;&#1072;&#1085;&#1085;&#1099;&#1093; }
  430. if (not AllocPCMBuffers) then
  431. begin
  432. InitWaveRecorder := FALSE;
  433. Exit;
  434. end;
  435.  
  436. InitWaveRecorder := TRUE;
  437.  
  438. end;
  439.  
  440. {---------------------Destroy----------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  441.  
  442. destructor TWaveRecorder.Destroy;
  443.  
  444. { &#1055;&#1088;&#1086;&#1089;&#1090;&#1086; &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1077;&#1084; &#1074;&#1089;&#1102; &#1087;&#1072;&#1084;&#1103;&#1090;&#1100;, &#1088;&#1072;&#1089;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1091;&#1102; InitWaveRecorder. }
  445. { }
  446. {***********************************************************************}
  447.  
  448. begin
  449.  
  450. FreeWaveFormatEx;
  451. FreePCMBuffers;
  452. FreeWaveHeader;
  453. inherited Destroy;
  454. end;
  455.  
  456. {------------CloseWaveDeviceRecord-----------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  457.  
  458. procedure TWaveRecorder.CloseWaveDeviceRecord;
  459.  
  460. { &#1055;&#1088;&#1086;&#1089;&#1090;&#1086; &#1086;&#1089;&#1074;&#1086;&#1073;&#1086;&#1078;&#1076;&#1072;&#1077;&#1084; (&#1079;&#1072;&#1082;&#1088;&#1099;&#1074;&#1072;&#1077;&#1084;) waveform-&#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086;. }
  461. { }
  462. {***********************************************************************}
  463. var
  464.  
  465. i: Integer;
  466.  
  467. begin
  468.  
  469. { &#1077;&#1089;&#1083;&#1080; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; &#1091;&#1078;&#1077; &#1079;&#1072;&#1082;&#1088;&#1099;&#1090;&#1086;, &#1090;&#1086; &#1074;&#1099;&#1093;&#1086;&#1076;&#1080;&#1084; }
  470. if (not bDeviceOpen) then
  471. Exit;
  472.  
  473. { &#1088;&#1072;&#1073;&#1086;&#1090;&#1072; &#1089; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072;&#1084;&#1080; - unprepare }
  474. for i := 0 to fTotalBuffers - 1 do
  475. if (waveInUnprepareHeader(WaveIn, pWaveHeader[i], sizeof(TWAVEHDR)) <> 0)
  476. then
  477.  
  478. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1074; waveInUnprepareHeader';
  479.  
  480. { &#1089;&#1086;&#1093;&#1088;&#1072;&#1085;&#1103;&#1077;&#1084; &#1086;&#1073;&#1097;&#1080;&#1081; &#1086;&#1073;&#1098;&#1077;&#1084; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080; &#1080; &#1086;&#1073;&#1085;&#1086;&#1074;&#1083;&#1103;&#1077;&#1084; &#1087;&#1086;&#1082;&#1072;&#1079; }
  481. dwTotalwavesize := dwBytedatasize;
  482.  
  483. { &#1079;&#1072;&#1082;&#1088;&#1099;&#1074;&#1072;&#1077;&#1084; &#1074;&#1093;&#1086;&#1076;&#1085;&#1086;&#1077; wave-&#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; }
  484. if (waveInClose(WaveIn) <> 0) then
  485. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1079;&#1072;&#1082;&#1088;&#1099;&#1090;&#1080;&#1103; &#1074;&#1093;&#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1072;';
  486.  
  487. { &#1089;&#1086;&#1086;&#1073;&#1097;&#1072;&#1077;&#1084; &#1074;&#1099;&#1079;&#1074;&#1072;&#1074;&#1096;&#1077;&#1081; &#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1080;, &#1095;&#1090;&#1086; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; &#1079;&#1072;&#1082;&#1088;&#1099;&#1090;&#1086; }
  488. bDeviceOpen := FALSE;
  489.  
  490. end;
  491.  
  492. {------------------StopRecord-----------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  493.  
  494. procedure TWaveRecorder.StopRecord;
  495.  
  496. { &#1054;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1084; &#1079;&#1072;&#1087;&#1080;&#1089;&#1100; &#1080; &#1091;&#1089;&#1090;&#1072;&#1085;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1084; &#1085;&#1077;&#1082;&#1086;&#1090;&#1086;&#1088;&#1099;&#1077; &#1092;&#1083;&#1072;&#1075;&#1080;. }
  497. { }
  498. {***********************************************************************}
  499. var
  500.  
  501. iErr: Integer;
  502.  
  503. begin
  504.  
  505. RecordActive := False;
  506. iErr := waveInReset(WaveIn);
  507. { &#1087;&#1088;&#1077;&#1082;&#1088;&#1072;&#1097;&#1072;&#1077;&#1084; &#1079;&#1072;&#1087;&#1080;&#1089;&#1100; &#1080; &#1074;&#1086;&#1079;&#1074;&#1088;&#1072;&#1097;&#1072;&#1077;&#1084; &#1089;&#1090;&#1086;&#1103;&#1097;&#1080;&#1077; &#1074; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1080; &#1073;&#1091;&#1092;&#1077;&#1088;&#1099; }
  508. if (iErr <> 0) then
  509. begin
  510. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1074; waveInReset';
  511. end;
  512.  
  513. CloseWaveDeviceRecord;
  514. end;
  515.  
  516. {--------------AddNextBuffer------------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  517.  
  518. function TWaveRecorder.AddNextBuffer: Boolean;
  519.  
  520. { &#1044;&#1086;&#1073;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084; &#1073;&#1091;&#1092;&#1077;&#1088; &#1082;&#1086; &#1074;&#1093;&#1086;&#1076;&#1085;&#1086;&#1081; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1080; &#1080; &#1087;&#1077;&#1088;&#1077;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1073;&#1091;&#1092;&#1077;&#1088;&#1085;&#1099;&#1081; &#1080;&#1085;&#1076;&#1077;&#1082;&#1089;. }
  521. { }
  522. {***********************************************************************}
  523. var
  524.  
  525. iErr: Integer;
  526.  
  527. begin
  528.  
  529. { &#1089;&#1090;&#1072;&#1074;&#1080;&#1084; &#1073;&#1091;&#1092;&#1077;&#1088; &#1074; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100; &#1076;&#1083;&#1103; &#1087;&#1086;&#1083;&#1091;&#1095;&#1077;&#1085;&#1080;&#1103; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1085;&#1086;&#1081; &#1087;&#1086;&#1088;&#1094;&#1080;&#1080; &#1076;&#1072;&#1085;&#1085;&#1099;&#1093; }
  530. iErr := waveInAddBuffer(WaveIn, pwaveheader[bufindex], sizeof(TWAVEHDR));
  531. if (iErr <> 0) then
  532. begin
  533. StopRecord;
  534. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1076;&#1086;&#1073;&#1072;&#1074;&#1083;&#1077;&#1085;&#1080;&#1103; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;' + TWaveInGetErrorText(iErr);
  535. AddNextBuffer := FALSE;
  536. Exit;
  537. end;
  538.  
  539. { &#1087;&#1077;&#1088;&#1077;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084;&#1089;&#1103; &#1085;&#1072; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1073;&#1091;&#1092;&#1077;&#1088; }
  540. bufindex := (bufindex + 1) mod fTotalBuffers;
  541. QueuedBuffers := QueuedBuffers + 1;
  542.  
  543. AddNextBuffer := TRUE;
  544. end;
  545.  
  546. {--------------BufferDoneCallBack------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  547.  
  548. procedure BufferDoneCallBack(
  549. hW: HWAVE; // &#1076;&#1077;&#1089;&#1082;&#1088;&#1080;&#1087;&#1090;&#1086;&#1088; waveform-&#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1072;
  550. uMsg: DWORD; // &#1087;&#1086;&#1089;&#1099;&#1083;&#1072;&#1077;&#1084;&#1086;&#1077; &#1089;&#1086;&#1086;&#1073;&#1097;&#1077;&#1085;&#1080;&#1077;
  551. dwInstance: DWORD; // &#1101;&#1082;&#1079;&#1077;&#1084;&#1087;&#1083;&#1103;&#1088; &#1076;&#1072;&#1085;&#1085;&#1099;&#1093;
  552. dwParam1: DWORD; // &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084;&#1099;&#1081; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077;&#1084; &#1087;&#1072;&#1088;&#1072;&#1084;&#1077;&#1090;&#1088;
  553. dwParam2: DWORD; // &#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1103;&#1077;&#1084;&#1099;&#1081; &#1087;&#1088;&#1080;&#1083;&#1086;&#1078;&#1077;&#1085;&#1080;&#1077;&#1084; &#1087;&#1072;&#1088;&#1072;&#1084;&#1077;&#1090;&#1088;
  554. ); stdcall;
  555.  
  556. { &#1042;&#1099;&#1079;&#1099;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1087;&#1088;&#1080; &#1085;&#1072;&#1083;&#1080;&#1095;&#1080;&#1080; &#1091; wave-&#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1072; &#1082;&#1072;&#1082;&#1086;&#1081;-&#1083;&#1080;&#1073;&#1086; &#1080;&#1085;&#1092;&#1086;&#1088;&#1084;&#1072;&#1094;&#1080;&#1080;, }
  557. { &#1085;&#1072;&#1087;&#1088;&#1080;&#1084;&#1077;&#1088; &#1087;&#1088;&#1080; &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;&#1080;&#1080; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; }
  558. { }
  559. {***********************************************************************}
  560. var
  561.  
  562. BaseRecorder: PWaveRecorder;
  563. begin
  564.  
  565. BaseRecorder := Pointer(DwInstance);
  566. with BaseRecorder^ do
  567. begin
  568. ProcessBuffer(uMsg, pWaveBuffer[ProcessedBuffers mod fTotalBuffers],
  569. WaveBufSize);
  570.  
  571. if (RecordActive) then
  572. case uMsg of
  573. WIM_DATA:
  574. begin
  575. BaseRecorder.AddNextBuffer;
  576. ProcessedBuffers := ProcessedBuffers + 1;
  577. end;
  578. end;
  579. end;
  580. end;
  581.  
  582. {------------------StartRecord---------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  583.  
  584. function TWaveRecorder.StartRecord: Boolean;
  585.  
  586. { &#1053;&#1072;&#1095;&#1072;&#1083;&#1086; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;. }
  587. { }
  588. {***********************************************************************}
  589. var
  590.  
  591. iErr, i: Integer;
  592.  
  593. begin
  594.  
  595. { &#1085;&#1072;&#1095;&#1072;&#1083;&#1086; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080; &#1074; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081; &#1073;&#1091;&#1092;&#1077;&#1088; }
  596. iErr := WaveInStart(WaveIn);
  597. if (iErr <> 0) then
  598. begin
  599. CloseWaveDeviceRecord;
  600. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1085;&#1072;&#1095;&#1072;&#1083;&#1072; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080; wave: ' +
  601. TWaveInGetErrorText(iErr);
  602.  
  603. end;
  604.  
  605. RecordActive := TRUE;
  606.  
  607. { &#1089;&#1090;&#1072;&#1074;&#1080;&#1084; &#1074; &#1086;&#1095;&#1077;&#1088;&#1077;&#1076;&#1100; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1073;&#1091;&#1092;&#1077;&#1088;&#1099; }
  608. for i := 1 to fTotalBuffers - 1 do
  609. if (not AddNextBuffer) then
  610. begin
  611. StartRecord := FALSE;
  612. Exit;
  613. end;
  614.  
  615. StartRecord := True;
  616. end;
  617.  
  618. {-----------------SetupRecord---------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  619.  
  620. function TWaveRecorder.SetupRecord(P: PWaveRecorder): Boolean;
  621.  
  622. { &#1044;&#1072;&#1085;&#1085;&#1072;&#1103; &#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1103; &#1076;&#1077;&#1083;&#1072;&#1077;&#1090; &#1074;&#1089;&#1102; &#1088;&#1072;&#1073;&#1086;&#1090;&#1091; &#1087;&#1086; &#1089;&#1086;&#1079;&#1076;&#1072;&#1085;&#1080;&#1102; waveform-"&#1079;&#1072;&#1087;&#1080;&#1089;&#1099;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;". }
  623. { }
  624. {***********************************************************************}
  625. var
  626.  
  627. iErr, i: Integer;
  628.  
  629. begin
  630.  
  631. dwTotalwavesize := 0;
  632. dwBytedatasize := 0;
  633. bufindex := 0;
  634. ProcessedBuffers := 0;
  635. QueuedBuffers := 0;
  636.  
  637. { &#1086;&#1090;&#1082;&#1088;&#1099;&#1074;&#1072;&#1077;&#1084; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; &#1076;&#1083;&#1103; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080; }
  638. iErr := waveInOpen(@WaveIn, WAVE_MAPPER, pWaveFmtEx,
  639. Integer(@BufferDoneCallBack),
  640.  
  641. Integer(P), CALLBACK_FUNCTION + WAVE_ALLOWSYNC);
  642. if (iErr <> 0) then
  643. begin
  644. RecErrorMessage := '&#1053;&#1077; &#1084;&#1086;&#1075;&#1091; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1100; &#1074;&#1093;&#1086;&#1076;&#1085;&#1086;&#1077; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; &#1076;&#1083;&#1103; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;: ' + ^M
  645. +
  646.  
  647. TWaveInGetErrorText(iErr);
  648. SetupRecord := FALSE;
  649. Exit;
  650. end;
  651.  
  652. { &#1089;&#1086;&#1086;&#1073;&#1097;&#1072;&#1077;&#1084; CloseWaveDeviceRecord(), &#1095;&#1090;&#1086; &#1091;&#1089;&#1090;&#1088;&#1086;&#1081;&#1089;&#1090;&#1074;&#1086; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1086; }
  653. bDeviceOpen := TRUE;
  654.  
  655. { &#1087;&#1086;&#1076;&#1075;&#1086;&#1090;&#1072;&#1074;&#1083;&#1080;&#1074;&#1072;&#1077;&#1084; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1080; }
  656.  
  657. InitWaveHeaders();
  658.  
  659. for i := 0 to fTotalBuffers - 1 do
  660. begin
  661. iErr := waveInPrepareHeader(WaveIn, pWaveHeader[I], sizeof(TWAVEHDR));
  662. if (iErr <> 0) then
  663. begin
  664. CloseWaveDeviceRecord;
  665. RecErrorMessage := '&#1054;&#1096;&#1080;&#1073;&#1082;&#1072; &#1087;&#1086;&#1076;&#1075;&#1086;&#1090;&#1086;&#1074;&#1082;&#1080; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1082;&#1072; &#1076;&#1083;&#1103; &#1079;&#1072;&#1087;&#1080;&#1089;&#1080;: ' + ^M +
  666. TWaveInGetErrorText(iErr);
  667. SetupRecord := FALSE;
  668. Exit;
  669. end;
  670. end;
  671.  
  672. { &#1076;&#1086;&#1073;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084; &#1087;&#1077;&#1088;&#1074;&#1099;&#1081; &#1073;&#1091;&#1092;&#1077;&#1088; }
  673. if (not AddNextBuffer) then
  674. begin
  675. SetupRecord := FALSE;
  676. Exit;
  677. end;
  678.  
  679. SetupRecord := TRUE;
  680. end;
  681.  
  682. {-----------------ProcessBuffer---------------John Mertus---14-&#1048;&#1102;&#1085;&#1100;--97--}
  683.  
  684. procedure TWaveRecorder.ProcessBuffer(uMsg: Word; P: Pointer; n:
  685. Integer);
  686.  
  687. { &#1041;&#1086;&#1083;&#1074;&#1072;&#1085;&#1082;&#1072; &#1087;&#1088;&#1086;&#1094;&#1077;&#1076;&#1091;&#1088;&#1099;, &#1074;&#1099;&#1079;&#1099;&#1074;&#1072;&#1077;&#1084;&#1086;&#1081; &#1087;&#1088;&#1080; &#1075;&#1086;&#1090;&#1086;&#1074;&#1085;&#1086;&#1089;&#1090;&#1080; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;. }
  688. { }
  689. {***********************************************************************}
  690. begin
  691. end;
  692.  
  693. end.
  694.  
  695.  
  696.  


Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 4 декабря 2006, 16:34


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.