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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

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

Пытаюсь написать программу передачи музыки через udp.Проигрывание bass-ом.
Данные передаю, через поток.
Посмотрите код, пожалуйста.
Комментарии в коде я оставил...

Код:
//Старт
procedure TForm1.Button2Click(Sender: TObject);
var
OutStream: HSTREAM;
begin
  IdUDPServer1.DefaultPort := 3001;
  IdUDPServer1.Active := True;
  StrBuf := AllocMem(1024*1024*10); //память под буфер
  BASS_Init(1,44100,0,Application.Handle,nil);
  OutStream:=BASS_StreamCreateFileUser(true, BASS_STREAM_BLOCK, @RdBuf, 0);
  BASS_ChannelPlay(OutStream, false);
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 вне форума Ответить с цитированием
Старый 19.06.2010, 17:29   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

рекомендовал-бы обратить ваше внимание на статью Александра Уколова в >>> третьем нумере нашего журнала <<<, практически все разложено по полочкам ...насчет bass - это отдельный разговор, проблема у вас не в нем.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.06.2010, 19:30   #3
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию Как-то так

Выложу исходники, вдруг добрый человек посмотрит.
raxp, спасибо за ссылку.Про журнал не знал.Понравилось.
Посмотрел, как реализуется передача звука по сети, через микрофон, но у меня все-таки немного другая задача.
Раз проблема не в bass, попробую поискать.

p.s.Присмотрел библиотеку NewAC.Поддерживает потоковое воспроизведение, если не ошибаюсь.Вот думаю, что лучше.
И вообще как.
Вложения
Тип файла: rar udp.rar (589.8 Кб, 29 просмотров)

Последний раз редактировалось Clos; 19.06.2010 в 19:50.
Clos вне форума Ответить с цитированием
Старый 20.06.2010, 13:27   #4
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Ни у кого никаких идей нету?
Просто проблема на поверхности чувствую, а я ее не вижу...
Передача данных проходит, получается со стороны клиента только косяк.
Clos вне форума Ответить с цитированием
Старый 20.06.2010, 16:39   #5
Clos
Пользователь
 
Аватар для Clos
 
Регистрация: 09.06.2010
Сообщений: 19
По умолчанию

Код:
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.Button1Click(Sender: TObject);
begin
  IdUDPClient1.Host := Edit1.Text;
  IdUDPClient1.Port := StrToInt(Edit2.Text);
  IdUDPClient1.Send(Edit1.Text, StrToInt(Edit2.Text), 'Hello');
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;

//инициализация,старт
procedure TForm1.Button2Click(Sender: TObject);
begin
  IdUDPServer1.DefaultPort := 3001;
  IdUDPServer1.Active := True;
  StrBuf := AllocMem(1024*1024*10); //память под буфер
  BASS_Init(1,44100,0,Application.Handle,nil);
  OutStream:=BASS_StreamCreateFileUser(true, BASS_STREAM_BLOCK, @RdBuf, 0);
  BASS_ChannelPlay(OutStream, true);
end;

end.
Ткните в ошибку, если кто видит.
Данные приходят, но проигрывание не происходит.
Может все-таки bass виноват?Криво написано...
Clos вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UDP сниффер XAOC-forever Работа с сетью в Delphi 3 11.07.2011 22:14
CSS, border у checkbox'ов и radio Angfal HTML и CSS 8 29.05.2009 11:41
Применить стиль ко всем инпутам, кроме "radio" и "checkbox"? barbiturat HTML и CSS 1 03.12.2008 15:33
Проблема с UDP Kirill666 Работа с сетью в Delphi 3 22.03.2007 21:55