/*
* Copyright (c) 2006-2014, openmetaverse.org
* All rights reserved.
*
* - Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* - Neither the name of the openmetaverse.org nor the names
* of its contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
namespace OpenMetaverse.Voice
{
public partial class VoiceGateway
{
#region Enums
public enum LoginState
{
LoggedOut = 0,
LoggedIn = 1,
Error = 4
}
public enum SessionState
{
Idle = 1,
Answering = 2,
InProgress = 3,
Connected = 4,
Disconnected = 5,
Hold = 6,
Refer = 7,
Ringing = 8
}
public enum ParticipantState
{
Idle = 1,
Pending = 2,
Incoming = 3,
Answering = 4,
InProgress = 5,
Ringing = 6,
Connected = 7,
Disconnecting = 8,
Disconnected = 9
}
public enum ParticipantType
{
User = 0,
Moderator = 1,
Focus = 2
}
public enum ResponseType
{
None = 0,
ConnectorCreate,
ConnectorInitiateShutdown,
MuteLocalMic,
MuteLocalSpeaker,
SetLocalMicVolume,
SetLocalSpeakerVolume,
GetCaptureDevices,
GetRenderDevices,
SetRenderDevice,
SetCaptureDevice,
CaptureAudioStart,
CaptureAudioStop,
SetMicLevel,
SetSpeakerLevel,
AccountLogin,
AccountLogout,
RenderAudioStart,
RenderAudioStop,
SessionCreate,
SessionConnect,
SessionTerminate,
SetParticipantVolumeForMe,
SetParticipantMuteForMe,
Set3DPosition
}
#endregion Enums
#region Logging
public class VoiceLoggingSettings
{
/// Enable logging
public bool Enabled;
/// The folder where any logs will be created
public string Folder;
/// This will be prepended to beginning of each log file
public string FileNamePrefix;
/// The suffix or extension to be appended to each log file
public string FileNameSuffix;
///
/// 0: NONE - No logging
/// 1: ERROR - Log errors only
/// 2: WARNING - Log errors and warnings
/// 3: INFO - Log errors, warnings and info
/// 4: DEBUG - Log errors, warnings, info and debug
///
public int LogLevel;
///
/// Constructor for default logging settings
///
public VoiceLoggingSettings()
{
Enabled = false;
Folder = String.Empty;
FileNamePrefix = "Connector";
FileNameSuffix = ".log";
LogLevel = 0;
}
}
#endregion Logging
public class VoiceResponseEventArgs : EventArgs
{
public readonly ResponseType Type;
public readonly int ReturnCode;
public readonly int StatusCode;
public readonly string Message;
// All Voice Response events carry these properties.
public VoiceResponseEventArgs(ResponseType type, int rcode, int scode, string text)
{
this.Type = type;
this.ReturnCode = rcode;
this.StatusCode = scode;
this.Message = text;
}
}
#region Session Event Args
public class VoiceSessionEventArgs : VoiceResponseEventArgs
{
public readonly string SessionHandle;
public VoiceSessionEventArgs(int rcode, int scode, string text, string shandle) :
base(ResponseType.SessionCreate, rcode, scode, text)
{
this.SessionHandle = shandle;
}
}
public class NewSessionEventArgs : EventArgs
{
public readonly string AccountHandle;
public readonly string SessionHandle;
public readonly string URI;
public readonly string Name;
public readonly string AudioMedia;
public NewSessionEventArgs(string AccountHandle, string SessionHandle, string URI, bool IsChannel, string Name, string AudioMedia)
{
this.AccountHandle = AccountHandle;
this.SessionHandle = SessionHandle;
this.URI = URI;
this.Name = Name;
this.AudioMedia = AudioMedia;
}
}
public class SessionMediaEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly bool HasText;
public readonly bool HasAudio;
public readonly bool HasVideo;
public readonly bool Terminated;
public SessionMediaEventArgs(string SessionHandle, bool HasText, bool HasAudio, bool HasVideo, bool Terminated)
{
this.SessionHandle = SessionHandle;
this.HasText = HasText;
this.HasAudio = HasAudio;
this.HasVideo = HasVideo;
this.Terminated = Terminated;
}
}
public class SessionStateChangeEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly int StatusCode;
public readonly string StatusString;
public readonly SessionState State;
public readonly string URI;
public readonly bool IsChannel;
public readonly string ChannelName;
public SessionStateChangeEventArgs(string SessionHandle, int StatusCode, string StatusString, SessionState State, string URI, bool IsChannel, string ChannelName)
{
this.SessionHandle = SessionHandle;
this.StatusCode = StatusCode;
this.StatusString = StatusString;
this.State = State;
this.URI = URI;
this.IsChannel = IsChannel;
this.ChannelName = ChannelName;
}
}
// Participants
public class ParticipantAddedEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly string SessionGroupHandle;
public readonly string URI;
public readonly string AccountName;
public readonly string DisplayName;
public readonly ParticipantType Type;
public readonly string Appllication;
public ParticipantAddedEventArgs(
string SessionGroupHandle,
string SessionHandle,
string ParticipantUri,
string AccountName,
string DisplayName,
ParticipantType type,
string Application)
{
this.SessionGroupHandle = SessionGroupHandle;
this.SessionHandle = SessionHandle;
this.URI = ParticipantUri;
this.AccountName = AccountName;
this.DisplayName = DisplayName;
this.Type = type;
this.Appllication = Application;
}
}
public class ParticipantRemovedEventArgs : EventArgs
{
public readonly string SessionGroupHandle;
public readonly string SessionHandle;
public readonly string URI;
public readonly string AccountName;
public readonly string Reason;
public ParticipantRemovedEventArgs(
string SessionGroupHandle,
string SessionHandle,
string ParticipantUri,
string AccountName,
string Reason)
{
this.SessionGroupHandle = SessionGroupHandle;
this.SessionHandle = SessionHandle;
this.URI = ParticipantUri;
this.AccountName = AccountName;
this.Reason = Reason;
}
}
public class ParticipantStateChangeEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly int StatusCode;
public readonly string StatusString;
public readonly ParticipantState State;
public readonly string URI;
public readonly string AccountName;
public readonly string DisplayName;
public readonly ParticipantType Type;
public ParticipantStateChangeEventArgs(string SessionHandle, int StatusCode, string StatusString,
ParticipantState State, string ParticipantURI, string AccountName,
string DisplayName, ParticipantType ParticipantType)
{
this.SessionHandle = SessionHandle;
this.StatusCode = StatusCode;
this.StatusString = StatusString;
this.State = State;
this.URI = ParticipantURI;
this.AccountName = AccountName;
this.DisplayName = DisplayName;
this.Type = ParticipantType;
}
}
public class ParticipantPropertiesEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly string URI;
public readonly bool IsLocallyMuted;
public readonly bool IsModeratorMuted;
public readonly bool IsSpeaking;
public readonly int Volume;
public readonly float Energy;
public ParticipantPropertiesEventArgs(string SessionHandle, string ParticipantURI,
bool IsLocallyMuted, bool IsModeratorMuted, bool IsSpeaking, int Volume, float Energy)
{
this.SessionHandle = SessionHandle;
this.URI = ParticipantURI;
this.IsLocallyMuted = IsLocallyMuted;
this.IsModeratorMuted = IsModeratorMuted;
this.IsSpeaking = IsSpeaking;
this.Volume = Volume;
this.Energy = Energy;
}
}
public class ParticipantUpdatedEventArgs : EventArgs
{
public readonly string SessionHandle;
public readonly string URI;
public readonly bool IsMuted;
public readonly bool IsSpeaking;
public readonly int Volume;
public readonly float Energy;
public ParticipantUpdatedEventArgs(string sessionHandle, string URI, bool isMuted, bool isSpeaking, int volume, float energy)
{
this.SessionHandle = sessionHandle;
this.URI = URI;
this.IsMuted = isMuted;
this.IsSpeaking = isSpeaking;
this.Volume = volume;
this.Energy = energy;
}
}
public class SessionAddedEventArgs : EventArgs
{
public readonly string SessionGroupHandle;
public readonly string SessionHandle;
public readonly string URI;
public readonly bool IsChannel;
public readonly bool IsIncoming;
public SessionAddedEventArgs(string sessionGroupHandle, string sessionHandle,
string URI, bool isChannel, bool isIncoming)
{
this.SessionGroupHandle = sessionGroupHandle;
this.SessionHandle = sessionHandle;
this.URI = URI;
this.IsChannel = isChannel;
this.IsIncoming = isIncoming;
}
}
public class SessionRemovedEventArgs : EventArgs
{
public readonly string SessionGroupHandle;
public readonly string SessionHandle;
public readonly string URI;
public SessionRemovedEventArgs(
string SessionGroupHandle,
string SessionHandle,
string Uri)
{
this.SessionGroupHandle = SessionGroupHandle;
this.SessionHandle = SessionHandle;
this.URI = Uri;
}
}
public class SessionUpdatedEventArgs : EventArgs
{
public readonly string SessionGroupHandle;
public readonly string SessionHandle;
public readonly string URI;
public readonly bool IsMuted;
public readonly int Volume;
public readonly bool TransmitEnabled;
public readonly bool IsFocused;
public SessionUpdatedEventArgs(string SessionGroupHandle,
string SessionHandle, string URI, bool IsMuted, int Volume,
bool TransmitEnabled, bool IsFocused)
{
this.SessionGroupHandle = SessionGroupHandle;
this.SessionHandle = SessionHandle;
this.URI = URI;
this.IsMuted = IsMuted;
this.Volume = Volume;
this.TransmitEnabled = TransmitEnabled;
this.IsFocused = IsFocused;
}
}
public class SessionGroupAddedEventArgs : EventArgs
{
public readonly string AccountHandle;
public readonly string SessionGroupHandle;
public readonly string Type;
public SessionGroupAddedEventArgs(string acctHandle, string sessionGroupHandle, string type)
{
this.AccountHandle = acctHandle;
this.SessionGroupHandle = sessionGroupHandle;
this.Type = type;
}
}
#endregion Session Event Args
#region Connector Delegates
public class VoiceConnectorEventArgs : VoiceResponseEventArgs
{
private readonly string m_Version;
private readonly string m_ConnectorHandle;
public string Version { get { return m_Version; } }
public string Handle { get { return m_ConnectorHandle; } }
public VoiceConnectorEventArgs(int rcode, int scode, string text, string version, string handle) :
base(ResponseType.ConnectorCreate, rcode, scode, text)
{
m_Version = version;
m_ConnectorHandle = handle;
}
}
#endregion Connector Delegates
#region Aux Event Args
public class VoiceDevicesEventArgs : VoiceResponseEventArgs
{
private readonly string m_CurrentDevice;
private readonly List m_Available;
public string CurrentDevice { get { return m_CurrentDevice; } }
public List Devices { get { return m_Available; } }
public VoiceDevicesEventArgs(ResponseType type, int rcode, int scode, string text, string current, List avail) :
base(type, rcode, scode, text)
{
m_CurrentDevice = current;
m_Available = avail;
}
}
/// Audio Properties Events are sent after audio capture is started. These events are used to display a microphone VU meter
public class AudioPropertiesEventArgs : EventArgs
{
public readonly bool IsMicActive;
public readonly float MicEnergy;
public readonly int MicVolume;
public readonly int SpeakerVolume;
public AudioPropertiesEventArgs(bool MicIsActive, float MicEnergy, int MicVolume, int SpeakerVolume)
{
this.IsMicActive = MicIsActive;
this.MicEnergy = MicEnergy;
this.MicVolume = MicVolume;
this.SpeakerVolume = SpeakerVolume;
}
}
#endregion Aux Event Args
#region Account Event Args
public class VoiceAccountEventArgs : VoiceResponseEventArgs
{
private readonly string m_AccountHandle;
public string AccountHandle { get { return m_AccountHandle; } }
public VoiceAccountEventArgs(int rcode, int scode, string text, string ahandle) :
base(ResponseType.AccountLogin, rcode, scode, text)
{
this.m_AccountHandle = ahandle;
}
}
public class AccountLoginStateChangeEventArgs : EventArgs
{
public readonly string AccountHandle;
public readonly int StatusCode;
public readonly string StatusString;
public readonly LoginState State;
public AccountLoginStateChangeEventArgs(string AccountHandle, int StatusCode, string StatusString, LoginState State)
{
this.AccountHandle = AccountHandle;
this.StatusCode = StatusCode;
this.StatusString = StatusString;
this.State = State;
}
}
#endregion Account Event Args
///
/// Event for most mundane request reposnses.
///
public event EventHandler OnVoiceResponse;
#region Session Events
public event EventHandler OnSessionCreateResponse;
public event EventHandler OnSessionNewEvent;
public event EventHandler OnSessionStateChangeEvent;
public event EventHandler OnSessionParticipantStateChangeEvent;
public event EventHandler OnSessionParticipantPropertiesEvent;
public event EventHandler OnSessionParticipantUpdatedEvent;
public event EventHandler OnSessionParticipantAddedEvent;
public event EventHandler OnSessionParticipantRemovedEvent;
public event EventHandler OnSessionGroupAddedEvent;
public event EventHandler OnSessionAddedEvent;
public event EventHandler OnSessionRemovedEvent;
public event EventHandler OnSessionUpdatedEvent;
public event EventHandler OnSessionMediaEvent;
#endregion Session Events
#region Connector Events
/// Response to Connector.Create request
public event EventHandler OnConnectorCreateResponse;
#endregion Connector Events
#region Aux Events
/// Response to Aux.GetCaptureDevices request
public event EventHandler OnAuxGetCaptureDevicesResponse;
/// Response to Aux.GetRenderDevices request
public event EventHandler OnAuxGetRenderDevicesResponse;
/// Audio Properties Events are sent after audio capture is started.
/// These events are used to display a microphone VU meter
public event EventHandler OnAuxAudioPropertiesEvent;
#endregion Aux Events
#region Account Events
/// Response to Account.Login request
public event EventHandler OnAccountLoginResponse;
/// This event message is sent whenever the login state of the
/// particular Account has transitioned from one value to another
public event EventHandler OnAccountLoginStateChangeEvent;
#endregion Account Events
#region XML Serialization Classes
private XmlSerializer EventSerializer = new XmlSerializer(typeof(VoiceEvent));
private XmlSerializer ResponseSerializer = new XmlSerializer(typeof(VoiceResponse));
[XmlRoot("Event")]
public class VoiceEvent
{
[XmlAttribute("type")]
public string Type;
public string AccountHandle;
public string Application;
public string StatusCode;
public string StatusString;
public string State;
public string SessionHandle;
public string SessionGroupHandle;
public string URI;
public string Uri; // Yes, they send it with both capitalizations
public string IsChannel;
public string IsIncoming;
public string Incoming;
public string IsMuted;
public string Name;
public string AudioMedia;
public string ChannelName;
public string ParticipantUri;
public string AccountName;
public string DisplayName;
public string ParticipantType;
public string IsLocallyMuted;
public string IsModeratorMuted;
public string IsSpeaking;
public string Volume;
public string Energy;
public string MicIsActive;
public string MicEnergy;
public string MicVolume;
public string SpeakerVolume;
public string HasText;
public string HasAudio;
public string HasVideo;
public string Terminated;
public string Reason;
public string TransmitEnabled;
public string IsFocused;
}
[XmlRoot("Response")]
public class VoiceResponse
{
[XmlAttribute("requestId")]
public string RequestId;
[XmlAttribute("action")]
public string Action;
public string ReturnCode;
public VoiceResponseResults Results;
public VoiceInputXml InputXml;
}
public class CaptureDevice
{
public string Device;
}
public class RenderDevice
{
public string Device;
}
public class VoiceResponseResults
{
public string VersionID;
public string StatusCode;
public string StatusString;
public string ConnectorHandle;
public string AccountHandle;
public string SessionHandle;
public List CaptureDevices;
public CaptureDevice CurrentCaptureDevice;
public List RenderDevices;
public RenderDevice CurrentRenderDevice;
}
public class VoiceInputXml
{
public VoiceRequest Request;
}
[XmlRoot("Request")]
public class VoiceRequest
{
[XmlAttribute("requestId")]
public string RequestId;
[XmlAttribute("action")]
public string Action;
public string RenderDeviceSpecifier;
public string CaptureDeviceSpecifier;
public string Duration;
public string Level;
public string ClientName;
public string AccountManagementServer;
public string MinimumPort;
public string MaximumPort;
public VoiceLoggingSettings Logging;
public string ConnectorHandle;
public string Value;
public string AccountName;
public string AccountPassword;
public string AudioSessionAnswerMode;
public string AccountURI;
public string ParticipantPropertyFrequency;
public string EnableBuddiesAndPresence;
public string URI;
public string Name;
public string Password;
public string JoinAudio;
public string JoinText;
public string PasswordHashAlgorithm;
public string SoundFilePath;
public string Loop;
public string SessionHandle;
public string OrientationType;
public VoicePosition SpeakerPosition;
public VoicePosition ListenerPosition;
public string ParticipantURI;
public string Volume;
}
#endregion XML Serialization Classes
}
public class VoicePosition
{
/// Positional vector of the users position
public Vector3d Position;
/// Velocity vector of the position
public Vector3d Velocity;
/// At Orientation (X axis) of the position
public Vector3d AtOrientation;
/// Up Orientation (Y axis) of the position
public Vector3d UpOrientation;
/// Left Orientation (Z axis) of the position
public Vector3d LeftOrientation;
}
}