Аудио по сетке

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Аудио по сетке

Сообщение kirrun » 20.04.2005 (Ср) 14:28

Короче, задача такая: Сделать прогу, для разговора голосом по локалке. Желательно, чтоб работала без сервера (Компютер-Компьютер). Проблема в том, что я даже примерно не представляю как это сделать...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 20.04.2005 (Ср) 14:41

DirectX
боле ничё не скажу...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 20.04.2005 (Ср) 14:47

А ничего больше и не скажешь - разве что либо самому писать тот же директикс, либо на каждой машине поднимать сервер вещания WindowsMedia и натравливать медиаплееры на компы друг друга :))

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 20.04.2005 (Ср) 14:54

DirectX это, конечно, хорошо... Но можно чуть подробнее?
Или хотя бы топик показать...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.04.2005 (Чт) 14:15

Голос пишеться с помощью winmm.dll или с помощью directsound (да хоть через ASIO.dll) - не важно. Дык вот, пишеться и сжимается в реальном времени каким-нибудь кодеком не жадным до ресурсов (.Hxxx? nsa?), потом передается другу (по wsock?) и расжимается у него на машине.
Следующим этапом буфер создаешь с этими данными и передаешь этот буфер на воспроизведение. Если звук полнодуплексный, то и говорить/слушать можно вместе, иначе - как по рации.

ps: хотя вариант "использовать Netmeeting" мне нравиться больше.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 21.04.2005 (Чт) 15:57

Дык как его передавать в реальном времени?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.04.2005 (Чт) 16:01

А как ты файл передаешь? С winsock работал?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 21.04.2005 (Чт) 16:04

Ясен пень... но как заставить в РЕАЛЬНОМ времени?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.04.2005 (Чт) 16:06

А что ты подразумеваешь под реальным временем?
Включи netmeeting на слабом канале - он там тоже работать еле будет. Звук будет с огромными лагами приходить.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 21.04.2005 (Чт) 16:38

Что нарыл в МСДН по директ х 8.0:
1. DirectPlay updates for scalability and performance
The Microsoft DirectPlay® component has been extensively updated to improve its ease of use and to increase its capabilities, especially with regard to scalability and performance. In addition, DirectPlay now supports voice communication between players.
2. На том же микрософте написано, что для СДК директа 8.0 есть примерчик на VB (SDK Root)Samples\Multimedia\VBSamples\DirectPlay\VoiceGroup

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 21.04.2005 (Чт) 19:59

xolod писал(а):А что ты подразумеваешь под реальным временем?
Включи netmeeting на слабом канале - он там тоже работать еле будет. Звук будет с огромными лагами приходить.


Но меня интересует чтоб на большом канале без лагов!
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 22.04.2005 (Пт) 12:15

Алгоритм таков:
1. Создать связь м/у компьютерами сокетами
2. Через свойства DirectX через микрофон записать звук в специальный буфер
3. У спец буфера есть событие, когда он наполняется, в это время через винсок передаёшь байты по сети
4. А принимающий просто воспроизводит.
Если конкретно интересует, как это сделать через DirectX, напиши в общак
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 22.04.2005 (Пт) 12:24

Блин, да юзайте DirectPlay!
Зачем париться с винсоком, а?

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 22.04.2005 (Пт) 12:27

Snussi Без винсока довольно-таки проблематично переправить поток данных.
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 22.04.2005 (Пт) 13:02

А средства DirectPlay на что? Они никакого винсока не трубуют!
Все уже украдено за нас :)

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 22.04.2005 (Пт) 13:11

Snussi
Ты поясни свою мазу. Непонятно же ничего. Расскажи честному народу про свойства DirectPlay'я
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 22.04.2005 (Пт) 13:27

SeT писал(а):Snussi
Ты поясни свою мазу. Непонятно же ничего. Расскажи честному народу про свойства DirectPlay'я


Чё расказывать то?! SDK переводить чтоли?!?!

Качаем DirectX SDk и смотрим, кстати, д3дрм правду сказал, сам видел там пример болтанья по сетке
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 22.04.2005 (Пт) 13:31

Ок, попробую :)
1. Используем нецентрализованную систему - т.е. PeerToPeer
2. Создаем при помощи DirectPlay "игровую" сессию. При этом, за передачу данных, их связывание и тд отвечает сам DirectPlay. У меня пример дома валяется - так что код запостить не могу до понедельника. Ну там и нет ничего сложного. Я разобрался в свое время за день.
3. А дальше - цитата из MSDN
DirectPlay Voice Networking
Microsoft® DirectPlay® Voice uses a DirectPlay session for media-independent network transport and player management. The DirectPlay Voice API does not duplicate session control features from DirectPlay. A DirectPlay network transport session must also be created before DirectPlay Voice can transmit and receive voice communications. DirectPlay Voice can use either the IDirectPlay4 object or IDirectPlay8 object for network transport.

Note that if DirectPlay Voice is being used in-process with a multiplayer game, the game will most likely also use the transport session to exchange its game-specific data. This makes it possible to optimize the use of network resources between the game and voice data.

It is also acceptable to create and use a transport session specifically for the voice session, as would be the case for a standalone voice conferencing application.

Опять же, пример я указывал выше.
Никаких дополнительных сетевых объектов (типа винсока) создавать не надо! DirectPlay самодостаточен полностью!

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 22.04.2005 (Пт) 13:55

Так ладно... Тогда где его можно скачать?

З.Ы. все-таки модожду примерчик ибо не горит...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 22.04.2005 (Пт) 14:26

Через еМул.
Или хорошенько на микрософте порыться - но там, в основном, только 9.

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 26.04.2005 (Вт) 9:52

Итак, обещанные исходники. Извините за кривость кода :)
I. Серверная часть
BF - основная форма, InterList - список
0. Глобальные переменные
Код: Выделить всё
Public g_DPlay As DirectPlay4
Public g_EnumConnections As DirectPlayEnumConnections
Public g_DPAddress As DirectPlayAddress

1. Стартовая функция
Код: Выделить всё
Private Sub Form_Load()
     Set g_DPlay = g_dx.DirectPlayCreate("")
     Set g_EnumConnections = g_DPlay.GetDPEnumConnections("", DPCONNECTION_DIRECTPLAY)
     InterList.Clear
    ' Поиск доступных сетевых интерфейсов....
    If InitConnList = False Then
        Log "Интерфейсы не найдены. Останов."
        Exit Sub
    End If
End Sub

2. Функция, заполняющая список возможными типами подключений
Код: Выделить всё
Public Function InitConnList() As Boolean
  Dim NumConnections As Long
  Dim strName As String
  Dim x As Long
  On Error GoTo FAILED
  NumConnections = g_EnumConnections.GetCount

  For x = 1 To NumConnections
    strName = g_EnumConnections.GetName(x)
    BF.InterList.AddItem strName
  Next x
  InitConnList = True
  Exit Function
 
  ' Error handlers
FAILED:
  InitConnList = False
  Exit Function
End Function

3. Функция, обрабатывающая клик на элементе списка
Код: Выделить всё
Private Sub InterList_DblClick()
'     Продолжаем инициализацию интерфейсов
    If InitInterFace(InterList.ListIndex + 1) = True Then
         InterList.Visible = False
         StartServer
    End If
End Sub

4. Инициализация интерфейса
Код: Выделить всё
Public Function InitInterFace(InterF As Long) As Boolean
  On Error GoTo INITIALIZEFAILED
  Set g_DPAddress = g_EnumConnections.GetAddress(InterF)
  Call g_DPlay.InitializeConnection(g_DPAddress)
  On Error GoTo 0
 
  InitInterFace = True
  Exit Function
  ' Error handlers
INITIALIZEFAILED:
  If Err.Number <> DPERR_ALREADYINITIALIZED Then
    InitInterFace = False
  End If
End Function

5. Функция StartServer
Код: Выделить всё
Public Sub StartServer()
    BF.Show
    MaxPlayers = 16
    SessionName = "TestServer Session"
    fGUID = "{AC330441-9B71-11D2-9AAB-0020781461AC}" ' Гуид, как вы понимаете, любой.
    Dim SessionData As DirectPlaySessionData
    Set SessionData = g_DPlay.CreateSessionData
    Call SessionData.SetMaxPlayers(MaxPlayers)
    Call SessionData.SetSessionName(SessionName)
    Call SessionData.SetGuidApplication(fGUID)
    Call SessionData.SetFlags(DPSESSION_DIRECTPLAYPROTOCOL Or DPSESSION_OPTIMIZELATENCY)

  on error GoTo failedOpen
  Call g_DPlay.Open(SessionData, DPOPEN_CREATE)
    debug.print "Сервер с именем " + SessionName + " создан. Максимальное количество игроков - " + CStr(MaxPlayers)
    CreateServerPlayer
    Log "Цикл ожидания событий запущен."
    Do While DoEvents()
        GetDPMessages
    Loop
    Exit Sub
failedOpen:
    debug.print "Не могу создать сервер !"
    End
End Sub

5. Функция GetDPMessages сильно зависит от проекта, поэтому писать ее не буду :)

Клиентскую часть запостю чуть позже.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 66

    TopList