|
|
(26 intermediate revisions by 10 users not shown) |
Line 1: |
Line 1: |
| '''Voice''' is a feature that made its debut on its own grid and beta viewer in March of 2007[http://news.cnet.co.uk/gamesgear/0,39029682,49289943,00.htm]. | | {{Help|Multimedia=*|Communication=*|Glossary=*}} |
| | '''Voice''' is the ability to speak and hear other Residents in Second Life. See [[Voice Mentors: Getting Started with Voice]] for some introductory information. |
|
| |
|
| ==Frequently Asked Questions == | | ==Frequently Asked Questions == |
Line 12: |
Line 13: |
| You can set your preferences directly in your '''Documents and Settings\<user>\Application Data\SecondLife\user_settings\settings.xml''' file, or you can set them from the viewer. | | You can set your preferences directly in your '''Documents and Settings\<user>\Application Data\SecondLife\user_settings\settings.xml''' file, or you can set them from the viewer. |
|
| |
|
| Some settings can be made through the UI panels, but all can be set from the Client menu. | | Some settings can be made through the UI panels, but all can be set from the [[advanced menu]]. |
| | |
| | If you haven't already done so, you enable the Advanced menu using |
| | * '''PC''' - {{KeyCombo|ctrl=*|alt=*|D}} |
| | * '''Mac''' - {{KeyCombo|ctrl=*|opt=*|D}} |
| | |
| | {{KBnote| In some cases, there may be a shortcut conflict with another application. In which case, hold down {{KeyCombo|ctrl=*|alt=*|shift=*|D}}.}} (not to be confused with {{KeyCombo|ctrl=*|alt=*|Del}}). |
| | Then select: |
| | : Advanced -> Debug Settings |
| | Note: If you are on Mac OS X, this key combination can possibly hide your Dock. If this happens, click the Apple icon (upper left) then click Dock, then click Turn Hiding Off. |
|
| |
|
| If you haven't already done so, you enable the Client menu using Ctrl-Alt-D (not to be confused with Ctrl-Alt-Delete). Then select
| |
|
| |
|
| : Client -> Debug Settings
| |
|
| |
|
| to get the Debug Settings window. In the selection box, hit the triangle to bring up the list of debug variables and select the setting that you wish to change. | | to get the Debug Settings window. In the selection box, hit the triangle to bring up the list of debug variables and select the setting that you wish to change. |
Line 37: |
Line 45: |
| :;EnableVoiceChat | | :;EnableVoiceChat |
| ::FALSE | | ::FALSE |
| ::Enable talking to other residents with a microphone | | ::Enable talking to other Residents with a microphone |
| | |
| | :;Mute Voice (starting in version 1.19.0) |
| | ::FALSE |
| | ::Voice plays at 0 volume (streaming audio still takes up bandwidth) |
|
| |
|
| :;FloaterActiveSpeakersRect | | :;FloaterActiveSpeakersRect |
Line 45: |
Line 57: |
| :;OverdrivenColor | | :;OverdrivenColor |
| ::1.0 0.0 0.0 1.0 | | ::1.0 0.0 0.0 1.0 |
| ::Color of various indicators when resident is speaking too loud. | | ::Color of various indicators when Resident is speaking too loud. |
|
| |
|
| :;PushToTalkButton | | :;PushToTalkButton |
Line 54: |
Line 66: |
| ::FALSE | | ::FALSE |
| ::Should the push-to-talk button behave as a toggle | | ::Should the push-to-talk button behave as a toggle |
| | |
| | :;ShowVoiceChannelPopup (starting in version 1.19.0) |
| | ::FALSE |
| | ::Controls visibility of the current voice channel popup above the voice tab |
|
| |
|
| :;SpeakingColor | | :;SpeakingColor |
| ::0.0 1.0 0.0 1.0 | | ::0.0 1.0 0.0 1.0 |
| ::Color of various indicators when resident is speaking on a voice channel. | | ::Color of various indicators when Resident is speaking on a voice channel. |
|
| |
|
| :;VivoxDebugLevel | | :;VivoxDebugLevel |
Line 69: |
Line 85: |
| :;VoiceCallsFriendsOnly | | :;VoiceCallsFriendsOnly |
| ::FALSE | | ::FALSE |
| ::Only accept voice calls from residents on your friends list | | ::Only accept voice calls from Residents on your friends list |
|
| |
|
| :;VoiceEarLocation | | :;VoiceEarLocation |
| ::0 | | ::0 |
| ::Location of the virtual ear for voice | | ::Location of the virtual ear for voice |
| | |
| | :;VoiceHost |
| | ::127.0.0.1 |
| | ::Client SLVoice host to connect to |
|
| |
|
| :;VoiceImageLevel0 | | :;VoiceImageLevel0 |
Line 110: |
Line 130: |
| ::Default | | ::Default |
| ::Audio output device to use for voice | | ::Audio output device to use for voice |
| | |
| | :;VoicePort |
| | ::44124 |
| | ::Client SLVoice port to connect to |
|
| |
|
| :;WarnFirstVoice | | :;WarnFirstVoice |
Line 115: |
Line 139: |
| ::Enables FirstVoice warning dialog | | ::Enables FirstVoice warning dialog |
|
| |
|
| ==Technical== | | ==Recording== |
|
| |
|
| Voice in Second Life uses [http://www.vivox.com/ Vivox] technology that is based on RTP (using the [http://www.linphone.org/index.php/eng/code_review/ortp oRTP] library), SIP (using the amsip library from [http://www.antisip.com/ Antisip]), [http://www.openal.org/ OpenAL], [http://tinyxpath.sourceforge.net/ TinyXPath], [http://www.openssl.org/ OpenSSL], and [http://curl.haxx.se/ libcurl] for the transmission of voice data. The positional 3D audio is achieved with technology from [http://www.dw.com/about.php DiamondWare]. These technologies are contained in external daemon software that is started and stopped by the Second Life client.
| | See [[User:Torley Linden|Torley Linden's]] page on [[Voice recording]] |
|
| |
|
| The SecondLife viewer handles configuration, control, and display functions, but the voice streams (from the microphone and from the Vivox voice server) do not enter the viewer. Unfortunately the source code for the external SLVoice daemon is not available due to contractual obligations between Linden Labs and Vivox.
| | ==LipSync== |
|
| |
|
| The executables can be found in the Program Files\SecondLife directory of the runtime and in the linden\indra\newview\vivox-runtime\(platform) directory of the source distribution.
| | See the [[LipSync]] page for information on lip sync for voice chat. |
| | |
| * SLVoice.exe
| |
| ** Thin wrapper around the [http://www.vivox.com/ Vivox] SDK
| |
| ** Launched when voice is enabled in SL
| |
| ** Runs a TCP server that listens and replies to commands and queries using an XML format
| |
| * SLVoiceAgent.exe
| |
| ** Actually called the [http://www.dw.com/about.php DiamondWare] Thin Voice Client
| |
| ** Launched by SLVoice, but don't know under what conditions
| |
| ** Unclear how this fits in the communication chain
| |
| ** Not launched for normal proximity voice chat; don't know about group chat or P2P yet
| |
| * vivoxsdk.dll
| |
| ** The [http://www.vivox.com/ Vivox] SDK
| |
| ** Used by SLVoice.exe
| |
| ** Uses a solution from [http://www.antisip.com/ Antisip] for SIP, RTP, and G.711
| |
| ** Uses [http://www.openal.org/ OpenAL] for playing and recording audio
| |
| ** Additionally implements the [http://www.itu.int/rec/T-REC-G.722.1-200505-I/en G.722.1/C] (aka Siren14) codec
| |
| * ortp.dll
| |
| ** Real-time Transport Protocol (RFC3550) stack under LGPL
| |
| ** Used by vivoxsdk.dll
| |
| ** Originally from [http://www.linphone.org/index.php/eng/code_review/ortp Linphone]
| |
| ** Distributed as part of amsip by [http://www.antisip.com/ Antisip]
| |
| * wrap_oal.dll
| |
| ** [http://www.openal.org/ OpenAL], a cross-platform 3D audio API
| |
| ** Used by vivoxsdk.dll
| |
| * alut.dll
| |
| ** The [http://openal.org/openal_webstf/specs/alut.html OpenAL Utility Toolkit (ALUT)]
| |
| ** Used by vivoxsdk.dll
| |
| * ssleay32.dll and libeay32
| |
| ** From the [http://www.openssl.org/ OpenSSL Project], a collaborative effort to develop a robust, commercial-grade, full-featured, and Open Source toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols as well as a full-strength general purpose cryptography library.
| |
| ** Used by SLVoiceAgent.dll
| |
| * tntk.dll and srtp.dll
| |
| ** Part of the [http://www.dw.com/about.php DiamondWare] distribution
| |
| ** Apparently not used
| |
| <br />
| |
| | |
| See also: [[Third Party Libraries]] | |
| <br /><br />
| |
| | |
| ===SLVoice===
| |
| ----
| |
| | |
| SLVoice is started from the viewer in SLVoiceClient::stateMachine() using:
| |
| | |
| :'''SLVoice.exe -p tcp -h -c -ll <''VivoxDebugLevel, default -1''>'''
| |
| | |
| usage: '''SLVoice [''flags'']'''
| |
| | |
| valid flags are:
| |
| : [-ll <log-level>] 0-5, or -1 for no logging
| |
| : [-lf <log-folder>]
| |
| : [-lp <log-file prefix>]
| |
| : [-ls <log-file suffix>]
| |
| : [-p tcp]
| |
| : [-i <address>] application sends requests to this address
| |
| : [-o <address>] according to the executable, the gateway sends responses and events to this address, but according to the official documentation, the gateway both sends and receives to/from this address. Please update this if you determine which is correct.
| |
| : [-vo] vivox only functionality
| |
| : [-ov] (undocumented and unused)
| |
| : [-c] cleanup orphaned SLVoice processes. If this is the only argument to SLVoice, then it cleans up and exits; if there are other arguments, it cleans up any old instances and launches a new one.
| |
| : [-h] hide the window associated with SLVoice. On MS Windows, this appears to be the default, because there is no window whether this parameter is set ot not.
| |
| : [-r] (undocumented and unused)
| |
| | |
| SLVoice.exe was called vivox-gw.exe in the beta release, so you may still see some references to the old name.
| |
| | |
| ====IP Address====
| |
| The SecondLife viewer uses IP address 127.0.0.1 (localhost), port 44124 to communicate with SLVoice, the voice client gateway.
| |
| | |
| It is possible to connect to a client gateway running on another host. This is useful for testing. According to comments in the source code: to do this, launch the gateway on a nearby host,
| |
| | |
| : '''SLVoice.exe -p tcp -i 0.0.0.0:44124'''
| |
| | |
| and modify the code in SLVoiceClient::stateMachine() to set the host IP address, '''mDaemonHost'''.
| |
| | |
| ====Logging====
| |
| | |
| The logging for SLVoice is controlled by a viewer variable, VivoxDebugLevel. You can set it directly in your '''Documents and Settings\<user>\Application Data\SecondLife\user_settings\settings.xml''' file
| |
| | |
| :: <nowiki><!</nowiki>--Logging level to use when launching the vivox daemon-->
| |
| :: <VivoxDebugLevel value="5 -lf myDirectory -lp myPrefix -ls .txt"/>
| |
| | |
| or you can set it from the viewer. To set it from the viewer, you have to enable the Client menu if you haven't already using Ctrl-Alt-D (not to be confused with Ctrl-Alt-Delete). Then select
| |
| | |
| : Client -> Debug Settings
| |
| | |
| to get the Debug Settings window. In the selection box, hit the triangle to bring up the list of debug variables and select VivoxDebugLevel. In the text entry box, you'll see the current value. Above it is the description, "Logging level to use when launching the Vivox daemon." You can set the level as you like. If you want the output to go somewhere other than the default location, you can enter it in the box as well, for example,
| |
| | |
| :: '''5 -lf myDirectory -lp myPrefix -ls .txt'''
| |
| | |
| If <log-folder> is a relative path, it is relative to the directory that SecondLife is running in, ususally '''C:\Program Files\SecondLife'''
| |
| | |
| The default folder is '''c:/Documents and Settings/<user>/Local Settings/Application Data/Vivox/logs'''. The default prefix is '''SLVoice''' and the default suffix is '''.txt'''.
| |
| | |
| The log file is named <nowiki><log-file prefix>-<yyyy>-<mm>-<dd><log-file suffix></nowiki>
| |
| | |
| The default on September 3, 2007, for example, would be: SLVoice-2007-09-03.txt
| |
| | |
| The <log-level> must be at least 2 to see INFO messages and 4 to see TRACE messages.
| |
| | |
| | |
| Whenever log level is other than "-1", there is also a log file written to '''LL_PATH_LOGS''', which is usually set to '''c:/Documents and Settings/<user>/Application Data/SecondLife/logs''',
| |
| with the <log-file prefix> "Connector," that contains log information for the Connector. This logging comes from vivoxsdk.dll which is used by SLVoice.exe. The content does not depend on the log level for SLVoice; the Connector.Create.1 request hardcodes the Connector log level at 10.
| |
| | |
| | |
| *There is apparently no Response sent to the viewer for [[#Session.Set3DPosition.1|Session.Set3DPosition.1]]
| |
| *SLVoice does not log [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *SLVoice does not log [[#Account.Logout.1|Account.Logout.1]]
| |
| *SLVoice may not log the Response to [[#Connector.InitiateShutdown.1|Connector.InitiateShutdown.1]] but when it does it tends to spew tens of thousands (about ten per millisecond) of messages to the log.
| |
| ::17:11:38.988, 0x00001414, INFO , disconnectHandler Client Connection Closed - shutting down
| |
| ::17:11:38.988, 0x00001414, INFO , shutdownGateway Terminating Gateway Process
| |
| | |
| | |
| SLVoice logs commands with added default values for fields not sent by the viewer, for example,
| |
| | |
| :for [[#Account.Login.1|Account.Login.1]] the log includes fields
| |
| ::<AccountURI />
| |
| ::<ParticipantPropertyFrequency>10</ParticipantPropertyFrequency>
| |
| ::<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>
| |
| | |
| :for [[#Connector.Create.1|Connector.Create.1]]
| |
| ::<AttemptStun>AttemptStunUnspecified</AttemptStun>
| |
| ::<MinimumPort>22860</MinimumPort>
| |
| ::<MaximumPort>22892</MaximumPort>
| |
| | |
| :for [[#Session.Create.1|Session.Create.1]]
| |
| ::<Password />
| |
| ::<JoinAudio>true</JoinAudio>
| |
| ::<JoinText>false</JoinText>
| |
| ::<PasswordHashAlgorithm>ClearText</PasswordHashAlgorithm>
| |
| | |
| :for [[#Session.Set3DPosition.1|Session.Set3DPosition.1]]
| |
| ::<OrientationType>legacy</OrientationType>
| |
| <br />
| |
| | |
| ===Message Protocol===
| |
| ----
| |
| :<---- '''is a request from the viewer to SLVoice'''
| |
| :----> '''is a response from SLVoice to the viewer'''
| |
| :====> '''is an event notice from SLVoice to the viewer'''
| |
| <br />
| |
| | |
| ====Login====
| |
| | |
| *<---- [[#Aux.GetCaptureDevices.1|Aux.GetCaptureDevices.1]]
| |
| *<---- [[#Aux.GetRenderDevices.1|Aux.GetRenderDevices.1]]
| |
| *<---- [[#Connector.Create.1|Connector.Create.1]]
| |
| *----> [[#Aux.GetCaptureDevices.1|Aux.GetCaptureDevices.1]]
| |
| *----> [[#Aux.GetRenderDevices.1|Aux.GetRenderDevices.1]]
| |
| *----> [[#Connector.Create.1|Connector.Create.1]]
| |
| *<---- [[#Account.Login.1|Account.Login.1]]
| |
| *----> [[#Account.Login.1|Account.Login.1]]
| |
| *====> [[#LoginStateChangeEvent|LoginStateChangeEvent]]
| |
| *<---- [[#Session.Create.1|Session.Create.1]]
| |
| *----> [[#Session.Create.1|Session.Create.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *<---- [[#Session.Set3DPosition.1|Session.Set3DPosition.1]]
| |
| *<---- [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *<---- [[#Connector.MuteLocalSpeaker.1|Connector.MuteLocalSpeaker.1]]
| |
| *<---- [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *<---- [[#Connector.SetLocalMicVolume.1|Connector.SetLocalMicVolume.1]]
| |
| *<---- [[#Aux.SetCaptureDevice.1|Aux.SetCaptureDevice.1]]
| |
| *<---- [[#Aux.SetRenderDevice.1|Aux.SetRenderDevice.1]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *----> [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *----> [[#Connector.MuteLocalSpeaker.1|Connector.MuteLocalSpeaker.1]]
| |
| *----> [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *----> [[#Connector.SetLocalMicVolume.1|Connector.SetLocalMicVolume.1]]
| |
| *----> [[#Aux.SetCaptureDevice.1|Aux.SetCaptureDevice.1]]
| |
| *----> [[#Aux.SetRenderDevice.1|Aux.SetRenderDevice.1]]
| |
| | |
| If someone else is already there
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| for each participant
| |
| <br /><br />
| |
| | |
| ====Movement====
| |
| | |
| *<---- [[#Session.Set3DPosition.1|Session.Set3DPosition.1]]
| |
| :many times per second
| |
| <br />
| |
| | |
| ====Teleporting====
| |
| | |
| *<---- [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *----> [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *====> [[#SessionMediaEvent|SessionMediaEvent]]
| |
| *====> [[#SessionMediaEvent|SessionMediaEvent]]
| |
| *<---- [[#Session.Create.1|Session.Create.1]]
| |
| *----> [[#Session.Create.1|Session.Create.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *<---- [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *<---- [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *----> [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *----> [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| | |
| and if anyone is there
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| for each participant
| |
| <br /><br />
| |
| | |
| ====Participant enters the area====
| |
| | |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| <br />
| |
| | |
| ====Participant leaves the area====
| |
| | |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| <br />
| |
| | |
| ====Speech====
| |
| | |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| :many times per second
| |
| <br />
| |
| | |
| ====Mute your microphone====
| |
| | |
| *<---- [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *----> [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| <br />
| |
| | |
| ====Adjust the volume of your microphone====
| |
| | |
| *<---- [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *----> [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| many times per second
| |
| <br /><br />
| |
| | |
| ====Mute or adjust participant volume====
| |
| | |
| This first command is internal to SLVoice
| |
| *<.... [[#Session.SetParticipantMuteForMe.1|Session.SetParticipantMuteForMe.1]]
| |
| *<---- [[#Session.SetParticipantVolumeForMe.1|Session.SetParticipantVolumeForMe.1]]
| |
| *----> [[#Session.SetParticipantVolumeForMe.1|Session.SetParticipantVolumeForMe.1]]
| |
| many times per second
| |
| <br /><br />
| |
| | |
| ====Audio Wizard====
| |
| | |
| *<---- [[#Aux.GetCaptureDevices.1|Aux.GetCaptureDevices.1]]
| |
| *<---- [[#Aux.GetRenderDevices.1|Aux.GetRenderDevices.1]]
| |
| *----> [[#Aux.GetCaptureDevices.1|Aux.GetCaptureDevices.1]]
| |
| *<---- [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *----> [[#Aux.GetRenderDevices.1|Aux.GetRenderDevices.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *----> [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *====> [[#SessionMediaEvent|SessionMediaEvent]]
| |
| *====> [[#SessionMediaEvent|SessionMediaEvent]]
| |
| *<---- [[#Aux.CaptureAudioStart.1|Aux.CaptureAudioStart.1]]
| |
| *----> [[#Aux.CaptureAudioStart.1|Aux.CaptureAudioStart.1]]
| |
| *<---- [[#Aux.SetMicLevel.1|Aux.SetMicLevel.1]]
| |
| *<---- [[#Aux.SetSpeakerLevel.1|Aux.SetSpeakerLevel.1]]
| |
| *----> [[#Aux.SetMicLevel.1|Aux.SetMicLevel.1]]
| |
| *----> [[#Aux.SetSpeakerLevel.1|Aux.SetSpeakerLevel.1]]
| |
| *====> [[#AuxAudioPropertiesEvent|AuxAudioPropertiesEvent]]
| |
| :many times per second
| |
| *<---- [[#Aux.CaptureAudioStop.1|Aux.CaptureAudioStop.1]]
| |
| *----> [[#Aux.CaptureAudioStop.1|Aux.CaptureAudioStop.1]]
| |
| *====> [[#AuxAudioPropertiesEvent|AuxAudioPropertiesEvent]]
| |
| *<---- [[#Session.Create.1|Session.Create.1]]
| |
| *----> [[#Session.Create.1|Session.Create.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *<---- [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *<---- [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *----> [[#Connector.MuteLocalMic.1|Connector.MuteLocalMic.1]]
| |
| *----> [[#Connector.SetLocalSpeakerVolume.1|Connector.SetLocalSpeakerVolume.1]]
| |
| *====> [[#ParticipantStateChangeEvent|ParticipantStateChangeEvent]]
| |
| *====> [[#ParticipantPropertiesEvent|ParticipantPropertiesEvent]]
| |
| *<---- [[#Aux.SetRenderDevice.1|Aux.SetRenderDevice.1]]
| |
| *----> [[#Aux.SetRenderDevice.1|Aux.SetRenderDevice.1]]
| |
| <br />
| |
| | |
| ====Logout====
| |
| | |
| *<---- [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *====> [[#SessionStateChangeEvent|SessionStateChangeEvent]]
| |
| *----> [[#Session.Terminate.1|Session.Terminate.1]]
| |
| *<---- [[#Account.Logout.1|Account.Logout.1]]
| |
| *<---- [[#Connector.InitiateShutdown.1|Connector.InitiateShutdown.1]]
| |
| We usually disappear before getting the rest
| |
| *----> [[#Account.Logout.1|Account.Logout.1]]
| |
| *====> [[#LoginStateChangeEvent|LoginStateChangeEvent]]
| |
| *----> [[#Connector.InitiateShutdown.1|Connector.InitiateShutdown.1]]
| |
| <br />
| |
| | |
| ===Message Format===
| |
| ----
| |
| | |
| ====Events====
| |
| These are examples of the Vivox SDK event messages sent to the SecondLife viewer.
| |
| <br />
| |
| | |
| =====AuxAudioPropertiesEvent=====
| |
| | |
| :<Event type="AuxAudioPropertiesEvent">
| |
| :: <MicIsActive>'''true'''</MicIsActive>
| |
| :: <MicEnergy>'''0.0764444'''</MicEnergy>
| |
| :: <MicVolume>'''0'''</MicVolume>
| |
| :: <SpeakerVolume>'''0'''</SpeakerVolume>
| |
| :</Event>
| |
| <br />
| |
| | |
| =====LoginStateChangeEvent=====
| |
| | |
| :<Event type="LoginStateChangeEvent">
| |
| :: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| :: <StatusCode>'''200'''</StatusCode>
| |
| :: <StatusString>'''OK'''</StatusString>
| |
| :: <State>'''1'''</State>
| |
| :</Event>
| |
| <br />
| |
| | |
| =====ParticipantPropertiesEvent=====
| |
| | |
| :<Event type="ParticipantPropertiesEvent">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy2'''</SessionHandle>
| |
| :: <ParticipantURI>'''aBcDeFgHiJkLmNoPqRsTuVwXy'''</ParticipantURI>
| |
| :: <IsLocallyMuted>'''false'''</IsLocallyMuted>
| |
| :: <IsModeratorMuted>'''false'''</IsModeratorMuted>
| |
| :: <IsSpeaking>'''true'''</IsSpeaking>
| |
| :: <Volume>'''50'''</Volume>
| |
| :: <Energy>'''0.400826'''</Energy>
| |
| :</Event>
| |
| <br />
| |
| | |
| =====ParticipantStateChangeEvent=====
| |
| | |
| :<Event type="ParticipantStateChangeEvent">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy2'''</SessionHandle>
| |
| :: <StatusCode>'''0'''</StatusCode>
| |
| :: <StatusString>''''''</StatusString>
| |
| :: <State>'''7'''</State>
| |
| :: <ParticipantURI>'''aBcDeFgHiJkLmNoPqRsTuVwXy'''</ParticipantURI>
| |
| :: <AccountName>'''aBcDeFgHiJkLmNoPqRsTuVwXy'''</AccountName>
| |
| :: <ParticipantType>'''0'''</ParticipantType>
| |
| :</Event>
| |
| <br />
| |
| | |
| =====SessionMediaEvent=====
| |
| | |
| ::Ignored by the viewer
| |
| | |
| :<Event type="SessionMediaEvent">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy1'''</SessionHandle>
| |
| :: <HasText>'''false'''</HasText>
| |
| :: <HasAudio>'''false'''</HasAudio>
| |
| :: <HasVideo>'''false'''</HasVideo>
| |
| :: <Terminated>'''true'''</Terminated>
| |
| :</Event>
| |
| <br />
| |
| | |
| =====SessionNewEvent=====
| |
| | |
| ::Used by p2p
| |
| <br />
| |
| | |
| =====SessionStateChangeEvent=====
| |
| | |
| :<Event type="SessionStateChangeEvent">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy0'''</SessionHandle>
| |
| :: <StatusCode>'''200'''</StatusCode>
| |
| :: <StatusString>'''OK'''</StatusString>
| |
| :: <State>'''4'''</State>
| |
| :: <URI>'''sip:confctl-505189@bhr.vivox.com'''</URI>
| |
| :: <IsChannel>'''true'''</IsChannel>
| |
| :: <ChannelName />
| |
| :</Event>
| |
| <br />
| |
| | |
| ====Actions====
| |
| These are examples of the Vivox SDK commands used by the SecondLife viewer.
| |
| <br />
| |
| | |
| =====Account.ChannelGetList.1=====
| |
| | |
| ::Coded in llvoiceclient.cpp but not used
| |
| <br />
| |
| | |
| =====Account.Login.1=====
| |
| | |
| :<Request requestId="3" action="Account.Login.1">
| |
| :: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: <AccountName>'''abcdefghijklmnopqrstuvwxy'''</AccountName>
| |
| :: <AccountPassword>'''ABCDEFGHIJKLMNOPQRSTUVW'''</AccountPassword>
| |
| :: <AudioSessionAnswerMode>'''VerifyAnswer'''</AudioSessionAnswerMode>
| |
| :: <AccountURI />
| |
| :: <ParticipantPropertyFrequency>'''10'''</ParticipantPropertyFrequency>
| |
| :: <EnableBuddiesAndPresence>'''false'''</EnableBuddiesAndPresence>
| |
| :</Request>
| |
| | |
| :<Response requestId="3" action="Account.Login.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString>'''OK'''</StatusString>
| |
| ::: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="3" action="Account.Login.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :::: <AccountName>'''abcdefghijklmnopqrstuvwxy<AccountName>
| |
| :::: <AccountPassword>'''ABCDEFGHIJKLMNOPQRSTUVW'''</AccountPassword>
| |
| :::: <AudioSessionAnswerMode>'''VerifyAnswer'''</AudioSessionAnswerMode>
| |
| :::: <AccountURI />
| |
| :::: <ParticipantPropertyFrequency>'''10'''</ParticipantPropertyFrequency>
| |
| :::: <EnableBuddiesAndPresence>'''false'''</EnableBuddiesAndPresence>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Account.Logout.1=====
| |
| | |
| :<Request requestId="557" action="Account.Logout.1">
| |
| :: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| :</Request>
| |
| | |
| :The viewer doesn't get the response before the Connector shuts down
| |
| | |
| :<Response requestId="557" action="Account.Logout.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString>'''OK'''</StatusString>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="557" action="Account.Logout.1">
| |
| :::: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.CaptureAudioStart.1=====
| |
| | |
| :<Request requestId="171" action="Aux.CaptureAudioStart.1">
| |
| :: <Duration>'''10000'''</Duration>
| |
| :</Request>
| |
| | |
| :<Response requestId="171" action="Aux.CaptureAudioStart.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="171" action="Aux.CaptureAudioStart.1">
| |
| :::: <Duration>'''10000'''</Duration>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.CaptureAudioStop.1=====
| |
| | |
| :<Request requestId="174" action="Aux.CaptureAudioStop.1" />
| |
| | |
| :<Response requestId="174" action="Aux.CaptureAudioStop.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="174" action="Aux.CaptureAudioStop.1" />
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.GetCaptureDevices.1=====
| |
| | |
| :<Request requestId="0" action="Aux.GetCaptureDevices.1" />
| |
| | |
| :<Response requestId="0" action="Aux.GetCaptureDevices.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| ::: <CaptureDevices>
| |
| :::: <CaptureDevice>
| |
| ::::: <Device>'''Realtek HD Front Pink Jack'''</Device>
| |
| :::: </CaptureDevice>
| |
| :::: <CaptureDevice>
| |
| ::::: <Device>'''Realtek HD Digital input'''</Device>
| |
| :::: </CaptureDevice>
| |
| :::: <CaptureDevice>
| |
| ::::: <Device>'''Realtek HD Front Green Jack'''</Device>
| |
| :::: </CaptureDevice>
| |
| :::: <CaptureDevice>
| |
| ::::: <Device>'''Back Line in/Mic, Front Line in'''</Device>
| |
| :::: </CaptureDevice>
| |
| ::: </CaptureDevices>
| |
| ::: <CurrentCaptureDevice>
| |
| :::: <Device>'''Realtek HD Front Pink Jack'''</Device>
| |
| ::: </CurrentCaptureDevice>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="0" action="Aux.GetCaptureDevices.1" />
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.GetRenderDevices.1=====
| |
| | |
| :<Request requestId="1" action="Aux.GetRenderDevices.1" />
| |
| | |
| :<Response requestId="1" action="Aux.GetRenderDevices.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| ::: <RenderDevices>
| |
| :::: <RenderDevice>
| |
| ::::: <Device>'''Realtek HD Audio rear output'''</Device>
| |
| :::: </RenderDevice>
| |
| ::: </RenderDevices>
| |
| ::: <CurrentRenderDevice>
| |
| :::: <Device>'''Realtek HD Audio rear output'''</Device>
| |
| ::: </CurrentRenderDevice>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="1" action="Aux.GetRenderDevices.1" />
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.RenderAudioStart.1=====
| |
| | |
| ::Coded in llvoiceclient.cpp but not used
| |
| <br />
| |
| | |
| =====Aux.RenderAudioStop.1=====
| |
| | |
| ::Coded in llvoiceclient.cpp but not used
| |
| <br />
| |
| | |
| =====Aux.SetCaptureDevice.1=====
| |
| | |
| :<Request requestId="9" action="Aux.SetCaptureDevice.1">
| |
| :: <CaptureDeviceSpecifier>'''Realtek HD Front Green Jack'''</CaptureDeviceSpecifier>
| |
| :</Request>
| |
| | |
| :<Response requestId="9" action="Aux.SetCaptureDevice.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="9" action="Aux.SetCaptureDevice.1">
| |
| :::: <CaptureDeviceSpecifier>'''Realtek HD Front Green Jack'''</CaptureDeviceSpecifier>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.SetMicLevel.1=====
| |
| | |
| :<Request requestId="172" action="Aux.SetMicLevel.1">
| |
| :: <Level>'''50'''</Level>
| |
| :</Request>
| |
| | |
| :<Response requestId="172" action="Aux.SetMicLevel.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="172" action="Aux.SetMicLevel.1">
| |
| :::: <Level>'''50'''</Level>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.SetRenderDevice.1=====
| |
| | |
| :<Request requestId="31" action="Aux.SetRenderDevice.1">
| |
| :: <RenderDeviceSpecifier>'''Realtek HD Audio rear output'''</RenderDeviceSpecifier>
| |
| :</Request>
| |
| | |
| :<Response requestId="31" action="Aux.SetRenderDevice.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="31" action="Aux.SetRenderDevice.1">
| |
| :::: <RenderDeviceSpecifier>'''Realtek HD Audio rear output'''</RenderDeviceSpecifier>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Aux.SetSpeakerLevel.1=====
| |
| | |
| :<Request requestId="173" action="Aux.SetSpeakerLevel.1">
| |
| :: <Level>'''50'''</Level>
| |
| :</Request>
| |
| | |
| :<Response requestId="173" action="Aux.SetSpeakerLevel.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="173" action="Aux.SetSpeakerLevel.1">
| |
| :::: <Level>'''50'''</Level>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.Create.1=====
| |
| | |
| :<Request requestId="2" action="Connector.Create.1">
| |
| :: <ClientName>'''V2 SDK'''</ClientName>
| |
| :: <AttemptStun>'''AttemptStunUnspecified'''</AttemptStun>
| |
| :: <AccountManagementServer>'''<nowiki>https://www.bhr.vivox.com/api2/</nowiki>'''</AccountManagementServer>
| |
| :: <MinimumPort>'''22860'''</MinimumPort>
| |
| :: <MaximumPort>'''22892'''</MaximumPort>
| |
| :: <Logging>
| |
| ::: <Enabled>'''false'''</Enabled>
| |
| ::: <Folder>'''C:\Documents and Settings\HP_Administrator\Application Data\SecondLife\logs'''</Folder>
| |
| ::: <FileNamePrefix>'''Connector'''</FileNamePrefix>
| |
| ::: <FileNameSuffix>'''.log'''</FileNameSuffix>
| |
| ::: <LogLevel>'''10'''</LogLevel>
| |
| :: </Logging>
| |
| :</Request>
| |
| | |
| :<Response requestId="2" action="Connector.Create.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <VersionID>'''2.0.2961.1968'''</VersionID>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| ::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="2" action="Connector.Create.1">
| |
| :::: <ClientName>'''V2 SDK'''</ClientName>
| |
| :::: <AttemptStun>'''AttemptStunUnspecified'''</AttemptStun>
| |
| :::: <AccountManagementServer>'''<nowiki>https://www.bhr.vivox.com/api2/</nowiki>'''</AccountManagementServer>
| |
| :::: <MinimumPort>'''22860'''</MinimumPort>
| |
| :::: <MaximumPort>'''22892'''</MaximumPort>
| |
| :::: <Logging>
| |
| ::::: <Enabled>'''false'''</Enabled>
| |
| ::::: <Folder>'''C:\Documents and Settings\HP_Administrator\Application Data\SecondLife\logs'''</Folder>
| |
| ::::: <FileNamePrefix>'''Connector'''</FileNamePrefix>
| |
| ::::: <FileNameSuffix>'''.log'''</FileNameSuffix>
| |
| ::::: <LogLevel>'''10'''</LogLevel>
| |
| :::: </Logging>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.InitiateShutdown.1=====
| |
| | |
| :<Request requestId="558" action="Connector.InitiateShutdown.1">
| |
| ::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :</Request>
| |
| | |
| :The viewer doesn't wait for a response
| |
| | |
| :<Response requestId="558" action="Connector.InitiateShutdown.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="558" action="Connector.InitiateShutdown.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.MuteLocalMic.1=====
| |
| | |
| :<Request requestId="6" action="Connector.MuteLocalMic.1">
| |
| :: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: <Value>'''true'''</Value>
| |
| :</Request>
| |
| | |
| :<Response requestId="6" action="Connector.MuteLocalMic.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="6" action="Connector.MuteLocalMic.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :::: <Value>'''true'''</Value>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.MuteLocalSpeaker.1=====
| |
| | |
| Used only if AudioLevelVoice is 0 at startup
| |
| | |
| :<Request requestId="7" action="Connector.MuteLocalSpeaker.1">
| |
| :: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: <Value>'''true'''</Value>
| |
| :</Request>
| |
| | |
| :<Response requestId="7" action="Connector.MuteLocalSpeaker.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="7" action="Connector.MuteLocalSpeaker.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :::: <Value>'''true'''</Value>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.SetLocalMicVolume.1=====
| |
| | |
| :<Request requestId="8" action="Connector.SetLocalMicVolume.1">
| |
| :: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: <Value>'''50'''</Value>
| |
| :</Request>
| |
| | |
| :<Response requestId="8" action="Connector.SetLocalMicVolume.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="8" action="Connector.SetLocalMicVolume.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :::: <Value>'''50'''</Value>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Connector.SetLocalSpeakerVolume.1=====
| |
| | |
| :<Request requestId="7" action="Connector.SetLocalSpeakerVolume.1">
| |
| :: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :: <Value>'''50'''</Value>
| |
| :</Request>
| |
| | |
| :<Response requestId="7" action="Connector.SetLocalSpeakerVolume.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="7" action="Connector.SetLocalSpeakerVolume.1">
| |
| :::: <ConnectorHandle>'''c1_m1000'''</ConnectorHandle>
| |
| :::: <Value>'''50'''</Value>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Session.Connect.1=====
| |
| | |
| ::Used by p2p
| |
| <br />
| |
| | |
| =====Session.Create.1=====
| |
| | |
| :<Request requestId="4" action="Session.Create.1">
| |
| :: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| :: <URI>'''sip:confctl-505189@bhr.vivox.com'''</URI>
| |
| :: <Name />
| |
| :: <Password />
| |
| :: <JoinAudio>'''true'''</JoinAudio>
| |
| :: <JoinText>'''false'''</JoinText>
| |
| :: <PasswordHashAlgorithm>'''ClearText'''</PasswordHashAlgorithm>
| |
| :</Request>
| |
| | |
| :<Response requestId="4" action="Session.Create.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| ::: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy0'''</SessionHandle>
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="4" action="Session.Create.1">
| |
| :::: <AccountHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy'''</AccountHandle>
| |
| :::: <URI>'''sip:confctl-505189@bhr.vivox.com'''</URI>
| |
| :::: <Name />
| |
| :::: <Password />
| |
| :::: <JoinAudio>'''true'''</JoinAudio>
| |
| :::: <JoinText>'''false'''</JoinText>
| |
| :::: <PasswordHashAlgorithm>'''ClearText'''</PasswordHashAlgorithm>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Session.Set3DPosition.1=====
| |
| | |
| When sending a 3D position for speaker and listener, the "listener" is either the avatar position or the camera position. That is, it describes the speaking position and the listening position for this avatar.
| |
| | |
| :<Request requestId="114" action="Session.Set3DPosition.1">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy1'''</SessionHandle>
| |
| :: <OrientationType>'''legacy'''</OrientationType>
| |
| :: <SpeakerPosition>
| |
| ::: <Position>
| |
| :::: <X>'''261451'''</X>
| |
| :::: <Y>'''26.9568'''</Y>
| |
| :::: <Z>'''-283000'''</Z>
| |
| ::: </Position>
| |
| ::: <Velocity>
| |
| :::: <X>'''0'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''0'''</Z>
| |
| ::: </Velocity>
| |
| ::: <AtOrientation>
| |
| :::: <X>'''0.816965'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''0.576688'''</Z>
| |
| ::: </AtOrientation>
| |
| ::: <UpOrientation>
| |
| :::: <X>'''0'''</X>
| |
| :::: <Y>'''1'''</Y>
| |
| :::: <Z>'''0'''</Z>
| |
| ::: </UpOrientation>
| |
| ::: <LeftOrientation>
| |
| :::: <X>'''0.576688'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''-0.816965'''</Z>
| |
| ::: </LeftOrientation>
| |
| :: </SpeakerPosition>
| |
| :: <ListenerPosition>
| |
| ::: <Position>
| |
| :::: <X>'''261448'''</X>
| |
| :::: <Y>'''27.9639'''</Y>
| |
| :::: <Z>'''-283001'''</Z>
| |
| ::: </Position>
| |
| ::: <Velocity>
| |
| :::: <X>'''0'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''0'''</Z>
| |
| ::: </Velocity>
| |
| ::: <AtOrientation>
| |
| :::: <X>'''0.795791'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''0.559283'''</Z>
| |
| ::: </AtOrientation>
| |
| ::: <UpOrientation>
| |
| :::: <X>'''0'''</X>
| |
| :::: <Y>'''1'''</Y>
| |
| :::: <Z>'''0'''</Z>
| |
| ::: </UpOrientation>
| |
| ::: <LeftOrientation>
| |
| :::: <X>'''0.574999'''</X>
| |
| :::: <Y>'''0'''</Y>
| |
| :::: <Z>'''-0.818154'''</Z>
| |
| ::: </LeftOrientation>
| |
| :: </ListenerPosition>
| |
| :</Request>
| |
| | |
| :The viewer doesn't get a response
| |
| <br />
| |
| | |
| =====Session.SetParticipantMuteForMe.1=====
| |
| | |
| This message is additionally processed internally by SLVoice whenever a [[#Session.SetParticipantVolumeForMe.1|Session.SetParticipantVolumeForMe.1]] is sent from the viewer.
| |
| | |
| :<Request requestId="ic0" action="Session.SetParticipantMuteForMe.1">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy1'''</SessionHandle>
| |
| :: <ParticipantURI>'''sip:aBcDeFgHiJkLmNoPqRsTuVwXy@bhr.vivox.com'''</ParticipantURI>
| |
| :: <Mute>'''0'''</Mute>
| |
| :</Request>
| |
| | |
| :No response is sent to the viewer.
| |
| <br />
| |
| | |
| =====Session.SetParticipantVolumeForMe.1=====
| |
| | |
| Used by IM panel and Active Speakers volume control
| |
| | |
| :<Request requestId="83" action="Session.SetParticipantVolumeForMe.1">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy1'''</SessionHandle>
| |
| :: <ParticipantURI>'''sip:aBcDeFgHiJkLmNoPqRsTuVwXy@bhr.vivox.com'''</ParticipantURI>
| |
| :: <Volume>'''57'''</Volume>
| |
| :</Request>
| |
| | |
| :<Response requestId="83" action="Session.SetParticipantVolumeForMe.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="83" action="Session.SetParticipantVolumeForMe.1">
| |
| :::: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy1'''</SessionHandle>
| |
| :::: <ParticipantURI>'''sip:aBcDeFgHiJkLmNoPqRsTuVwXy@bhr.vivox.com'''</ParticipantURI>
| |
| :::: <Volume>'''57'''</Volume>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
| | |
| =====Session.Terminate.1=====
| |
| | |
| :<Request requestId="25" action="Session.Terminate.1">
| |
| :: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy0'''</SessionHandle>
| |
| :</Request>
| |
| | |
| :<Response requestId="25" action="Session.Terminate.1">
| |
| :: <ReturnCode>'''0'''</ReturnCode>
| |
| :: <Results>
| |
| ::: <StatusCode>'''0'''</StatusCode>
| |
| ::: <StatusString />
| |
| :: </Results>
| |
| :: <InputXml>
| |
| ::: <Request requestId="25" action="Session.Terminate.1">
| |
| :::: <SessionHandle>'''c1_m1000abcdefghijklmnopqrstuvwxy0'''</SessionHandle>
| |
| ::: </Request>
| |
| :: </InputXml>
| |
| :</Response>
| |
| <br />
| |
|
| |
|
| | ==Technical== |
|
| |
|
| | Voice in Second Life uses [http://www.vivox.com/ Vivox] technology that is based on RTP (using the [http://www.linphone.org/index.php/eng/code_review/ortp oRTP] library), SIP (using the amsip library from [http://www.antisip.com/ Antisip]), [http://www.openal.org/ OpenAL], [http://tinyxpath.sourceforge.net/ TinyXPath], [http://www.openssl.org/ OpenSSL], and [http://curl.haxx.se/ libcurl] for the transmission of voice data. The positional 3D audio is achieved with technology from [http://www.dw.com/about.php DiamondWare]. These technologies are contained in external daemon software that is started and stopped by the Second Life client. |
|
| |
|
| | For more details, see the [[Voice/Technical]] page, or have a look at the official [http://jira.secondlife.com/secure/attachment/12026/Vivox-SLVoice-SDK-2007-09-20.pdf ViVox documentation on the JIRA]. |
|
| |
|
| [[Category:Voice]]
| |
|
| |
|
| [[Category:Features]] | | [[Category:Voice]] [[Category:Features]] |