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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2010, 20:15   #1
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию Передача потока по UDP.

Здравствуйте, немного дублирую тему.Просто решил засунуть ее в соответствующий раздел.

Проблема в передачи потока.С воспроизведением отдельного файла через BASS проблем не было.
Функцию RdBuf писал не сам, мне ее подсказали.(Заметил, что BufLen всегда пустой, наверное тут проблема)
Данные приходят, но не сохраняются в буфер, в последствии я не могу их воспроизвести.Подскажите в чем проблема.
Читал эту статью - не помогло.
Код:
function RdBuf(action: DWORD; param1: DWORD; param2: DWORD; user: DWORD): DWORD; stdcall;
var
  buf: ^Char;
  tmp: PChar;
  i: Integer;
begin
case action of
  BASS_FILE_LEN:  Result:=0;
  BASS_FILE_READ:
    begin
      buf := Pointer(param2);
      i:=0;
      repeat
        tmp :=StrBuf+LStrPos;
        buf^:=tmp^;
        Inc(LStrPos);
        Inc(buf);
        Inc(i);
        if LStrPos>BufLen then LStrPos:=0;
      until (i=param1) or (LStrPos=RStrPos);
      Result:=i;
    end;
  BASS_FILE_QUERY:  if LStrPos=RStrPos then Result:=0
                    else Result:=param1;
  BASS_FILE_CLOSE:  Playing:=False;
end;
end;


procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
len:integer;
tmp:PChar;
begin
  len:=AData.Size;
  tmp :=StrBuf+RStrPos;
  if BufLen-RStrPos < len then
  begin
    AData.Read(tmp^,BufLen-RStrPos);
    RStrPos:=AData.Read(StrBuf^,len-BufLen+RStrPos)-1;
  end
  else
  begin
    RStrPos:=RStrPos+AData.Read(tmp^,len);
  end;
  Memo1.Lines.Add('Buffer len = ' + inttostr(BufLen) +';' + 'recieved len = ' + inttostr(len));
end;
Clos вне форума Ответить с цитированием
Старый 20.06.2010, 20:52   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- вы не заходили по ссылке указанной в статье http://www.programmersforum.ru/showthread.php?t=91506, иначе-бы нашли функцию приема потока и передачи:
Код:
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;
 SoundStreamIn.Read(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;
2-
Цитата:
Заметил, что BufLen всегда пустой
во-от, а уверены, что вы передаете вообще что-то? как проверили?

3- function RdBuf, где ее вызов ...что по вашему она делает?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 20.06.2010, 21:17   #3
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Цитата:
вы не заходили по ссылке указанной в статье http://www.programmersforum.ru/showthread.php?t=91506, иначе-бы нашли функцию приема потока и передачи:
И правда не заходил.Спасибо.Почитаю.

Цитата:
во-от, а уверены, что вы передаете вообще что-то? как проверили?
Проверил?
Код:
Memo1.Lines.Add('Buffer len = ' + inttostr(BufLen) +';' + 'recieved len = ' + inttostr(len));
- len выводит, Buflen - нет.
Вывод len происходит при активированном сервере.Выключаешь сервер или не выбираешь файл - ничего не происходит.

Цитата:
3- function RdBuf, где ее вызов ...что по вашему она делает?
Считывание буфера.
Вызов допустим вот тут.
Код:
StrBuf :=AllocMem(1024*1024*10);
BASS_Init(1,44100,0,Handle,nil);
OutStream:=BASS_StreamCreateFileUser(true, BASS_STREAM_BLOCK, @RdBuf, 0);
Или тут
Код:
StrBuf :=AllocMem(1024*1024*10);
BASS_Init(1,44100,0,Handle,nil);
OutStream:=Bass_StreamCreateFile(false, @RdBuf, 0 , 0 ,0);

Последний раз редактировалось Clos; 21.06.2010 в 00:47. Причина: немного упустил...
Clos вне форума Ответить с цитированием
Старый 21.06.2010, 15:01   #4
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Пытаюсь сохранить поток вот так.
Код:
OutStream:=BASS_StreamCreateFileUser(true,BASS_STREAM_BLOCK,@RdBuf,0);
Сдвиги по lstrpos и rstrpos происходят.Т.е. вывожу в memo
Код:
Memo1.Lines.Add('Lstrpos= '+inttostr(lstrpos)+'.'+ 'Rstrpos = ' + inttostr(rstrpos));
Правая позиция меняется, левая все время 4000.
Проигрывание звука не происходит (BASS_ChannelPlay(OutStream, False); )

При проверке
Код:
if outstream = 0 then
    begin
      messagebox(0,'Ошибка загрузки файла',0,MB_OK or MB_ICONSTOP);
      exit;
    end;
Всегда вылетает ошибка.Подскажите, пожалуйста в чем проблема?
Clos вне форума Ответить с цитированием
Старый 21.06.2010, 15:18   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- не видно в коде, где вообще заносятся значения в BufLen ...если так, то он и будет нулевым
2- попробуйте для начала вывести принятый буфер через waveout, если получится, то тогда прикручивать bass
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 21.06.2010, 15:21   #6
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- не видно в коде, где вообще заносятся значения в BufLen ...если так, то он и будет нулевым
2- попробуйте для начала вывести принятый буфер через waveout, если получится, то тогда прикручивать bass
1 - const buflen=1024*1024*10;
2 - Через waveout, это подобно, как у вас в статье?Или в теме, где вы помогали?Если честно, я не совсем понимаю, как именно это делать...

Последний раз редактировалось Clos; 21.06.2010 в 15:28.
Clos вне форума Ответить с цитированием
Старый 21.06.2010, 15:47   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

waveout, как у меня в статье и в теме, где помогал ...делается аналогично как по ссылке в посте #2/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 21.06.2010, 16:37   #8
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Тему можно закрыть.Во всем разобрался.
Благодарю за участие.

Последний раз редактировалось Clos; 22.06.2010 в 00:08. Причина: the end
Clos вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача потока. TServer\ClientSocket NikLik Работа с сетью в Delphi 9 17.05.2013 15:12
Передача потока с использованием idtcpServer Lvenok Помощь студентам 0 24.03.2010 19:03
передача потока по TidUDPclient аааб Работа с сетью в Delphi 0 14.03.2009 13:04
Client Server Socket передача информации с помощью потока One.Love Работа с сетью в Delphi 4 15.01.2008 19:06
Передача файлов по UDP GAGARIN-NEW Работа с сетью в Delphi 3 15.11.2007 22:45