Merge branch 'master' of https://bitbucket.org/Ansariel/phoenix-firestorm-webrtc-voice
# Conflicts: # .github/workflows/build.yaml # indra/newview/CMakeLists.txt # indra/newview/llspeakers.cpp # indra/newview/llvoicechannel.cpp # indra/newview/llvoicechannel.h # indra/newview/llvoiceclient.cpp # indra/newview/llvoiceclient.h # indra/newview/llvoicewebrtc.cppmaster
commit
25b7fd4fa9
|
|
@ -370,15 +370,32 @@ jobs:
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Download viewer exe
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Windows-app
|
||||||
|
path: _artifacts
|
||||||
|
- name: Download Windows Symbols
|
||||||
|
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Windows-symbols
|
||||||
|
- name: Extract viewer pdb
|
||||||
|
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -xJf "${{ needs.build.outputs.viewer_channel }}.sym.tar.xz" -C _artifacts
|
||||||
- name: Post Windows symbols
|
- name: Post Windows symbols
|
||||||
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
||||||
uses: secondlife/viewer-build-util/post-bugsplat-windows@v2
|
uses: secondlife-3p/symbol-upload@v10
|
||||||
with:
|
with:
|
||||||
username: ${{ env.BUGSPLAT_USER }}
|
username: ${{ env.BUGSPLAT_USER }}
|
||||||
password: ${{ env.BUGSPLAT_PASS }}
|
password: ${{ env.BUGSPLAT_PASS }}
|
||||||
database: "SecondLife_Viewer_2018"
|
database: "SecondLife_Viewer_2018"
|
||||||
channel: ${{ needs.build.outputs.viewer_channel }}
|
application: ${{ needs.build.outputs.viewer_channel }}
|
||||||
version: ${{ needs.build.outputs.viewer_version }}
|
version: ${{ needs.build.outputs.viewer_version }}
|
||||||
|
directory: _artifacts
|
||||||
|
files: "**/{SecondLifeViewer.exe,llwebrtc.dll,*.pdb}"
|
||||||
|
|
||||||
post-mac-symbols:
|
post-mac-symbols:
|
||||||
env:
|
env:
|
||||||
|
|
@ -387,15 +404,22 @@ jobs:
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Download Mac Symbols
|
||||||
|
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macOS-symbols
|
||||||
- name: Post Mac symbols
|
- name: Post Mac symbols
|
||||||
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
|
||||||
uses: secondlife/viewer-build-util/post-bugsplat-mac@v2
|
uses: secondlife-3p/symbol-upload@v10
|
||||||
with:
|
with:
|
||||||
username: ${{ env.BUGSPLAT_USER }}
|
username: ${{ env.BUGSPLAT_USER }}
|
||||||
password: ${{ env.BUGSPLAT_PASS }}
|
password: ${{ env.BUGSPLAT_PASS }}
|
||||||
database: "SecondLife_Viewer_2018"
|
database: "SecondLife_Viewer_2018"
|
||||||
channel: ${{ needs.build.outputs.viewer_channel }}
|
application: ${{ needs.build.outputs.viewer_channel }}
|
||||||
version: ${{ needs.build.outputs.viewer_version }} (${{ needs.build.outputs.viewer_version }})
|
version: ${{ needs.build.outputs.viewer_version }} (${{ needs.build.outputs.viewer_version }})
|
||||||
|
directory: .
|
||||||
|
files: "**/*.xcarchive.zip"
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs: [setvar, build, sign-and-package-windows, sign-and-package-mac]
|
needs: [setvar, build, sign-and-package-windows, sign-and-package-mac]
|
||||||
|
|
|
||||||
7
build.sh
7
build.sh
|
|
@ -170,7 +170,7 @@ pre_build()
|
||||||
# This name is consumed by indra/newview/CMakeLists.txt. Make it
|
# This name is consumed by indra/newview/CMakeLists.txt. Make it
|
||||||
# absolute because we've had troubles with relative pathnames.
|
# absolute because we've had troubles with relative pathnames.
|
||||||
abs_build_dir="$(cd "$build_dir"; pwd)"
|
abs_build_dir="$(cd "$build_dir"; pwd)"
|
||||||
VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.xz")"
|
VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/symbols/$variant/${viewer_channel}.sym.tar.xz")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# honor autobuild_configure_parameters same as sling-buildscripts
|
# honor autobuild_configure_parameters same as sling-buildscripts
|
||||||
|
|
@ -523,9 +523,8 @@ then
|
||||||
# nat 2016-12-22: without RELEASE_CRASH_REPORTING, we have no symbol file.
|
# nat 2016-12-22: without RELEASE_CRASH_REPORTING, we have no symbol file.
|
||||||
if [ "${RELEASE_CRASH_REPORTING:-}" != "OFF" ]
|
if [ "${RELEASE_CRASH_REPORTING:-}" != "OFF" ]
|
||||||
then
|
then
|
||||||
# BugSplat wants to see xcarchive.zip
|
# e.g. build-darwin-x86_64/symbols/Release/Second Life Test.xarchive.zip
|
||||||
# e.g. build-darwin-x86_64/newview/Release/Second Life Test.xcarchive.zip
|
symbol_file="${build_dir}/symbols/${variant}/${viewer_channel}.xcarchive.zip"
|
||||||
symbol_file="${build_dir}/newview/${variant}/${viewer_channel}.xcarchive.zip"
|
|
||||||
if [[ ! -f "$symbol_file" ]]
|
if [[ ! -f "$symbol_file" ]]
|
||||||
then
|
then
|
||||||
# symbol tarball we prep for (e.g.) Breakpad
|
# symbol tarball we prep for (e.g.) Breakpad
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ if (WINDOWS OR DARWIN )
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>)
|
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>)
|
||||||
|
set(SYMBOLS_STAGING_DIR ${CMAKE_BINARY_DIR}/symbols/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/${VIEWER_CHANNEL})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if( DARWIN )
|
if( DARWIN )
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ namespace LLError
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @NOTE: addRecorder() and removeRecorder() uses the boost::shared_ptr to allow for shared ownership
|
* @NOTE: addRecorder() and removeRecorder() uses the std::shared_ptr to allow for shared ownership
|
||||||
* while still ensuring that the allocated memory is eventually freed
|
* while still ensuring that the allocated memory is eventually freed
|
||||||
*/
|
*/
|
||||||
LL_COMMON_API void addRecorder(RecorderPtr);
|
LL_COMMON_API void addRecorder(RecorderPtr);
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@
|
||||||
#include "llsettingsdaycycle.h"
|
#include "llsettingsdaycycle.h"
|
||||||
#include "llerror.h"
|
#include "llerror.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
#include "lltrace.h"
|
#include "lltrace.h"
|
||||||
#include "llfasttimer.h"
|
#include "llfasttimer.h"
|
||||||
#include "v3colorutil.h"
|
#include "v3colorutil.h"
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
#include "llsettingswater.h"
|
#include "llsettingswater.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
#include "lltrace.h"
|
#include "lltrace.h"
|
||||||
#include "llfasttimer.h"
|
#include "llfasttimer.h"
|
||||||
#include "v3colorutil.h"
|
#include "v3colorutil.h"
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,11 @@ add_library (llwebrtc SHARED ${llwebrtc_SOURCE_FILES})
|
||||||
set_target_properties(llwebrtc PROPERTIES PUBLIC_HEADER llwebrtc.h)
|
set_target_properties(llwebrtc PROPERTIES PUBLIC_HEADER llwebrtc.h)
|
||||||
|
|
||||||
if (WINDOWS)
|
if (WINDOWS)
|
||||||
target_link_libraries(llwebrtc PRIVATE ll::webrtc
|
set_target_properties(llwebrtc
|
||||||
|
PROPERTIES
|
||||||
|
LINK_FLAGS "/debug /LARGEADDRESSAWARE"
|
||||||
|
)
|
||||||
|
target_link_libraries(llwebrtc PRIVATE ll::webrtc
|
||||||
secur32
|
secur32
|
||||||
winmm
|
winmm
|
||||||
dmoguids
|
dmoguids
|
||||||
|
|
@ -38,8 +42,15 @@ if (WINDOWS)
|
||||||
msdmo
|
msdmo
|
||||||
strmiids
|
strmiids
|
||||||
iphlpapi)
|
iphlpapi)
|
||||||
|
if (USE_BUGSPLAT)
|
||||||
|
set_target_properties(llwebrtc PROPERTIES PDB_OUTPUT_DIRECTORY "${SYMBOLS_STAGING_DIR}")
|
||||||
|
endif (USE_BUGSPLAT)
|
||||||
elseif (DARWIN)
|
elseif (DARWIN)
|
||||||
target_link_libraries(llwebrtc PRIVATE ll::webrtc)
|
target_link_libraries(llwebrtc PRIVATE ll::webrtc)
|
||||||
|
if (USE_BUGSPLAT)
|
||||||
|
set_target_properties(llwebrtc PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
|
||||||
|
XCODE_ATTRIBUTE_DWARF_DSYM_FOLDER_PATH "${SYMBOLS_STAGING_DIR}/dSYMs")
|
||||||
|
endif (USE_BUGSPLAT)
|
||||||
elseif (LINUX)
|
elseif (LINUX)
|
||||||
target_compile_options(llwebrtc PRIVATE "-Wno-deprecated-declarations")
|
target_compile_options(llwebrtc PRIVATE "-Wno-deprecated-declarations")
|
||||||
target_link_libraries(llwebrtc PRIVATE ll::webrtc)
|
target_link_libraries(llwebrtc PRIVATE ll::webrtc)
|
||||||
|
|
|
||||||
|
|
@ -2659,37 +2659,29 @@ if (INSTALL)
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)
|
||||||
endif (INSTALL)
|
endif (INSTALL)
|
||||||
|
|
||||||
# Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh
|
|
||||||
if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE)
|
if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE)
|
||||||
if (USE_BUGSPLAT)
|
if (USE_BUGSPLAT)
|
||||||
# BugSplat symbol-file generation
|
# BugSplat symbol-file generation
|
||||||
if (WINDOWS)
|
if (WINDOWS)
|
||||||
#<FS:ND> Comment this out, we do our own symbol package which also includes the exe and build_data.json
|
#<FS:ND> Comment this out, we do our own symbol package which also includes the exe and build_data.json
|
||||||
# Just pack up a tarball containing only the .pdb file for the
|
# set(VIEWER_APP_SYMBOLS_ARCHIVE "${SYMBOLS_STAGING_DIR}.sym.tar.xz")
|
||||||
# executable. Because we intend to use cygwin tar, we must render
|
# set_target_properties( ${VIEWER_BINARY_NAME} PROPERTIES PDB_OUTPUT_DIRECTORY "${SYMBOLS_STAGING_DIR}")
|
||||||
# VIEWER_SYMBOL_FILE in cygwin path syntax.
|
|
||||||
# execute_process(COMMAND "cygpath" "-u" "${VIEWER_SYMBOL_FILE}"
|
# # Just pack up a tarball containing only the .pdb files for the
|
||||||
# OUTPUT_VARIABLE VIEWER_SYMBOL_FILE_CYGWIN
|
# # executables.
|
||||||
# OUTPUT_STRIP_TRAILING_WHITESPACE)
|
# add_custom_command(OUTPUT "${VIEWER_APP_SYMBOLS_ARCHIVE}"
|
||||||
# execute_process(COMMAND "cygpath" "-u" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
|
|
||||||
# OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN
|
|
||||||
# OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
# add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"
|
|
||||||
# # Use of 'tar ...J' here assumes VIEWER_SYMBOL_FILE endswith .tar.xz;
|
|
||||||
# # testing a string suffix is painful enough in CMake language that
|
|
||||||
# # we'll continue assuming it until forced to generalize.
|
|
||||||
# COMMAND "tar"
|
# COMMAND "tar"
|
||||||
# ARGS
|
# ARGS
|
||||||
# "cjf"
|
# "cJf"
|
||||||
# "${VIEWER_SYMBOL_FILE_CYGWIN}"
|
# "${VIEWER_CHANNEL}.sym.tar.xz"
|
||||||
# "-C"
|
# "${VIEWER_CHANNEL}"
|
||||||
# "${PARENT_DIRECTORY_CYGWIN}"
|
# DEPENDS "${VIEWER_BINARY_NAME}" llwebrtc
|
||||||
# "firestorm-bin.pdb"
|
# WORKING_DIRECTORY "${SYMBOLS_STAGING_DIR}/.."
|
||||||
# DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/firestorm-bin.pdb"
|
# COMMENT "Packing viewer PDBs into ${VIEWER_APP_SYMBOLS_ARCHIVE}"
|
||||||
# COMMENT "Packing viewer PDB into ${VIEWER_SYMBOL_FILE_CYGWIN}"
|
|
||||||
# )
|
# )
|
||||||
# add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME})
|
# add_custom_target(generate_symbols DEPENDS "${VIEWER_APP_SYMBOLS_ARCHIVE}")
|
||||||
# add_dependencies(generate_symbols ${VIEWER_BINARY_NAME})
|
# add_dependencies(generate_symbols ${VIEWER_BINARY_NAME} llwebrtc)
|
||||||
|
|
||||||
endif (WINDOWS)
|
endif (WINDOWS)
|
||||||
if (DARWIN)
|
if (DARWIN)
|
||||||
# Have to run dsymutil first, then pack up the resulting .dSYM directory
|
# Have to run dsymutil first, then pack up the resulting .dSYM directory
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,6 @@
|
||||||
|
|
||||||
#include "llregioninfomodel.h"
|
#include "llregioninfomodel.h"
|
||||||
|
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
|
|
||||||
#include "llatmosphere.h"
|
#include "llatmosphere.h"
|
||||||
#include "llagent.h"
|
#include "llagent.h"
|
||||||
#include "roles_constants.h"
|
#include "roles_constants.h"
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,6 @@
|
||||||
#include "llcorehttputil.h"
|
#include "llcorehttputil.h"
|
||||||
#include "lleventfilter.h"
|
#include "lleventfilter.h"
|
||||||
|
|
||||||
#include "boost/make_shared.hpp"
|
|
||||||
|
|
||||||
#include "llsdutil.h" // <FS:ND/> for ll_pretty_print_sd
|
#include "llsdutil.h" // <FS:ND/> for ll_pretty_print_sd
|
||||||
#include "llviewernetwork.h"
|
#include "llviewernetwork.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,6 @@
|
||||||
|
|
||||||
#include "llfloatereditenvironmentbase.h"
|
#include "llfloatereditenvironmentbase.h"
|
||||||
|
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
#include "llnotifications.h"
|
#include "llnotifications.h"
|
||||||
#include "llnotificationsutil.h"
|
#include "llnotificationsutil.h"
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,6 @@
|
||||||
|
|
||||||
#include "llfloaterfixedenvironment.h"
|
#include "llfloaterfixedenvironment.h"
|
||||||
|
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
#include "llbutton.h"
|
#include "llbutton.h"
|
||||||
#include "llnotifications.h"
|
#include "llnotifications.h"
|
||||||
|
|
|
||||||
|
|
@ -131,29 +131,31 @@ void LLOutputMonitorCtrl::draw()
|
||||||
//const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
|
//const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
|
||||||
// </FS:Ansariel> Centralized voice power level
|
// </FS:Ansariel> Centralized voice power level
|
||||||
|
|
||||||
|
LLVoiceClient* vocie_client = LLVoiceClient::getInstance();
|
||||||
|
|
||||||
if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull())
|
if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull())
|
||||||
{
|
{
|
||||||
setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId));
|
setPower(vocie_client->getCurrentPower(mSpeakerId));
|
||||||
if(mIsAgentControl)
|
if(mIsAgentControl)
|
||||||
{
|
{
|
||||||
setIsTalking(LLVoiceClient::getInstance()->getUserPTTState());
|
setIsTalking(vocie_client->getUserPTTState());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setIsTalking(LLVoiceClient::getInstance()->getIsSpeaking(mSpeakerId));
|
setIsTalking(vocie_client->getIsSpeaking(mSpeakerId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mPower == 0.f && !mIsTalking) && mShowParticipantsSpeaking)
|
if ((mPower == 0.f && !mIsTalking) && mShowParticipantsSpeaking)
|
||||||
{
|
{
|
||||||
std::set<LLUUID> participant_uuids;
|
std::set<LLUUID> participant_uuids;
|
||||||
LLVoiceClient::instance().getParticipantList(participant_uuids);
|
vocie_client->getParticipantList(participant_uuids);
|
||||||
std::set<LLUUID>::const_iterator part_it = participant_uuids.begin();
|
std::set<LLUUID>::const_iterator part_it = participant_uuids.begin();
|
||||||
|
|
||||||
F32 power = 0;
|
F32 power = 0;
|
||||||
for (; part_it != participant_uuids.end(); ++part_it)
|
for (; part_it != participant_uuids.end(); ++part_it)
|
||||||
{
|
{
|
||||||
power = LLVoiceClient::instance().getCurrentPower(*part_it);
|
power = vocie_client->getCurrentPower(*part_it);
|
||||||
if (power)
|
if (power)
|
||||||
{
|
{
|
||||||
mPower = power;
|
mPower = power;
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,6 @@
|
||||||
#include "llvovolume.h"
|
#include "llvovolume.h"
|
||||||
#include "lldrawable.h"
|
#include "lldrawable.h"
|
||||||
#include "llvoavatar.h"
|
#include "llvoavatar.h"
|
||||||
//boost
|
|
||||||
#include "boost/make_shared.hpp"
|
|
||||||
|
|
||||||
//...........
|
//...........
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <boost/iterator/filter_iterator.hpp>
|
#include <boost/iterator/filter_iterator.hpp>
|
||||||
#include <boost/signals2.hpp>
|
#include <boost/signals2.hpp>
|
||||||
#include <boost/make_shared.hpp> // boost::make_shared
|
|
||||||
|
|
||||||
class LLMessageSystem;
|
class LLMessageSystem;
|
||||||
class LLViewerTexture;
|
class LLViewerTexture;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <boost/make_shared.hpp>
|
|
||||||
#include "lltrace.h"
|
#include "lltrace.h"
|
||||||
#include "llfasttimer.h"
|
#include "llfasttimer.h"
|
||||||
#include "v3colorutil.h"
|
#include "v3colorutil.h"
|
||||||
|
|
|
||||||
|
|
@ -383,16 +383,17 @@ void LLSpeakerMgr::update(bool resort_ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
// update status of all current speakers
|
// update status of all current speakers
|
||||||
bool voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
|
LLVoiceClient* voice_client = LLVoiceClient::getInstance();
|
||||||
|
bool voice_channel_active = (!mVoiceChannel && voice_client->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
|
||||||
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); speaker_it++)
|
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); speaker_it++)
|
||||||
{
|
{
|
||||||
LLUUID speaker_id = speaker_it->first;
|
LLUUID speaker_id = speaker_it->first;
|
||||||
LLSpeaker* speakerp = speaker_it->second;
|
LLSpeaker* speakerp = speaker_it->second;
|
||||||
|
|
||||||
if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))
|
if (voice_channel_active && voice_client->getVoiceEnabled(speaker_id))
|
||||||
{
|
{
|
||||||
speakerp->mSpeechVolume = LLVoiceClient::getInstance()->getCurrentPower(speaker_id);
|
speakerp->mSpeechVolume = voice_client->getCurrentPower(speaker_id);
|
||||||
bool moderator_muted_voice = LLVoiceClient::getInstance()->getIsModeratorMuted(speaker_id);
|
bool moderator_muted_voice = voice_client->getIsModeratorMuted(speaker_id);
|
||||||
if (moderator_muted_voice != speakerp->mModeratorMutedVoice)
|
if (moderator_muted_voice != speakerp->mModeratorMutedVoice)
|
||||||
{
|
{
|
||||||
speakerp->mModeratorMutedVoice = moderator_muted_voice;
|
speakerp->mModeratorMutedVoice = moderator_muted_voice;
|
||||||
|
|
@ -400,11 +401,11 @@ void LLSpeakerMgr::update(bool resort_ok)
|
||||||
speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));
|
speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LLVoiceClient::getInstance()->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
|
if (voice_client->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
|
||||||
{
|
{
|
||||||
speakerp->mStatus = LLSpeaker::STATUS_MUTED;
|
speakerp->mStatus = LLSpeaker::STATUS_MUTED;
|
||||||
}
|
}
|
||||||
else if (LLVoiceClient::getInstance()->getIsSpeaking(speaker_id))
|
else if (voice_client->getIsSpeaking(speaker_id))
|
||||||
{
|
{
|
||||||
// reset inactivity expiration
|
// reset inactivity expiration
|
||||||
if (speakerp->mStatus != LLSpeaker::STATUS_SPEAKING)
|
if (speakerp->mStatus != LLSpeaker::STATUS_SPEAKING)
|
||||||
|
|
@ -487,17 +488,18 @@ void LLSpeakerMgr::update(bool resort_ok)
|
||||||
void LLSpeakerMgr::updateSpeakerList()
|
void LLSpeakerMgr::updateSpeakerList()
|
||||||
{
|
{
|
||||||
// Are we bound to the currently active voice channel?
|
// Are we bound to the currently active voice channel?
|
||||||
if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
|
LLVoiceClient* vocie_client = LLVoiceClient::getInstance();
|
||||||
|
if ((!mVoiceChannel && vocie_client->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
|
||||||
{
|
{
|
||||||
std::set<LLUUID> participants;
|
std::set<LLUUID> participants;
|
||||||
LLVoiceClient::getInstance()->getParticipantList(participants);
|
vocie_client->getParticipantList(participants);
|
||||||
// If we are, add all voice client participants to our list of known speakers
|
// If we are, add all voice client participants to our list of known speakers
|
||||||
for (std::set<LLUUID>::iterator participant_it = participants.begin(); participant_it != participants.end(); ++participant_it)
|
for (std::set<LLUUID>::iterator participant_it = participants.begin(); participant_it != participants.end(); ++participant_it)
|
||||||
{
|
{
|
||||||
setSpeaker(*participant_it,
|
setSpeaker(*participant_it,
|
||||||
LLVoiceClient::getInstance()->getDisplayName(*participant_it),
|
vocie_client->getDisplayName(*participant_it),
|
||||||
LLSpeaker::STATUS_VOICE_ACTIVE,
|
LLSpeaker::STATUS_VOICE_ACTIVE,
|
||||||
(LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
|
(vocie_client->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mVoiceChannel)
|
else if (mVoiceChannel)
|
||||||
|
|
|
||||||
|
|
@ -187,13 +187,13 @@ void LLVoiceChannel::handleError(EStatusType type)
|
||||||
setState(STATE_ERROR);
|
setState(STATE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLVoiceChannel::isActive()
|
bool LLVoiceChannel::isActive() const
|
||||||
{
|
{
|
||||||
// only considered active when currently bound channel matches what our channel
|
// only considered active when currently bound channel matches what our channel
|
||||||
return callStarted() && LLVoiceClient::getInstance()->isCurrentChannel(mChannelInfo);
|
return callStarted() && LLVoiceClient::getInstance()->isCurrentChannel(mChannelInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLVoiceChannel::callStarted()
|
bool LLVoiceChannel::callStarted() const
|
||||||
{
|
{
|
||||||
return mState >= STATE_CALL_STARTED;
|
return mState >= STATE_CALL_STARTED;
|
||||||
}
|
}
|
||||||
|
|
@ -662,7 +662,7 @@ LLVoiceChannelProximal::LLVoiceChannelProximal() :
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLVoiceChannelProximal::isActive()
|
bool LLVoiceChannelProximal::isActive() const
|
||||||
{
|
{
|
||||||
return callStarted() && LLVoiceClient::getInstance()->inProximalChannel();
|
return callStarted() && LLVoiceClient::getInstance()->inProximalChannel();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,8 @@ public:
|
||||||
virtual void activate();
|
virtual void activate();
|
||||||
virtual void setChannelInfo(const LLSD &channelInfo);
|
virtual void setChannelInfo(const LLSD &channelInfo);
|
||||||
virtual void requestChannelInfo();
|
virtual void requestChannelInfo();
|
||||||
virtual bool isActive();
|
virtual bool isActive() const;
|
||||||
virtual bool callStarted();
|
virtual bool callStarted() const;
|
||||||
|
|
||||||
// Session name is a UI label used for feedback about which person,
|
// Session name is a UI label used for feedback about which person,
|
||||||
// group, or phone number you are talking to
|
// group, or phone number you are talking to
|
||||||
|
|
@ -170,7 +170,7 @@ class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton<LLVoice
|
||||||
void onChange(EStatusType status, const LLSD &channelInfo, bool proximal) override;
|
void onChange(EStatusType status, const LLSD &channelInfo, bool proximal) override;
|
||||||
void handleStatusChange(EStatusType status) override;
|
void handleStatusChange(EStatusType status) override;
|
||||||
void handleError(EStatusType status) override;
|
void handleError(EStatusType status) override;
|
||||||
bool isActive() override;
|
bool isActive() const override;
|
||||||
void activate() override;
|
void activate() override;
|
||||||
void deactivate() override;
|
void deactivate() override;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -289,15 +289,13 @@ void LLVoiceClient::setNonSpatialVoiceModule(const std::string &voice_server_typ
|
||||||
|
|
||||||
void LLVoiceClient::setHidden(bool hidden)
|
void LLVoiceClient::setHidden(bool hidden)
|
||||||
{
|
{
|
||||||
if (mSpatialVoiceModule)
|
#ifdef OPENSIM
|
||||||
{
|
LLWebRTCVoiceClient::getInstance()->setHidden(hidden && LLGridManager::getInstance()->isInSecondLife());
|
||||||
//mSpatialVoiceModule->setHidden(hidden);
|
LLVivoxVoiceClient::getInstance()->setHidden(hidden && LLGridManager::getInstance()->isInSecondLife());
|
||||||
#ifdef OPENSIM
|
#else
|
||||||
mSpatialVoiceModule->setHidden(hidden && LLGridManager::getInstance()->isInSecondLife());
|
LLWebRTCVoiceClient::getInstance()->setHidden(hidden);
|
||||||
#else
|
LLVivoxVoiceClient::getInstance()->setHidden(hidden);
|
||||||
mSpatialVoiceModule->setHidden(hidden);
|
#endif
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVoiceClient::terminate()
|
void LLVoiceClient::terminate()
|
||||||
|
|
@ -421,13 +419,13 @@ const LLVoiceDeviceList& LLVoiceClient::getRenderDevices()
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// participants
|
// participants
|
||||||
|
|
||||||
void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants)
|
void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const
|
||||||
{
|
{
|
||||||
LLWebRTCVoiceClient::getInstance()->getParticipantList(participants);
|
LLWebRTCVoiceClient::getInstance()->getParticipantList(participants);
|
||||||
LLVivoxVoiceClient::getInstance()->getParticipantList(participants);
|
LLVivoxVoiceClient::getInstance()->getParticipantList(participants);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLVoiceClient::isParticipant(const LLUUID &speaker_id)
|
bool LLVoiceClient::isParticipant(const LLUUID &speaker_id) const
|
||||||
{
|
{
|
||||||
return LLWebRTCVoiceClient::getInstance()->isParticipant(speaker_id) ||
|
return LLWebRTCVoiceClient::getInstance()->isParticipant(speaker_id) ||
|
||||||
LLVivoxVoiceClient::getInstance()->isParticipant(speaker_id);
|
LLVivoxVoiceClient::getInstance()->isParticipant(speaker_id);
|
||||||
|
|
@ -741,12 +739,12 @@ void LLVoiceClient::toggleUserPTTState(void)
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// nearby speaker accessors
|
// nearby speaker accessors
|
||||||
|
|
||||||
bool LLVoiceClient::getVoiceEnabled(const LLUUID& id)
|
bool LLVoiceClient::getVoiceEnabled(const LLUUID& id) const
|
||||||
{
|
{
|
||||||
return isParticipant(id);
|
return isParticipant(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LLVoiceClient::getDisplayName(const LLUUID& id)
|
std::string LLVoiceClient::getDisplayName(const LLUUID& id) const
|
||||||
{
|
{
|
||||||
std::string result = LLWebRTCVoiceClient::getInstance()->getDisplayName(id);
|
std::string result = LLWebRTCVoiceClient::getInstance()->getDisplayName(id);
|
||||||
if (result.empty())
|
if (result.empty())
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ class LLVoiceP2PIncomingCallInterface
|
||||||
virtual void declineInvite() = 0;
|
virtual void declineInvite() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::shared_ptr<LLVoiceP2PIncomingCallInterface> LLVoiceP2PIncomingCallInterfacePtr;
|
typedef std::shared_ptr<LLVoiceP2PIncomingCallInterface> LLVoiceP2PIncomingCallInterfacePtr;
|
||||||
|
|
||||||
//////////////////////////////////
|
//////////////////////////////////
|
||||||
/// @class LLVoiceModuleInterface
|
/// @class LLVoiceModuleInterface
|
||||||
|
|
@ -479,8 +479,8 @@ public:
|
||||||
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
// Accessors for data related to nearby speakers
|
// Accessors for data related to nearby speakers
|
||||||
bool getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
|
bool getVoiceEnabled(const LLUUID& id) const; // true if we've received data for this avatar
|
||||||
std::string getDisplayName(const LLUUID& id);
|
std::string getDisplayName(const LLUUID& id) const;
|
||||||
bool isOnlineSIP(const LLUUID &id);
|
bool isOnlineSIP(const LLUUID &id);
|
||||||
bool isParticipantAvatar(const LLUUID &id);
|
bool isParticipantAvatar(const LLUUID &id);
|
||||||
bool getIsSpeaking(const LLUUID& id);
|
bool getIsSpeaking(const LLUUID& id);
|
||||||
|
|
@ -494,8 +494,8 @@ public:
|
||||||
// </FS:Ansariel> Centralized voice power level
|
// </FS:Ansariel> Centralized voice power level
|
||||||
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
void getParticipantList(std::set<LLUUID> &participants);
|
void getParticipantList(std::set<LLUUID> &participants) const;
|
||||||
bool isParticipant(const LLUUID& speaker_id);
|
bool isParticipant(const LLUUID& speaker_id) const;
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
/// @name text chat
|
/// @name text chat
|
||||||
|
|
|
||||||
|
|
@ -2252,7 +2252,6 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
||||||
|
|
||||||
mIsInChannel = true;
|
mIsInChannel = true;
|
||||||
mMuteMicDirty = true;
|
mMuteMicDirty = true;
|
||||||
mSessionTerminateRequested = false;
|
|
||||||
|
|
||||||
while (!sShuttingDown
|
while (!sShuttingDown
|
||||||
&& mVoiceEnabled
|
&& mVoiceEnabled
|
||||||
|
|
@ -5117,7 +5116,7 @@ void LLVivoxVoiceClient::hangup() { leaveChannel(); }
|
||||||
|
|
||||||
LLVoiceP2PIncomingCallInterfacePtr LLVivoxVoiceClient::getIncomingCallInterface(const LLSD &voice_call_info)
|
LLVoiceP2PIncomingCallInterfacePtr LLVivoxVoiceClient::getIncomingCallInterface(const LLSD &voice_call_info)
|
||||||
{
|
{
|
||||||
return boost::make_shared<LLVivoxVoiceP2PIncomingCall>(voice_call_info);
|
return std::make_shared<LLVivoxVoiceP2PIncomingCall>(voice_call_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLVivoxVoiceClient::answerInvite(const std::string &sessionHandle)
|
bool LLVivoxVoiceClient::answerInvite(const std::string &sessionHandle)
|
||||||
|
|
@ -5241,7 +5240,9 @@ void LLVivoxVoiceClient::processChannels(bool process)
|
||||||
|
|
||||||
bool LLVivoxVoiceClient::isCurrentChannel(const LLSD &channelInfo)
|
bool LLVivoxVoiceClient::isCurrentChannel(const LLSD &channelInfo)
|
||||||
{
|
{
|
||||||
if (!mProcessChannels || (channelInfo.has("voice_server_type") && channelInfo["voice_server_type"].asString() != VIVOX_VOICE_SERVER_TYPE))
|
if (!mProcessChannels
|
||||||
|
|| (channelInfo.has("voice_server_type") && channelInfo["voice_server_type"].asString() != VIVOX_VOICE_SERVER_TYPE)
|
||||||
|
|| mSessionTerminateRequested)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -5578,8 +5579,8 @@ void LLVivoxVoiceClient::leaveChannel(void)
|
||||||
{
|
{
|
||||||
LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL;
|
LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL;
|
||||||
mChannelName.clear();
|
mChannelName.clear();
|
||||||
sessionTerminate();
|
|
||||||
}
|
}
|
||||||
|
sessionTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVivoxVoiceClient::setMuteMic(bool muted)
|
void LLVivoxVoiceClient::setMuteMic(bool muted)
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,8 @@ public:
|
||||||
// Returns true if vivox has successfully logged in and is not in error state
|
// Returns true if vivox has successfully logged in and is not in error state
|
||||||
bool isVoiceWorking() const override;
|
bool isVoiceWorking() const override;
|
||||||
|
|
||||||
|
void setHidden(bool hidden) override; // virtual
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
/// @name Tuning
|
/// @name Tuning
|
||||||
//@{
|
//@{
|
||||||
|
|
@ -760,7 +762,6 @@ private:
|
||||||
LLSD getAudioSessionChannelInfo();
|
LLSD getAudioSessionChannelInfo();
|
||||||
std::string getAudioSessionHandle();
|
std::string getAudioSessionHandle();
|
||||||
|
|
||||||
void setHidden(bool hidden) override; //virtual
|
|
||||||
void sendPositionAndVolumeUpdate(void);
|
void sendPositionAndVolumeUpdate(void);
|
||||||
|
|
||||||
void sendCaptureAndRenderDevices();
|
void sendCaptureAndRenderDevices();
|
||||||
|
|
|
||||||
|
|
@ -457,6 +457,7 @@ void LLWebRTCVoiceClient::voiceConnectionCoro()
|
||||||
// Could help with voice updates making for smoother
|
// Could help with voice updates making for smoother
|
||||||
// voice when we're busy.
|
// voice when we're busy.
|
||||||
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
|
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
|
||||||
|
if (sShuttingDown) return; // 'this' migh already be invalid
|
||||||
bool voiceEnabled = mVoiceEnabled;
|
bool voiceEnabled = mVoiceEnabled;
|
||||||
|
|
||||||
if (!isAgentAvatarValid())
|
if (!isAgentAvatarValid())
|
||||||
|
|
@ -1253,7 +1254,7 @@ void LLWebRTCVoiceClient::sessionState::removeParticipant(const LLWebRTCVoiceCli
|
||||||
LLWebRTCVoiceClient::getInstance()->notifyParticipantObservers();
|
LLWebRTCVoiceClient::getInstance()->notifyParticipantObservers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mHangupOnLastLeave && (participantID != gAgentID) && (mParticipantsByUUID.size() <= 1))
|
if (mHangupOnLastLeave && (participantID != gAgentID) && (mParticipantsByUUID.size() <= 1) && LLWebRTCVoiceClient::instanceExists())
|
||||||
{
|
{
|
||||||
LLWebRTCVoiceClient::getInstance()->notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
|
LLWebRTCVoiceClient::getInstance()->notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
@ -1964,8 +1965,8 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates()
|
||||||
|
|
||||||
for (auto &connection : mWebRTCConnections)
|
for (auto &connection : mWebRTCConnections)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<LLVoiceWebRTCSpatialConnection> spatialConnection =
|
std::shared_ptr<LLVoiceWebRTCSpatialConnection> spatialConnection =
|
||||||
boost::static_pointer_cast<LLVoiceWebRTCSpatialConnection>(connection);
|
std::static_pointer_cast<LLVoiceWebRTCSpatialConnection>(connection);
|
||||||
|
|
||||||
LLUUID regionID = spatialConnection.get()->getRegionID();
|
LLUUID regionID = spatialConnection.get()->getRegionID();
|
||||||
|
|
||||||
|
|
@ -2187,47 +2188,47 @@ void LLVoiceWebRTCConnection::processIceUpdates()
|
||||||
{
|
{
|
||||||
mOutstandingRequests++;
|
mOutstandingRequests++;
|
||||||
LLCoros::getInstance()->launch("LLVoiceWebRTCConnection::processIceUpdatesCoro",
|
LLCoros::getInstance()->launch("LLVoiceWebRTCConnection::processIceUpdatesCoro",
|
||||||
boost::bind(&LLVoiceWebRTCConnection::processIceUpdatesCoro, this));
|
boost::bind(&LLVoiceWebRTCConnection::processIceUpdatesCoro, this->shared_from_this()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ice candidates may be streamed in before or after the SDP offer is available (see below)
|
// Ice candidates may be streamed in before or after the SDP offer is available (see below)
|
||||||
// This function determines whether candidates are available to send to the Secondlife WebRTC
|
// This function determines whether candidates are available to send to the Secondlife WebRTC
|
||||||
// server via the simulator. If so, and there are no more candidates, this code
|
// server via the simulator. If so, and there are no more candidates, this code
|
||||||
// will make the cap call to the server sending up the ICE candidates.
|
// will make the cap call to the server sending up the ICE candidates.
|
||||||
void LLVoiceWebRTCConnection::processIceUpdatesCoro()
|
void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
|
||||||
{
|
{
|
||||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||||
|
|
||||||
if (mShutDown || LLWebRTCVoiceClient::isShuttingDown())
|
if (connection->mShutDown || LLWebRTCVoiceClient::isShuttingDown())
|
||||||
{
|
{
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool iceCompleted = false;
|
bool iceCompleted = false;
|
||||||
LLSD body;
|
LLSD body;
|
||||||
if (!mIceCandidates.empty() || mIceCompleted)
|
if (!connection->mIceCandidates.empty() || connection->mIceCompleted)
|
||||||
{
|
{
|
||||||
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
|
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(connection->mRegionID);
|
||||||
if (!regionp || !regionp->capabilitiesReceived())
|
if (!regionp || !regionp->capabilitiesReceived())
|
||||||
{
|
{
|
||||||
LL_DEBUGS("Voice") << "no capabilities for ice gathering; waiting " << LL_ENDL;
|
LL_DEBUGS("Voice") << "no capabilities for ice gathering; waiting " << LL_ENDL;
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string url = regionp->getCapability("VoiceSignalingRequest");
|
std::string url = regionp->getCapability("VoiceSignalingRequest");
|
||||||
if (url.empty())
|
if (url.empty())
|
||||||
{
|
{
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LL_DEBUGS("Voice") << "region ready to complete voice signaling; url=" << url << LL_ENDL;
|
LL_DEBUGS("Voice") << "region ready to complete voice signaling; url=" << url << LL_ENDL;
|
||||||
if (!mIceCandidates.empty())
|
if (!connection->mIceCandidates.empty())
|
||||||
{
|
{
|
||||||
LLSD candidates = LLSD::emptyArray();
|
LLSD candidates = LLSD::emptyArray();
|
||||||
for (auto &ice_candidate : mIceCandidates)
|
for (auto &ice_candidate : connection->mIceCandidates)
|
||||||
{
|
{
|
||||||
LLSD body_candidate;
|
LLSD body_candidate;
|
||||||
body_candidate["sdpMid"] = ice_candidate.mSdpMid;
|
body_candidate["sdpMid"] = ice_candidate.mSdpMid;
|
||||||
|
|
@ -2236,18 +2237,18 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro()
|
||||||
candidates.append(body_candidate);
|
candidates.append(body_candidate);
|
||||||
}
|
}
|
||||||
body["candidates"] = candidates;
|
body["candidates"] = candidates;
|
||||||
mIceCandidates.clear();
|
connection->mIceCandidates.clear();
|
||||||
}
|
}
|
||||||
else if (mIceCompleted)
|
else if (connection->mIceCompleted)
|
||||||
{
|
{
|
||||||
LLSD body_candidate;
|
LLSD body_candidate;
|
||||||
body_candidate["completed"] = true;
|
body_candidate["completed"] = true;
|
||||||
body["candidate"] = body_candidate;
|
body["candidate"] = body_candidate;
|
||||||
iceCompleted = mIceCompleted;
|
iceCompleted = connection->mIceCompleted;
|
||||||
mIceCompleted = false;
|
connection->mIceCompleted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
body["viewer_session"] = mViewerSession;
|
body["viewer_session"] = connection->mViewerSession;
|
||||||
body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE;
|
body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE;
|
||||||
|
|
||||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
||||||
|
|
@ -2262,7 +2263,7 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro()
|
||||||
|
|
||||||
if (LLWebRTCVoiceClient::isShuttingDown())
|
if (LLWebRTCVoiceClient::isShuttingDown())
|
||||||
{
|
{
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2272,10 +2273,10 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro()
|
||||||
if (!status)
|
if (!status)
|
||||||
{
|
{
|
||||||
// couldn't trickle the candidates, so restart the session.
|
// couldn't trickle the candidates, so restart the session.
|
||||||
setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
connection->setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2423,31 +2424,31 @@ void LLVoiceWebRTCConnection::sendData(const std::string &data)
|
||||||
|
|
||||||
// Tell the simulator that we're shutting down a voice connection.
|
// Tell the simulator that we're shutting down a voice connection.
|
||||||
// The simulator will pass this on to the Secondlife WebRTC server.
|
// The simulator will pass this on to the Secondlife WebRTC server.
|
||||||
void LLVoiceWebRTCConnection::breakVoiceConnectionCoro()
|
void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connection)
|
||||||
{
|
{
|
||||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||||
|
|
||||||
LL_DEBUGS("Voice") << "Disconnecting voice." << LL_ENDL;
|
LL_DEBUGS("Voice") << "Disconnecting voice." << LL_ENDL;
|
||||||
if (mWebRTCDataInterface)
|
if (connection->mWebRTCDataInterface)
|
||||||
{
|
{
|
||||||
mWebRTCDataInterface->unsetDataObserver(this);
|
connection->mWebRTCDataInterface->unsetDataObserver(connection.get());
|
||||||
mWebRTCDataInterface = nullptr;
|
connection->mWebRTCDataInterface = nullptr;
|
||||||
}
|
}
|
||||||
mWebRTCAudioInterface = nullptr;
|
connection->mWebRTCAudioInterface = nullptr;
|
||||||
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);
|
LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(connection->mRegionID);
|
||||||
if (!regionp || !regionp->capabilitiesReceived())
|
if (!regionp || !regionp->capabilitiesReceived())
|
||||||
{
|
{
|
||||||
LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
|
LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
|
||||||
setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
connection->setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string url = regionp->getCapability("ProvisionVoiceAccountRequest");
|
std::string url = regionp->getCapability("ProvisionVoiceAccountRequest");
|
||||||
if (url.empty())
|
if (url.empty())
|
||||||
{
|
{
|
||||||
setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
connection->setVoiceConnectionState(VOICE_STATE_SESSION_RETRY);
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2456,7 +2457,7 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro()
|
||||||
LLVoiceWebRTCStats::getInstance()->provisionAttemptStart();
|
LLVoiceWebRTCStats::getInstance()->provisionAttemptStart();
|
||||||
LLSD body;
|
LLSD body;
|
||||||
body["logout"] = true;
|
body["logout"] = true;
|
||||||
body["viewer_session"] = mViewerSession;
|
body["viewer_session"] = connection->mViewerSession;
|
||||||
body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE;
|
body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE;
|
||||||
|
|
||||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
||||||
|
|
@ -2467,16 +2468,16 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro()
|
||||||
|
|
||||||
httpOpts->setWantHeaders(true);
|
httpOpts->setWantHeaders(true);
|
||||||
|
|
||||||
mOutstandingRequests++;
|
connection->mOutstandingRequests++;
|
||||||
|
|
||||||
// tell the server to shut down the connection as a courtesy.
|
// tell the server to shut down the connection as a courtesy.
|
||||||
// shutdownConnection will drop the WebRTC connection which will
|
// shutdownConnection will drop the WebRTC connection which will
|
||||||
// also shut things down.
|
// also shut things down.
|
||||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts);
|
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts);
|
||||||
|
|
||||||
mOutstandingRequests--;
|
connection->mOutstandingRequests--;
|
||||||
setVoiceConnectionState(VOICE_STATE_SESSION_EXIT);
|
connection->setVoiceConnectionState(VOICE_STATE_SESSION_EXIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the simulator to tell the Secondlife WebRTC server that we want a voice
|
// Tell the simulator to tell the Secondlife WebRTC server that we want a voice
|
||||||
// connection. The SDP is sent up as part of this, and the simulator will respond
|
// connection. The SDP is sent up as part of this, and the simulator will respond
|
||||||
|
|
@ -2659,7 +2660,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
||||||
// VOICE_STATE_SESSION_ESTABLISHED via a callback on a webrtc thread.
|
// VOICE_STATE_SESSION_ESTABLISHED via a callback on a webrtc thread.
|
||||||
setVoiceConnectionState(VOICE_STATE_CONNECTION_WAIT);
|
setVoiceConnectionState(VOICE_STATE_CONNECTION_WAIT);
|
||||||
LLCoros::getInstance()->launch("LLVoiceWebRTCConnection::requestVoiceConnectionCoro",
|
LLCoros::getInstance()->launch("LLVoiceWebRTCConnection::requestVoiceConnectionCoro",
|
||||||
boost::bind(&LLVoiceWebRTCConnection::requestVoiceConnectionCoro, this));
|
boost::bind(&LLVoiceWebRTCConnection::requestVoiceConnectionCoro, this->shared_from_this()));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VOICE_STATE_CONNECTION_WAIT:
|
case VOICE_STATE_CONNECTION_WAIT:
|
||||||
|
|
@ -2739,7 +2740,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
||||||
case VOICE_STATE_DISCONNECT:
|
case VOICE_STATE_DISCONNECT:
|
||||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_EXIT);
|
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_EXIT);
|
||||||
LLCoros::instance().launch("LLVoiceWebRTCConnection::breakVoiceConnectionCoro",
|
LLCoros::instance().launch("LLVoiceWebRTCConnection::breakVoiceConnectionCoro",
|
||||||
boost::bind(&LLVoiceWebRTCConnection::breakVoiceConnectionCoro, this));
|
boost::bind(&LLVoiceWebRTCConnection::breakVoiceConnectionCoro, this->shared_from_this()));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VOICE_STATE_WAIT_FOR_EXIT:
|
case VOICE_STATE_WAIT_FOR_EXIT:
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ class LLWebRTCProtocolParser;
|
||||||
|
|
||||||
class LLAvatarName;
|
class LLAvatarName;
|
||||||
class LLVoiceWebRTCConnection;
|
class LLVoiceWebRTCConnection;
|
||||||
typedef boost::shared_ptr<LLVoiceWebRTCConnection> connectionPtr_t;
|
typedef std::shared_ptr<LLVoiceWebRTCConnection> connectionPtr_t;
|
||||||
|
|
||||||
extern const std::string WEBRTC_VOICE_SERVER_TYPE;
|
extern const std::string WEBRTC_VOICE_SERVER_TYPE;
|
||||||
|
|
||||||
|
|
@ -88,6 +88,7 @@ public:
|
||||||
std::string sipURIFromID(const LLUUID &id) const override;
|
std::string sipURIFromID(const LLUUID &id) const override;
|
||||||
LLSD getP2PChannelInfoTemplate(const LLUUID& id) const override;
|
LLSD getP2PChannelInfoTemplate(const LLUUID& id) const override;
|
||||||
|
|
||||||
|
void setHidden(bool hidden) override; // virtual
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
/// @name Logging
|
/// @name Logging
|
||||||
|
|
@ -252,7 +253,7 @@ public:
|
||||||
bool mIsModeratorMuted;
|
bool mIsModeratorMuted;
|
||||||
LLUUID mRegion;
|
LLUUID mRegion;
|
||||||
};
|
};
|
||||||
typedef boost::shared_ptr<participantState> participantStatePtr_t;
|
typedef std::shared_ptr<participantState> participantStatePtr_t;
|
||||||
|
|
||||||
participantStatePtr_t findParticipantByID(const std::string &channelID, const LLUUID &id);
|
participantStatePtr_t findParticipantByID(const std::string &channelID, const LLUUID &id);
|
||||||
participantStatePtr_t addParticipantByID(const std::string& channelID, const LLUUID &id, const LLUUID& region);
|
participantStatePtr_t addParticipantByID(const std::string& channelID, const LLUUID &id, const LLUUID& region);
|
||||||
|
|
@ -265,10 +266,10 @@ public:
|
||||||
class sessionState
|
class sessionState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<sessionState> ptr_t;
|
typedef std::shared_ptr<sessionState> ptr_t;
|
||||||
typedef boost::weak_ptr<sessionState> wptr_t;
|
typedef std::weak_ptr<sessionState> wptr_t;
|
||||||
|
|
||||||
typedef boost::function<void(const ptr_t &)> sessionFunc_t;
|
typedef std::function<void(const ptr_t &)> sessionFunc_t;
|
||||||
|
|
||||||
static void addSession(const std::string &channelID, ptr_t& session);
|
static void addSession(const std::string &channelID, ptr_t& session);
|
||||||
virtual ~sessionState();
|
virtual ~sessionState();
|
||||||
|
|
@ -336,7 +337,7 @@ public:
|
||||||
sessionFunc_t func);
|
sessionFunc_t func);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::shared_ptr<sessionState> sessionStatePtr_t;
|
typedef std::shared_ptr<sessionState> sessionStatePtr_t;
|
||||||
typedef std::map<std::string, sessionStatePtr_t> sessionMap;
|
typedef std::map<std::string, sessionStatePtr_t> sessionMap;
|
||||||
|
|
||||||
class estateSessionState : public sessionState
|
class estateSessionState : public sessionState
|
||||||
|
|
@ -480,8 +481,6 @@ private:
|
||||||
|
|
||||||
LLSD getAudioSessionChannelInfo();
|
LLSD getAudioSessionChannelInfo();
|
||||||
|
|
||||||
void setHidden(bool hidden) override; //virtual
|
|
||||||
|
|
||||||
void enforceTether();
|
void enforceTether();
|
||||||
|
|
||||||
void updateNeighboringRegions();
|
void updateNeighboringRegions();
|
||||||
|
|
@ -576,7 +575,8 @@ class LLVoiceWebRTCStats : public LLSingleton<LLVoiceWebRTCStats>
|
||||||
|
|
||||||
class LLVoiceWebRTCConnection :
|
class LLVoiceWebRTCConnection :
|
||||||
public llwebrtc::LLWebRTCSignalingObserver,
|
public llwebrtc::LLWebRTCSignalingObserver,
|
||||||
public llwebrtc::LLWebRTCDataObserver
|
public llwebrtc::LLWebRTCDataObserver,
|
||||||
|
public std::enable_shared_from_this<LLVoiceWebRTCConnection>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LLVoiceWebRTCConnection(const LLUUID ®ionID, const std::string &channelID);
|
LLVoiceWebRTCConnection(const LLUUID ®ionID, const std::string &channelID);
|
||||||
|
|
@ -610,7 +610,7 @@ class LLVoiceWebRTCConnection :
|
||||||
|
|
||||||
void processIceUpdates();
|
void processIceUpdates();
|
||||||
|
|
||||||
void processIceUpdatesCoro();
|
static void processIceUpdatesCoro(connectionPtr_t connection);
|
||||||
|
|
||||||
virtual void setMuteMic(bool muted);
|
virtual void setMuteMic(bool muted);
|
||||||
virtual void setSpeakerVolume(F32 volume);
|
virtual void setSpeakerVolume(F32 volume);
|
||||||
|
|
@ -677,9 +677,9 @@ class LLVoiceWebRTCConnection :
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void requestVoiceConnection() = 0;
|
virtual void requestVoiceConnection() = 0;
|
||||||
void requestVoiceConnectionCoro() { requestVoiceConnection(); }
|
static void requestVoiceConnectionCoro(connectionPtr_t connection) { connection->requestVoiceConnection(); }
|
||||||
|
|
||||||
void breakVoiceConnectionCoro();
|
static void breakVoiceConnectionCoro(connectionPtr_t connection);
|
||||||
|
|
||||||
LLVoiceClientStatusObserver::EStatusType mCurrentStatus;
|
LLVoiceClientStatusObserver::EStatusType mCurrentStatus;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3627,7 +3627,7 @@ Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice
|
||||||
<notification name="VoiceEffectsNotSupported">
|
<notification name="VoiceEffectsNotSupported">
|
||||||
Voice-Morph-Effekte werden von diesem Viewer nicht unterstützt.
|
Voice-Morph-Effekte werden von diesem Viewer nicht unterstützt.
|
||||||
Für weitere Informationen zu anderen Voice-Morphing-Tools, lesen Sie bitte [[FAQ_URL] diesen Artikel].
|
Für weitere Informationen zu anderen Voice-Morphing-Tools, lesen Sie bitte [[FAQ_URL] diesen Artikel].
|
||||||
<usetemplate name="okignore" yestext="OK"/>
|
<usetemplate ignoretext="Warnen, falls Voice-Morphing nicht unterstützt wird" name="okignore" yestext="OK"/>
|
||||||
</notification>
|
</notification>
|
||||||
<notification name="Cannot enter parcel: not a group member">
|
<notification name="Cannot enter parcel: not a group member">
|
||||||
Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
|
Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
|
||||||
|
|
|
||||||
|
|
@ -9507,6 +9507,7 @@ New Voice Morphs are available!
|
||||||
Voice Morphs are not supported by this viewer.
|
Voice Morphs are not supported by this viewer.
|
||||||
For more information about other voice morph tools, see [[FAQ_URL] this article].
|
For more information about other voice morph tools, see [[FAQ_URL] this article].
|
||||||
<usetemplate
|
<usetemplate
|
||||||
|
ignoretext="Warn me about voice morph not being supported"
|
||||||
name="okignore"
|
name="okignore"
|
||||||
yestext="OK"/>
|
yestext="OK"/>
|
||||||
<tag>voice</tag>
|
<tag>voice</tag>
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,10 @@
|
||||||
<menu_item_call label="Вернуть" name="Return..."/>
|
<menu_item_call label="Вернуть" name="Return..."/>
|
||||||
<menu_item_call label="Взять" name="Pie Object Take"/>
|
<menu_item_call label="Взять" name="Pie Object Take"/>
|
||||||
<menu_item_call label="Взять копию" name="Take Copy"/>
|
<menu_item_call label="Взять копию" name="Take Copy"/>
|
||||||
|
<menu_item_call label="Взять как комбинированный предмет" name="Take combined"/>
|
||||||
|
<menu_item_call label="Взять копию как комбинированный предмет" name="Take Copy combined"/>
|
||||||
|
<menu_item_call label="Взять как отдельные предметы" name="Take Separate"/>
|
||||||
|
<menu_item_call label="Взять копии как отдельные предметы" name="Take Copy Separate"/>
|
||||||
<menu_item_call label="Заплатить" name="Pay..."/>
|
<menu_item_call label="Заплатить" name="Pay..."/>
|
||||||
<menu_item_call label="Купить" name="Buy..."/>
|
<menu_item_call label="Купить" name="Buy..."/>
|
||||||
<context_menu label="Сохранить как" name="Export Menu">
|
<context_menu label="Сохранить как" name="Export Menu">
|
||||||
|
|
|
||||||
|
|
@ -16,39 +16,38 @@
|
||||||
|
|
||||||
<layout_stack name="group_info_sidetray_main">
|
<layout_stack name="group_info_sidetray_main">
|
||||||
<layout_panel name="header_container">
|
<layout_panel name="header_container">
|
||||||
|
<panel name="group_info_top">
|
||||||
<panel name="group_info_top">
|
<text_editor name="group_name" value="(Загрузка...)"/>
|
||||||
<text_editor name="group_name" value="(Загрузка...)"/>
|
<line_editor label="Введите здесь название новой группы" name="group_name_editor"/>
|
||||||
<line_editor label="Введите здесь название новой группы" name="group_name_editor"/>
|
</panel>
|
||||||
</panel>
|
|
||||||
|
|
||||||
</layout_panel>
|
</layout_panel>
|
||||||
<layout_panel name="group_info_content">
|
<layout_panel name="group_info_content">
|
||||||
|
<layout_stack name="layout">
|
||||||
<layout_stack name="layout">
|
<layout_panel name="group_accordions">
|
||||||
<layout_panel name="group_accordions">
|
<accordion name="groups_accordion">
|
||||||
<accordion name="groups_accordion">
|
<accordion_tab name="group_general_tab" title="Общие"/>
|
||||||
<accordion_tab name="group_general_tab" title="Общие"/>
|
<accordion_tab name="group_roles_tab" title="Роли"/>
|
||||||
<accordion_tab name="group_roles_tab" title="Роли"/>
|
<accordion_tab name="group_notices_tab" title="Объявления"/>
|
||||||
<accordion_tab name="group_notices_tab" title="Объявления"/>
|
<accordion_tab name="group_land_tab" title="Земля/активы"/>
|
||||||
<accordion_tab name="group_land_tab" title="Земля/активы"/>
|
<accordion_tab name="group_experiences_tab" title="Приключения"/>
|
||||||
<accordion_tab name="group_experiences_tab" title="Приключения"/>
|
</accordion>
|
||||||
</accordion>
|
</layout_panel>
|
||||||
</layout_panel>
|
</layout_stack>
|
||||||
</layout_stack>
|
<layout_stack name="button_row_ls">
|
||||||
<layout_stack name="button_row_ls">
|
<layout_panel name="btn_activate_lp">
|
||||||
<layout_panel name="btn_chat_lp">
|
<button label="Активация" name="btn_activate"/>
|
||||||
<button label="Чат" name="btn_chat"/>
|
</layout_panel>
|
||||||
</layout_panel>
|
<layout_panel name="btn_chat_lp">
|
||||||
<layout_panel name="call_btn_lp">
|
<button label="Чат" name="btn_chat"/>
|
||||||
<button label="Звонок группе" name="btn_call" tool_tip="Звонок этой группе"/>
|
</layout_panel>
|
||||||
</layout_panel>
|
<layout_panel name="call_btn_lp">
|
||||||
<layout_panel name="btn_apply_lp">
|
<button label="Звонок группе" name="btn_call" tool_tip="Звонок этой группе"/>
|
||||||
<button label="Сохранить" label_selected="Сохранить" name="btn_apply"/>
|
</layout_panel>
|
||||||
<button label="Создать группу" name="btn_create" tool_tip="Создать новую группу"/>
|
<layout_panel name="btn_apply_lp">
|
||||||
</layout_panel>
|
<button label="Сохранить" label_selected="Сохранить" name="btn_apply"/>
|
||||||
</layout_stack>
|
<button label="Создать группу" name="btn_create" tool_tip="Создать новую группу"/>
|
||||||
|
</layout_panel>
|
||||||
|
</layout_stack>
|
||||||
</layout_panel>
|
</layout_panel>
|
||||||
</layout_stack>
|
</layout_stack>
|
||||||
</panel>
|
</panel>
|
||||||
|
|
|
||||||
|
|
@ -88,12 +88,19 @@
|
||||||
<slider label="Расстояние прорисовки" name="DrawDistance"/>
|
<slider label="Расстояние прорисовки" name="DrawDistance"/>
|
||||||
<text name="DrawDistanceMeterText2">m</text>
|
<text name="DrawDistanceMeterText2">m</text>
|
||||||
<slider label="Максимум частиц" name="MaxParticleCount"/>
|
<slider label="Максимум частиц" name="MaxParticleCount"/>
|
||||||
|
<text name="AvatarComplexityModeLabel">Отображение аватара</text>
|
||||||
|
<combo_box name="AvatarComplexityMode">
|
||||||
|
<combo_box.item label="Огранич. по сложности" name="0"/>
|
||||||
|
<combo_box.item label="Всегда показ. друзей" name="1"/>
|
||||||
|
<combo_box.item label="Показ. только друзей" name="2"/>
|
||||||
|
</combo_box>
|
||||||
<slider label="Максимальная сложность" name="IndirectMaxComplexity" tool_tip="Контролирует, в какой момент визуально сложный аватар отобразится как силуэт"/>
|
<slider label="Максимальная сложность" name="IndirectMaxComplexity" tool_tip="Контролирует, в какой момент визуально сложный аватар отобразится как силуэт"/>
|
||||||
<slider label="Максимум 3D аватаров" name="IndirectMaxNonImpostors"/>
|
<slider label="Максимум 3D аватаров" name="IndirectMaxNonImpostors"/>
|
||||||
<slider label="Послеоперационне качество" name="RenderPostProcess"/>
|
<slider label="Послеоперационне качество" name="RenderPostProcess"/>
|
||||||
<text name="PostProcessText">
|
<text name="PostProcessText">
|
||||||
Низкое
|
Низкое
|
||||||
</text>
|
</text>
|
||||||
|
<slider label="Макс. кол-во источников света" name="MaxLights"/>
|
||||||
<slider label="Физика аватаров" name="AvatarPhysicsDetail"/>
|
<slider label="Физика аватаров" name="AvatarPhysicsDetail"/>
|
||||||
<slider label="Экспозиция:" name="RenderExposure"/>
|
<slider label="Экспозиция:" name="RenderExposure"/>
|
||||||
<text name="MeshDetailText">
|
<text name="MeshDetailText">
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@
|
||||||
<radio_item label="Слышать все голоса громко (только Open Sim)" name="2"/>
|
<radio_item label="Слышать все голоса громко (только Open Sim)" name="2"/>
|
||||||
</radio_group>
|
</radio_group>
|
||||||
<check_box label="Двигать губами аватара во время разговора" name="enable_lip_sync"/>
|
<check_box label="Двигать губами аватара во время разговора" name="enable_lip_sync"/>
|
||||||
|
<check_box label="Подавление эха" name="enable_echo_cancellation" tool_tip="Установите флажок, чтобы включить подавление голосового эха"/>
|
||||||
<check_box label="Показать голосовой индикатор над аватарами" tool_tip="Показывает голосовой индикатор (белую точку) над аватарами" name="FSShowVoiceVisualizer"/>
|
<check_box label="Показать голосовой индикатор над аватарами" tool_tip="Показывает голосовой индикатор (белую точку) над аватарами" name="FSShowVoiceVisualizer"/>
|
||||||
<check_box label="Показать голосовой индикатор над моим аватаром" name="FSShowMyOwnVoiceVisualizer"/>
|
<check_box label="Показать голосовой индикатор над моим аватаром" name="FSShowMyOwnVoiceVisualizer"/>
|
||||||
<check_box label="Показывать точку как часть голосового индикатора" tool_tip="Если этот параметр включен, точка отображается как часть голосового индикатора. Если отключено, отображаются только голосовые волны." name="FSShowVoiceVisualizerWithDot"/>
|
<check_box label="Показывать точку как часть голосового индикатора" tool_tip="Если этот параметр включен, точка отображается как часть голосового индикатора. Если отключено, отображаются только голосовые волны." name="FSShowVoiceVisualizerWithDot"/>
|
||||||
|
|
@ -120,6 +121,15 @@
|
||||||
<check_box label="Автоматически отклонять все входящие специальные голосовые вызовы AdHoc" name="VoiceCallsRejectAdHoc"/>
|
<check_box label="Автоматически отклонять все входящие специальные голосовые вызовы AdHoc" name="VoiceCallsRejectAdHoc"/>
|
||||||
<check_box label="Автоматически отклонять все входящие P2P (аватар с аватаром) голосовые вызовы" name="VoiceCallsRejectP2P"/>
|
<check_box label="Автоматически отклонять все входящие P2P (аватар с аватаром) голосовые вызовы" name="VoiceCallsRejectP2P"/>
|
||||||
<check_box label="Включить/выключить микрофон при нажатии кнопки на панели инструментов" name="push_to_talk_toggle_check" tool_tip="В режиме 'Включить/выключить' микрофон включается и выключается одиночным нажатием кнопки. Иначе микрофон включен только когда нажата кнопка."/>
|
<check_box label="Включить/выключить микрофон при нажатии кнопки на панели инструментов" name="push_to_talk_toggle_check" tool_tip="В режиме 'Включить/выключить' микрофон включается и выключается одиночным нажатием кнопки. Иначе микрофон включен только когда нажата кнопка."/>
|
||||||
|
<check_box label="Автоматическая регулировка усиления" name="voice_automatic_gain_control" tool_tip="Установите флажок, чтобы включить автоматическую регулировку усиления"/>
|
||||||
|
<text name="noise_suppression_label" width="105" >Шумоподавление</text>
|
||||||
|
<combo_box name="noise_suppression_combo">
|
||||||
|
<item label="Выключено" name="noise_suppression_none"/>
|
||||||
|
<item label="Низкое" name="noise_suppression_low"/>
|
||||||
|
<item label="Умеренное" name="noise_suppression_moderate"/>
|
||||||
|
<item label="Высокое" name="noise_suppression_high"/>
|
||||||
|
<item label="Максимум" name="noise_suppression_max"/>
|
||||||
|
</combo_box>
|
||||||
<button label="Настройки звукового устройства" name="device_settings_btn"/>
|
<button label="Настройки звукового устройства" name="device_settings_btn"/>
|
||||||
<panel label="Настройки устройства" name="device_settings_panel">
|
<panel label="Настройки устройства" name="device_settings_panel">
|
||||||
<panel.string name="default_text">
|
<panel.string name="default_text">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue