Lync 2013 SDK - Присоединяйтесь к конференции и подключайте AVModality, если для параметра "Присоединиться к собранию аудио из" установлено значение "Не присоединять аудио"
Я довольно новичок в Lync 2013 SDK (использую его уже пару недель) и смог выяснить в основном все, что мне нужно, кроме этого...
Когда я присоединяюсь к конференции (используя ConversationManager.JoinConference()), она присоединяется нормально. Однако в некоторых случаях (не во всех) я хочу подключить AVModality к конференции. Иногда это работает, иногда просто сидит в "Соединении" и никогда не соединяется (даже если я позвонил в EndConnect).
То, что я нашел, - это настройка в настройках Skype -> Skype Meetings -> Присоединение к конференции, кажется, переопределяет мой код. Может быть, состояние гонки?
Если для параметра установлено значение "Не присоединять аудио" и "Перед тем, как присоединиться к собраниям, спросите меня, какое аудиоустройство я хочу использовать" НЕ ПРОВЕРЕНО (имеется в виду, что я не получаю приглашения при присоединении): конференция присоединяется, AVModality отключается -> Подключение -> Отключено. Затем мой код запускает BeginConnect, и AVModality отключается -> Соединяется - и никогда не разрешается (иногда я получаю быстрый звуковой сигнал "занято").
Когда "Перед тем, как присоединиться к собраниям, спросите меня, какое аудиоустройство я хочу использовать" ПРОВЕРЕНО (имеется в виду, что я получаю приглашение): конференция присоединяется, приглашение спрашивает, как подключиться, если я выбираю Skype для бизнеса - оно подключает аудио нормально (ожидается). Интересно, что если я вешаю вызов с помощью пользовательского интерфейса Lync (AVModality переходит в Disconnected), он сразу же подключается снова (при условии, что мой BeginConnect делает это).
Вот где это становится действительно запутанным: если я вызываю BeginConnect, когда состояние подключается к AVmodality в обработчике событий ModalityStateChanged... происходит следующее: присоединяется к конференции, запрашивает, как подключиться (на этом этапе состояние AVmodality "подключается" пока не будет принято решение по запросу) - это означает, что мой BeginConnect срабатывает. Затем, если я выберу "Не присоединять аудио" в приглашении... Состояние AVModality переходит в "Соединение" -> "Отключено" -> "Соединение" -> "Присоединение" -> "Подключено". Итак, мой BeginConnect уже выполняется и все еще работает в этом случае до тех пор, пока он запускается ПЕРЕД выбором "Не присоединять аудио".
Поэтому мне интересно, действительно ли выбор "Не объединять аудио" (с приглашением или без него) устанавливает какие-либо другие свойства для чего-либо, что препятствует подключению AVModality после этой точки без каких-либо дополнительных фокусных фокусов? Если так - я хотел бы знать, какой дополнительный фокус-покус мне нужно выполнить:)
Спасибо за любую помощь!
2 ответа
Это сводится к тому... присоединяется ли присоединение к конференции к аудио или нет - я обработал все сценарии, кроме одного, который я до сих пор не могу выяснить: 1. Мне нужно подключить аудио конференции, но пользователь выбирает НЕ присоединять аудио (либо в приглашении, либо в настройках параметров Skype).
В этом случае - я добавил обработчик события в событие изменения состояния модальности, а когда NewState == Disconnected, я запускаю BeginConnect для самой модальности. Это отлично работает. В рамках обратного вызова у меня есть вызов EndConnect. Тем не менее, состояние AVModality продолжает оставаться в состоянии "Соединение" и никогда не преобразуется в соединение. На интерфейсе - он показывает кнопки аудио, но все серые (как обычно, когда он подключается). Я не уверен, как заставить это закончить соединение?
Вот фрагмент кода:
if (merge)
{
myHandler = delegate (object sender1, ModalityStateChangedEventArgs e1)
{
AVModality avModality = (AVModality)sender1;
Globals.ThisAddIn.confConvo = avModality.Conversation;
if (e1.NewState == ModalityState.Connected)
{
DialNumberInSkype(meetingInfo);
avModality.ModalityStateChanged -= myHandler;
}
if (e1.NewState == ModalityState.Disconnected)
{
object[] asyncState = { avModality, "CONNECT" };
avModality.BeginConnect((ar) =>
{
avModality.EndConnect(ar);
DialNumberInSkype(meetingInfo);
}, asyncState);
avModality.ModalityStateChanged -= myHandler;
}
};
}
РЕДАКТИРОВАТЬ: По какой-то причине я не могу добавить комментарий прямо сейчас...
Я попытался установить конечную точку, как вы предложили. Тем не менее я получаю ошибку ArgumentException "Значение не попадает в ожидаемый диапазон". Поэтому я попытался жестко запрограммировать значение uri в CreateContactEndpoint для "sip:my_login@domain.com" (кроме реального значения, конечно) - и получил ту же ошибку ArgumentException. Я добавил точку останова до этого и смог увидеть значение для avModality.Endpoint - и оно фактически установлено для меня все время... это не ноль или не сбрасывается, когда я пытаюсь вызвать BeginConnect.
Когда вызывается JoinConference(), аудио-модальность будет подключена даже без явного вызова BeginConnect().
Когда отображается запрос на выбор аудиоустройства (когда в скайпе установлена опция запроса перед соединением), свойство диалога ConferenceEscalationProgress будет иметь значение AwaitingJoinDialogResponse.
Установка свойства диалога ConferenceJoinDialogCompleted в значение true инициирует подключение Modality, даже если приглашение не закрыто.
отредактированный
Если выбрано "Не присоединять аудио", модальность будет отключена, в этот момент вы пытаетесь вызвать BeginConnect(). Попробуйте установить конечную точку модальности перед вызовом BeginConnect().
conversation.Modalities[ModalityTypes.AudioVideo].Endpoint = lyncClient.Self.Contact.CreateContactEndpoint(lyncClient.Self.Contact.Uri);