Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2010, 15:59   #21
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...подход вам следует изменить, посылать нужно сразу при поступлении данных, к примеру в wndproc():
Код:
MM_WIM_Data: DoBufferFull(PWaveHDR(Message.LParam));
передаем в процедуру указатель на область со структурой:
Код:
procedure DoBufferFull(Header : PWaveHdr);
var
   Res                        : Integer;
   BytesRecorded              : Integer;
   Data                       : Pointer;
begin
    BytesRecorded:= header.dwBytesRecorded;

    if assigned(FOnBufferFull) then begin
      Getmem(Data, BytesRecorded);
      try
        move(header.lpData^,Data^,BytesRecorded);
        FOnBufferFull(Self, data, BytesRecorded); 
      finally
        Freemem(Data);
      end;
    end;

    Res := WaveInUnPrepareHeader(FWaveInHandle,Header,sizeof(TWavehdr));
    if Res <>0  then RaiseException('WaveIn-UnprepareHeader', Res);

    header.dwbufferlength:=FBufferSize;
    header.dwBytesRecorded:=0;
    header.dwUser:=0;
    header.dwflags:=0;
    header.dwloops:=0;
    FillMemory(Header.lpData,FBufferSize,0);

    Res := WaveInPrepareHeader(FWaveInHandle,Header,sizeof(TWavehdr));
    Res := WaveInAddBuffer(FWaveInHandle,Header,sizeof(TWaveHdr));
   end // проверки поубирал, чтоб упростить
end;
и собственно передача данных потоком через UDP:
Код:
procedure Tipt.ACMIn1BufferFull(Sender: TObject; Data: Pointer;
  Size: integer);
var k: Tmemorystream;
    p: pointer;
    h: boolean;
    oldsize: integer;
begin
  k:= tmemorystream.Create;
  k.Clear;
  oldsize := size;

  try
    if assigned(fselfsound) then
    begin
      fselfsound(p, size, h);
      if h and (size > 0) then 
      begin 
        k.Write(p^, size);
        freemem(p) 
      end 
      else 
        k.Write(Data^, oldsize)
    end 
    else
      k.Write(Data^, size);
      nm.Sendstream(k); // NM: TNMUDP
  finally
    k.Clear;
    k.Free
  end
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.04.2010, 16:11   #22
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

В вашем коде я некоторых вещей не понимаю правда, но, Спасибо вам большое! Буду разбираться, вы очень помогли мне в моем вопросе! Как сделаю, выложу исходники. Спасибо ещё раз.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.04.2010, 16:14   #23
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...скажем так, я немножко выложил коммерческого кода ...и зря-вы asmin/out не добили.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.04.2010, 18:20   #24
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Один вопросик остался. Изучив ваш код (на сколько смог), написал свой:
Код:
procedure TForm1.OnWaveMessage(var msg:TMessage);
 var
   temp: pWaveHdr;
   recorded: integer;
   soundStream:TMemoryStream;
begin
temp:=address;
address:=@WaveHdr1;
if button1.Caption='Отключить' then
waveInAddBuffer(WaveIn,address,sizeof(TWaveHdr));
recorded:=address.dwBytesRecorded;
If recorded=0 then
begin
soundStream:=TMemoryStream.Create;
soundStream.WriteBuffer(temp^,WaveDataLength);
showmessage('asfasf');
UDPClient1.BufferSize:=WaveDataLength;
UDPClient1.SendBuffer(soundStream,UDPClient1.BufferSize);
end;
end;
Данная процедура ловит MM_WIM_DATA, все работает нормально, т.е. есть реакция на окончание записи в буффер: showmessage('asfasf'); выводится все время как только буффер заполняется, но как только я начинаю подключать TIdUDPClient из библиотеки Indy, то вылетают ошибки либо связанные с памятью либо с неправильным адресом вот здесь UDPClient1.SendBuffer(soundStream,U DPClient1.BufferSize);
P.S. Вроде бы сделал... осуществил передачу звука порционно, сейчас пытаюсь настроить вывод звука через WaveOut...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 08.04.2010 в 19:19.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.04.2010, 19:48   #25
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Я на последнем рубеже работы! Подскажите пожалуйста как добавить полученный потоком в WaveOut? Не могу найти с помощью какой функции это сделать!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 08.04.2010 в 19:55.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.04.2010, 20:47   #26
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

приняли поток, занесли его в буфер (Bufferointer; Size: Integer), восстановили структуру и выделили память
Код:
var
  TempHeader              : PWaveHdr;
  Data                        : Pointer;
  Res                         : Integer; 
begin
 //выделяем память и заполняем структуру PWaveHdr
   GetMem(Data, Size);
   Move(Buffer^,Data^,Size);
  with TempHeader^ do begin
    lpData := data;
    dwBufferLength := Size;
    dwBytesRecorded :=0;
    dwUser := 0;
    dwFlags := 0;
    dwLoops := 1;
  end;

 // ВОСПРОИЗВЕЛИ
 Res := WaveOutPrepareHeader(FWaveOutHandle,TempHeader,SizeOf(TWaveHDR));
 Res := WaveOutWrite(FWaveOutHandle, TempHeader, SizeOf(TWaveHDR));
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.04.2010, 20:54   #27
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Спасибо большое, я попробую, как приду домой! А вот этот смайлик получился сочитанием ":" и "P"? на самом деле там тип Pointer. Прикольно Спасибо ещё раз.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 09.04.2010, 00:59   #28
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Что-то не получается у меня... видимо что-то не правильно делаю...
Вот код отправки пакетов
Код:
procedure TForm1.OnWaveMessage(var msg:TMessage);
 var
   temp: pWaveHdr;
   recorded: integer;
begin
i:=i+1;
soundStream:=TMemoryStream.Create;
temp:=address;
address:=@WaveHdr1;
// åñëè íå îñòàíîâëåíî, ñòàâèì â î÷åðåäü
if button1.Caption='Îòêëþ÷èòü' then
waveInAddBuffer(WaveIn,@WaveHdr1,Sizeof(TWaveHdr));
recorded:=address.dwBytesRecorded;
If recorded=0 then
begin
//soundStream.Read(WaveHdr1.lpdata^,WaveDataLength);
soundStream.Write(WaveHdr1.lpdata^,WaveDataLength);
Memo.Lines.Add('Ïàêåò '+inttostr(i)+'; '+#13+#10+StreamToHex(soundStream));
//soundStream.Clear;
//soundStream.Seek(0,soFromBeginning);
UDPClient1.BufferSize:=WaveDataLength;
UDPClient1.SendBuffer(soundStream.Memory^,soundStream.size);
soundStream.Clear;
Soundstream.Free;
end; 
end;
Вот код приема
Код:
procedure TForm1.UDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var
SoundStreamIn:TMemoryStream;
Tempheader:PWaveHdr;
Data:Pointer;
Res:integer;
buffer:Pointer;
Size:integer;
begin
SoundStreamIn:=TMemoryStream.Create;
//soundStream.CopyFrom(Adata,aData.size);
SoundStreamIn.Read(Adata,aData.size);
//SoundStreamIn.Write(Adata,Adata.Size);
Memo1.Lines.Add('Ïàêåò '+inttostr(i)+'; '+#13+#10+StreamToHex(soundStreamIn));
buffer:=SoundStreamIn;
size:=WaveDataLength;
GetMem(Data,Size);
Move(Buffer^,Data^,Size);
With Tempheader^ do begin
lpData:=data;
dwBufferLength:=size;
dwBytesRecorded:=0;
dwUser:=0;
dwFlags:=0;
dwLoops:=1;
end;
waveOutOpen(@WaveOut,WAVE_MAPPER,@Waveformat,Self.Handle,0,CALLBACK_WINDOW);
waveOutPrepareHeader(Waveout,Tempheader,Sizeof(TWaveHdr));
waveOutWrite(WaveOut, Tempheader,Sizeof(TwaveHdr));
soundStreamIn.Clear;
SoundstreamIn.Free;
//FreeMem(data);
Что не правильно? Ошибки летят...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 09.04.2010, 11:08   #29
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- waveOutOpen( - делается один раз вначале до всей котовасии
2- вы приравниватете buffer с типом pointer к SoundStreamIn с типом tmemorystream (УБРАТЬ)
3- size:=WaveDataLength - это зачем (УБРАТЬ)? количество принятых нам известно, это aData.size
4- смысл тут как раз передать указатель из потока, поправить:
Код:
...
var
  TempHeader              : PWaveHdr;
  Data                        : Pointer;
...
begin
 SoundStreamIn:=TMemoryStream.Create;
 SoundStreamIn.Read(Adata,aData.size);

  GetMem(TempHeader, SizeOf(TWaveHDR));
  GetMem(Data, aData.Size);
  Move(aData.memory^, Data^, aData.Size);
  with TempHeader^ do begin
    lpData := data;
    dwBufferLength := Size;
    dwBytesRecorded :=0; 
    dwUser := 0;
    dwFlags := 0;
    dwLoops := 1;
  end;

 WaveOutPrepareHeader(FWaveOutHandle,TempHeader,SizeOf(TWaveHDR));
 WaveOutWrite(FWaveOutHandle, TempHeader, SizeOf(TWaveHDR));
...
end;
5- не учтен эффект накопления данных, устройство вывода может не успеть за принятыми данными, но это на будущее.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 09.04.2010 в 14:05.
raxp вне форума Ответить с цитированием
Старый 09.04.2010, 16:43   #30
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Не работает. Понимаете в чем дело... когда я начинаю записывать считанные данные в поток с помощью write и мониторю то, что действительно поток содержит данные!!! вот здесь:
Код:
soundStream.Write(WaveHdr1.lpdata^,WaveHdr1.dwBufferLength);
Memo.Lines.Add('...'+inttostr(i)+'; '+#13+#10+StreamToHex(soundStream));
То, на сервере ничего не приходит вообще!!! (определяю я это в событии сервера, выводом данных потока на мемо (т.е. если бы что-то приходило, то мемо бы показало это, даже если пришло пустое сообщение)) Осуществляется только соединение и все!!!
Когда же я строчку soundStream.Write(WaveHdr1.lpdata^, WaveHdr1.dwBufferLength); убираю! То клиент начинает отправлять ПУСТЫЕ пакеты на сервер, и сервер эти пустые пакеты принимает! (мемо выводит надписи без оцифрованых данных). Может ли это быть из-за того, что я как-то не правильно звук в буфер заношу? (хотя наврятли, по нажатию на кнопку я определяю, сколько осталось байт свободных) Подскажите в чем дело пожалуйста... И ещё:
Код:
Move(aData.memory^, Data^, aData.Size);
Вот тут вот я не могу сослаться на memory для adata, могу просто напечатать: adata. И ещё вот что... данные из потока soundstream что сами приходят в Adata:Tstream??? или их туда надо заносить с помощью Adata.readbuffer? Если так, то как мне узнать, на какой буффер ссылаться, если программа находится на удаленном компьютере?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 09.04.2010 в 17:04.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WEB - программист. Временный сотрудник - работа дому. Julia G Фриланс 2 23.03.2010 21:45
Как найти временный файл bakabul JavaScript, Ajax 1 01.11.2008 09:44
Временный проект по DirectX (Москва) _HR Фриланс 1 19.02.2008 13:14
Запись в буфер Delphi & Asm SteelRat Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 27.02.2007 22:49