<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Traysoft.AddTapi</name>
    </assembly>
    <members>
        <member name="T:Traysoft.AddTapi.TapiGeneratedMode">
            <summary>
            Describes the conditions under which digit or tone generation is terminated.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiGeneratedMode.Cancel">
            <summary>
            The digit or tone generation request was canceled by this application, by another application,
            or because the call terminated. This value can also be returned when digit or tone generation
            cannot be completed due to internal failure of the service provider. 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiGeneratedMode.Done">
            <summary>
            The requested number of digits or requested tones have been generated for the requested duration.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiEventArgs">
            <summary>
            Provides data for the AddTapi.NET events.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiEventArgs.Line">
            <summary>
            Gets <see cref="T:Traysoft.AddTapi.TapiLine"/> object associated with the event, if any.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiEventArgs.Call">
            <summary>
            Gets <see cref="T:Traysoft.AddTapi.TapiCall"/> object associated with the event, if any.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiEventHandler">
            <summary>
            Represents the method that will handle AddTapi.NET events.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiErrorEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.TapiError"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiErrorEventArgs.TapiError">
            <summary>
            Gets the TAPI error number. Common TAPI error numbers are listed in <see cref="T:Traysoft.AddTapi.TapiErrors"/> enumeration.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiErrorEventArgs.Message">
            <summary>
            Gets a message that describes the error.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiErrorEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.TapiError"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiErrorEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallInfoEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.CallInfo"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCallInfoEventArgs.CallInfoState">
            <summary>
            Gets the call information item(s) that has changed. Can be one or more of the <see cref="T:Traysoft.AddTapi.TapiCallInfoState"/> flags.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallInfoEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.CallInfo"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiCallInfoEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDeviceSpecificEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecific"/> and <see cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecificFeature"/> events.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificEventArgs.Param1">
            <summary>
            Gets device specific message parameter.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificEventArgs.Param2">
            <summary>
            Gets device specific message parameter.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificEventArgs.Param3">
            <summary>
            Gets device specific message parameter.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDeviceSpecificEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecific"/> and <see cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecificFeature"/> events.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiDeviceSpecificEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDigitDetectedEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.DigitDetected"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDigitDetectedEventArgs.Digit">
            <summary>
            Gets the detected digit.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDigitDetectedEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.DigitDetected"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiDigitDetectedEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiForwardingInfoEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.ForwardingInfo"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiForwardingInfoEventArgs.Address">
            <summary>
            Gets the address for which forwarding information has changed.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiForwardingInfoEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.ForwardingInfo"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiForwardingInfoEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiGeneratedEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.Generated"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiGeneratedEventArgs.Mode">
            <summary>
            Gets the conditions under which digit or tone generation is terminated.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiGeneratedEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.Generated"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiGeneratedEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiLineDeviceStateEventArgs">
            <summary>
            Provides data for the <see cref="E:Traysoft.AddTapi.TapiApp.LineDeviceState"/> event.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStateEventArgs.LineDeviceState">
            <summary>
            Gets the device state changes. Can be one or more of the <see cref="T:Traysoft.AddTapi.TapiLineDeviceState"/> flags.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiLineDeviceStateEventHandler">
            <summary>
            Represents the method that will handle <see cref="E:Traysoft.AddTapi.TapiApp.LineDeviceState"/> event.
            </summary>
            <param name="sender">The source of the event (currently not used by AddTapi.NET).</param>
            <param name="args">An <see cref="T:Traysoft.AddTapi.TapiLineDeviceStateEventArgs"/> that contains event data.</param>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDeviceSpecificExtensionID">
            <summary>
            Describes an extension identifier used to identify device specific extensions for line devices.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.DeviceSpecificExtensionID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificExtensionID.ID0">
            <summary>
            First part of the extension identifier.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificExtensionID.ID1">
            <summary>
            Second part of the extension identifier.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificExtensionID.ID2">
            <summary>
            Third part of the extension identifier.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiDeviceSpecificExtensionID.ID3">
            <summary>
            Fourth part of the extension identifier.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallState">
            <summary>
            Describes the state of a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Unknown">
            <summary>
            The call exists, but its state is currently unknown.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Offering">
            <summary>
            The call is being offered to the station, signaling the arrival of a new call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Dialing">
            <summary>
            The originator is dialing digits on the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Connected">
            <summary>
            The call has been established and the connection is made.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Disconnected">
            <summary>
            The call has been disconnected.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Idle">
            <summary>
            The call has been disconnected and is no longer active. This is the final state of the call before it's destroyed. A call can never transition out of the idle state.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Accepted">
            <summary>
            The call was in the offering state and has been accepted by the called party.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.DialTone">
            <summary>
            The call is receiving a dial tone from the switch, which means that the switch is ready to receive a dialed number.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Proceeding">
            <summary>
            Dialing has completed and the call is proceeding through the switch or telephone network. This occurs after dialing is complete and before the call reaches the dialed party, as indicated by ringback, busy, or answer.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Ringback">
            <summary>
            The station to be called has been reached, and the destination's switch is generating a ring tone back to the originator. A ringback means that the destination address is being alerted to the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.OnHold">
            <summary>
            The call is on hold by the switch. This frees the physical line, which allows another call to use the line.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference">
            <summary>
            The call is currently on hold while it is being added to a conference.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingTransfer">
            <summary>
            The call is currently on hold awaiting transfer to another number. 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallState.Conferenced">
            <summary>
            The call is a member of a conference call and is logically in the connected state.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallPrivilege">
            <summary>
            The TapiCallPrivilege bit-flag constants describe the kinds of access rights or privileges an application may have to the corresponding call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallPrivilege.Unknown">
            <summary>
            The privilege is unknown but can become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallPrivilege.None">
            <summary>
            The application has no privileges to the call. The application should not use the call object. 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallPrivilege.Monitor">
            <summary>
            The application has monitor privileges to the call. These privileges allow the application to monitor state changes and query information and status about the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallPrivilege.Owner">
            <summary>
            The application has owner privileges to the call. These privileges allow the application to manipulate the call in ways that affect the state of the call.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiApp">
            <summary>
            Performs AddTapi.NET initialization/shutdown and manages telephony lines.
            </summary>
            <example>The following code shows how to initialzie and shutdown AddTapi.NET.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            Console.WriteLine("{0} telephony lines", TapiApp.Lines.Count);
            TapiApp.Shutdown();
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Console.WriteLine("{0} telephony lines", TapiApp.Lines.Count)
            TapiApp.Shutdown()
            </code>
            </example>
            <remarks>
            <c>TapiApp</c> is a static class. Methods <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> and <see cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/> are used to initialize and shutdown AddTapi.NET.
            <see cref="P:Traysoft.AddTapi.TapiApp.Lines"/> collection holds a list of telephony line devices installed on the computer.
            <see cref="P:Traysoft.AddTapi.TapiApp.Voices"/> is a list of text-to-speech voices available for text synthesis.
            </remarks>
        </member>
        <member name="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)">
            <summary>
            Initializes AddTapi.NET.
            </summary>
            <param name="applicationName">A string that contains the name of the application.</param>
            <remarks>
            This method initializes AddTapi.NET and registers application name with Windows Telephony service.
            <c>Initialize</c> also populates <see cref="P:Traysoft.AddTapi.TapiApp.Lines"/> and <see cref="P:Traysoft.AddTapi.TapiApp.Voices"/> collections.
            Application must call this method before using any other AddTapi.NET functionality.
            <note class="note">
            This method is not thread safe and should be called on the main thread of the application (UI thread for Windows Forms applications).
            AddTapi.NET captures synchronization context of the thread that calls <c>Initialize</c> and uses captured context to call event handlers on the same thread.
            </note>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The initialization failed because of Telephony API (TAPI) error.</exception>
            <example>The following code shows how to initialize AddTapi.NET.
            <para>C#</para>
            <code>
            try
            {
                // Initialize AddTapi.NET
                TapiApp.Initialize("SampleApplication");
            }
            catch (TapiException exc)
            {
                Console.WriteLine("TAPI error during initialization. {0}", exc.Message);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception during initialization. {0}", exc.Message);
            }
            </code>
            <para>VB.NET</para>
            <code>
            Try
                ' Initialize AddTapi.NET
                TapiApp.Initialize("SampleApplication")
            Catch exc As TapiException
                Console.WriteLine("TAPI error during initialization. {0}", exc.Message)
            Catch exc As Exception
                Console.WriteLine("Exception during initialization. {0}", exc.Message)
            End Try
            </code>
            </example>
        </member>
        <member name="M:Traysoft.AddTapi.TapiApp.Shutdown">
            <summary>
            Shutdowns AddTapi.NET.
            </summary>
            <remarks>
            This method shutdowns AddTapi.NET and terminates application's usage of Windows Telephony system.
            No other AddTapi.NET methods except <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> can be called after <c>Shutdown</c>.
            </remarks>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.TapiError">
            <summary>
            Occurs when Telephony API (TAPI) error is received while performing an asynchronous operation.
            </summary>
            <remarks>
            AddTapi.NET performs some operations asynchronously using background threads. This event is fired when TAPI error occurs during asynchronous operation.
            The application should report such errors to the user.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle TapiError event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.TapiError += OnTapiError;
            ...
            
            void OnTapiError(object sender, TapiErrorEventArgs args)
            {
                // Display the error message
                Console.WriteLine(args.Message);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.TapiError, AddressOf OnTapiError
            ...
            
            Private Sub OnTapiError(ByVal sender As Object, ByVal args As TapiErrorEventArgs)
                ' Display the error message
                Console.WriteLine(args.Message)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.LineAdded">
            <summary>
            Occurs when a new line device is added to the system.
            </summary>
            <remarks>
            This event occurs when a new telephony line device is detected while the application is running, for example, when a USB modem is connected to the system.
            New <see cref="T:Traysoft.AddTapi.TapiLine"/> object is added to the <see cref="P:Traysoft.AddTapi.TapiApp.Lines"/> collection before this event is fired.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle LineAdded event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.LineAdded += OnLineAdded;
            ...
            
            void OnLineAdded(object sender, TapiEventArgs args)
            {
                // Display the name of newly added line
                Console.WriteLine("{0} added", args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.LineAdded, AddressOf OnLineAdded
            ...
            
            Private Sub OnLineAdded(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display the name of newly added line
                Console.WriteLine("{0} added", args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.LineRemoved">
            <summary>
            Occurs when existing line device is removed.
            </summary>
            <remarks>
            This event occurs when a telephony line device is removed while the application is running, for example, when a USB modem is disconnected.
            <see cref="T:Traysoft.AddTapi.TapiLine"/> object representing the removed device is removed from the <see cref="P:Traysoft.AddTapi.TapiApp.Lines"/> collection before this event is fired.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle LineRemoved event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.LineRemoved += OnLineRemoved;
            ...
            
            void OnLineRemoved(object sender, TapiEventArgs args)
            {
                // Display the name of the removed line
                Console.WriteLine("{0} has been removed", args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.LineRemoved, AddressOf OnLineRemoved
            ...
            
            Private Sub OnLineRemoved(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display the name of the removed line
                Console.WriteLine("{0} has been removed", args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.LineClosed">
            <summary>
            Occurs when a line is forcibly closed by Windows because of hardware error or configuration changes.
            </summary>
            <remarks>
            This event occurs when a telephony line that the application opened by calling <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> has been forcibly closed by Windows. The common cause is a hardware error or incorrect device driver.
            The application should report this error to the user and try to open the line again at later time.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle LineClosed event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.LineClosed += OnLineClosed;
            ...
            
            void OnLineClosed(object sender, TapiEventArgs args)
            {
                // Display a message to the user
                Console.WriteLine("{0} has been forcibly closed", args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.LineClosed, AddressOf OnLineClosed
            ...
            
            Private Sub OnLineClosed(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display a message to the user
                Console.WriteLine("{0} has been forcibly closed", args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.IncomingCall">
            <summary>
            Occurs when a new incoming call is received.
            </summary>
            <remarks>
            This event occurs when a new incoming call is received on the open line. After a new incoming call is detected,
            AddTapi.NET waits up to 3 seconds for Caller ID information to arrive before firing this event.
            Set <see cref="P:Traysoft.AddTapi.TapiLine.WaitForCallerID"/> property to <c>false</c> if you want AddTapi.NET to fire this event immediately after a new call is detected.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle IncomingCall event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.IncomingCall += OnIncomingCall;
            ...
            
            void OnIncomingCall(object sender, TapiEventArgs args)
            {
                // Display a message to the user
                Console.WriteLine("Incoming call from {0} on line {1}", args.Call.CallerID, args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.IncomingCall, AddressOf OnIncomingCall
            ...
            
            Private Sub OnIncomingCall(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display a message to the user
                Console.WriteLine("Incoming call from {0} on line {1}", args.Call.CallerID, args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.OutgoingCall">
            <summary>
            Occurs when a new outgoing call is detected.
            </summary>
            <remarks>
            This event occurs when a new outgoing call is detected on the open line. Please note that voice modems cannot detect outgoing calls dialed from the attached phone.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle OutgoingCall event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.OutgoingCall += OnOutgoingCall;
            ...
            
            void OnOutgoingCall(object sender, TapiEventArgs args)
            {
                // Display a message to the user
                Console.WriteLine("Outgoing call to {0} on line {1}", args.Call.CalledID, args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.OutgoingCall, AddressOf OnOutgoingCall
            ...
            
            Private Sub OnOutgoingCall(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display a message to the user
                Console.WriteLine("Outgoing call to {0} on line {1}", args.Call.CalledID, args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.CallConnected">
            <summary>
            Occurs when a call has been established and the connection is made.
            </summary>
            <remarks>
            This event occurs when connection to a remote party has been established.
            For incoming calls, this event is fired after the call has been answered.
            For outgoing calls, this event is fired after the call has been answered if the line supports predictive dialing (also called hardware answer detection).
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case this event is fired before outgoing call is actually answered.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle CallConnected event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.CallConnected += OnCallConnected;
            ...
            
            void OnCallConnected(object sender, TapiEventArgs args)
            {
                // Display a message to the user
                Console.WriteLine("Call connected on line {0}", args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.CallConnected, AddressOf OnCallConnected
            ...
            
            Private Sub OnCallConnected(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display a message to the user
                Console.WriteLine("Call connected on line {0}", args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.CallDisconnected">
            <summary>
            Occurs when a call has been disconnected.
            </summary>
            <remarks>
            This event occurs when a call has been disconnected, either by AddTapi.NET, telephony hardware or the remote party.
            This event is fired when remote party hangs up the phone. It might take 10-20 seconds for the telephony hardware to detect that the remote party hung up.
            In addition, this event is also fired when outgoing call cannot be completed because there is no dailtone, a busy signal was detected or if the called party did not answer within the time interval set in <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/> property.
            After <c>CallDisconnected</c> event occurs, another outgoing call can be placed on the same line.
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle CallDisconnected event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.CallDisconnected += OnCallDisconnected;
            ...
            
            void OnCallDisconnected(object sender, TapiEventArgs args)
            {
                // Display a message to the user
                Console.WriteLine("Call disconnected on line {0}", args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.CallDisconnected, AddressOf OnCallDisconnected
            ...
            
            Private Sub OnCallDisconnected(ByVal sender As Object, ByVal args As TapiEventArgs)
                ' Display a message to the user
                Console.WriteLine("Call disconnected on line {0}", args.Line.Name)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.CallState">
            <summary>
            Occurs when the state of a call has changed.
            </summary>
            <remarks>
            <para>
            This event is fired when a telephony service provider reports that the state of a call has changed.
            Use <see cref="P:Traysoft.AddTapi.TapiCall.State"/> property to obtain new state of the call.
            </para>
            <para>
            <c>CallState</c> event can be fired before AddTapi.NET reports a new call using <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> or <see cref="E:Traysoft.AddTapi.TapiApp.OutgoingCall"/> event.
            Most applications do not need to handle <c>CallState</c> event and should use
            <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/>, <see cref="E:Traysoft.AddTapi.TapiApp.OutgoingCall"/>,
            <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> and <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/>
            events instead.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle CallState event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.CallState += OnCallState;
            ...
            
            void OnCallState(object sender, TapiEventArgs args)
            {
                TapiCallState callState = args.Call.State;
                // Display a message to the user
                Console.WriteLine("Call on line {0} transitioned to {1} state", args.Line.Name, callState);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.CallState, AddressOf OnCallState
            ...
            
            Private Sub OnCallState(ByVal sender As Object, ByVal args As TapiEventArgs)
                Dim callState As TapiCallState
                callState = args.Call.State
                ' Display a message to the user
                Console.WriteLine("Call on line {0} transitioned to {1} state", args.Line.Name, callState)
            End Sub
            </code>
            </example>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.CallInfo">
            <summary>
            Occurs when the call information about a call has changed.
            </summary>
            <remarks>
            <para>
            This event is fired when a telephony service provider reports that the call information has changed.
            Use <see cref="P:Traysoft.AddTapi.TapiCallInfoEventArgs.CallInfoState"/> property to find out which call information item(s) has changed.
            </para>
            <para>
            <c>CallInfo</c> event can be fired before AddTapi.NET reports a new call using <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> or <see cref="E:Traysoft.AddTapi.TapiApp.OutgoingCall"/> event.
            Most applications do not need to handle <c>CallInfo</c> event. 
            AddTapi.NET automatically updates <see cref="T:Traysoft.AddTapi.TapiCall"/> object with new call information when needed.
            If the <see cref="P:Traysoft.AddTapi.TapiLine.WaitForCallerID"/> property is set to false,
            the application can use <c>CallInfo</c> event to receive notification when Caller ID information becomes available.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle CallInfo event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.CallInfo += OnCallInfo;
            ...
            
            void OnCallInfo(object sender, TapiCallInfoEventArgs args)
            {
                // Check if caller id is available and display to the user
                if ((args.CallInfoState &amp; TapiCallInfoState.CallerID) != 0)
                {
                   Console.WriteLine("CallerID={0}, CallerIDName={1}", args.Call.CallerID, args.Call.CallerIDName);
                }
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.CallInfo, AddressOf OnCallInfo
            ...
            
            Private Sub OnCallInfo(ByVal sender As Object, ByVal args As TapiCallInfoEventArgs)
                ' Check if caller id is available and display to the user
                If args.CallInfoState And TapiCallInfoState.CallerID Then
                    Console.WriteLine("CallerID={0}, CallerIDName={1}", args.Call.CallerID, args.Call.CallerIDName)
                End If
            End Sub
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiCallInfoState"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.WaitForCallerID"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.DeviceSpecific">
            <summary>
            Notifies the application about device specific events occurring on a line, address, or call.
            </summary>
            <remarks>
            <para>
            <c>DeviceSpecific</c> event is used by a telephony service provider to notify the application
            about device specific events. The application must negotiate device specific extension version
            using <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line
            to receive <c>DeviceSpecific</c> events. The meaning of the event and its parameters
            are device specific. Please refer to the TAPI documentation for the telephony hardware
            to find out about device specific functionality supported by the telephony service provider.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle DeviceSpecific event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.DeviceSpecific += OnDeviceSpecific;
            ...
            
            void OnDeviceSpecific(object sender, TapiDeviceSpecificEventArgs args)
            {
                Console.WriteLine("Device specific event on line {0}", args.Line.Name);
                Console.WriteLine("Param1={0}, Param2={1}, Param3={2}", args.Param1, args.Param2, args.Param3);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.DeviceSpecific, AddressOf OnDeviceSpecific
            ...
            
            Private Sub OnDeviceSpecific(ByVal sender As Object, ByVal args As TapiDeviceSpecificEventArgs)
                Console.WriteLine("Device specific event on line {0}", args.Line.Name)
                Console.WriteLine("Param1={0}, Param2={1}, Param3={2}", args.Param1, args.Param2, args.Param3)
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.DeviceSpecificFeature">
            <summary>
            Notifies the application about device specific events occurring on a line, address, or call.
            </summary>
            <remarks>
            <para>
            <c>DeviceSpecificFeature</c> event is used by a telephony service provider to notify the application
            about device specific events. The application must negotiate device specific extension version
            using <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line
            to receive <c>DeviceSpecificFeature</c> events. The meaning of the event and its parameters
            are device specific. Please refer to the TAPI documentation for the telephony hardware
            to find out about device specific functionality supported by the telephony service provider.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle DeviceSpecificFeature event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.DeviceSpecificFeature += OnDeviceSpecificFeature;
            ...
            
            void OnDeviceSpecificFeature(object sender, TapiDeviceSpecificEventArgs args)
            {
                Console.WriteLine("Device specific feature event on line {0}", args.Line.Name);
                Console.WriteLine("Param1={0}, Param2={1}, Param3={2}", args.Param1, args.Param2, args.Param3);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.DeviceSpecificFeature, AddressOf OnDeviceSpecificFeature
            ...
            
            Private Sub OnDeviceSpecificFeature(ByVal sender As Object, ByVal args As TapiDeviceSpecificEventArgs)
                Console.WriteLine("Device specific feature event on line {0}", args.Line.Name)
                Console.WriteLine("Param1={0}, Param2={1}, Param3={2}", args.Param1, args.Param2, args.Param3)
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecificFeature(System.Object,System.UInt32,System.Type)"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.DigitDetected">
            <summary>
            Notifies the application about DTMF digit detected on a line.
            </summary>
            <remarks>
            <para>
            <c>DigitDetected</c> event is used to notify the application about DTMF digits detected
            during the call. The telephony hardware must support DTMF detection for this event to work.
            <c>DigitDetected</c> event provides alternative asynchronous mechanism for processing
            user input during the call. <see cref="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)"/> and
            <see cref="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)"/> are easier to use synchronous methods that
            your application can use for the same purpose.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle DigitDetected event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.DigitDetected += OnDigitDetected;
            ...
            
            void OnDigitDetected(object sender, TapiDigitDetectedEventArgs args)
            {
                Console.WriteLine("Digit {0} detected on line {1}", args.Digit, args.Line.Name);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.DigitDetected, AddressOf OnDigitDetected
            ...
            
            Private Sub OnDigitDetected(ByVal sender As Object, ByVal args As TapiDigitDetectedEventArgs)
                Console.WriteLine("Digit {0} detected on line {1}", args.Digit, args.Line.Name)
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.ForwardingInfo">
            <summary>
            Occurs when the forwarding status of the address has changed.
            </summary>
            <remarks>
            <para>
            <c>ForwardingInfo</c> event is fired when a telephony service provider reports that the forwarding
            status of the address has changed, including possibly the number of rings for determining
            a no-answer condition. The application should call <see cref="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo"/>
            to determine details about the address's current forwarding status.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo"/>
            <seealso cref="P:Traysoft.AddTapi.TapiAddress.ForwardModes"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.ReInit">
            <summary>
            Notifies the application that TAPI system has requested re-initialization.
            </summary>
            <remarks>
            <para>
            <c>ReInit</c> event is fired when a line device configuration has changed, and the application should
            re-initialize its use of TAPI to become aware of these changes. Upon receiving this event, the application
            should call <see cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/> followed by <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> as soon as possible.
            </para>
            <para>
            After <c>ReInit</c> event is fired, all AddTapi.NET methods will return an error until the application re-initializes TAPI.
            After re-initialization all references to AddTapi.NET object, including <see cref="T:Traysoft.AddTapi.TapiLine"/>, <see cref="T:Traysoft.AddTapi.TapiAddress"/> and <see cref="T:Traysoft.AddTapi.TapiCall"/>
            objects, will become invalid. After re-initialization the application has to obtain new lines from the <see cref="P:Traysoft.AddTapi.TapiApp.Lines"/> collection
            and call <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> to open the lines again.
            </para>
            <para>
            The application might receive multiple <c>ReInit</c> events. All subsequent <c>ReInit</c> events must be ignored until TAPI is re-initialized
            by calling <see cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/> followed by <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>.
            </para>
            <note class="note">
            The application <b>cannot</b> call <see cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/> and <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> from the <c>ReInit</c>
            event handler. Those methods have to be called on the main thread of the application. The <c>ReInit</c> event handler
            should set a flag that re-initialization is required and exit immediately.
            </note>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.Generated">
            <summary>
            Notifies the application that DTMF digit generation has terminated.
            </summary>
            <remarks>
            <para>
            <c>Generated</c> event is used to notify the application that the current digit or tone generation
            has terminated. Only one such generation request can be in progress an a given call at any time.
            This event is also fired when digit or tone generation is canceled.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle Generated event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.Generated += OnGenerated;
            ...
            
            void OnGenerated(object sender, TapiGeneratedEventArgs args)
            {
                Console.WriteLine("Digit generation terminated on line {0}: {1}", args.Line.Name, args.Mode);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.Generated, AddressOf OnGenerated
            ...
            
            Private Sub OnGenerated(ByVal sender As Object, ByVal args As TapiGeneratedEventArgs)
                Console.WriteLine("Digit generation terminated on line {0}: {1}", args.Line.Name, args.Mode)
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.GenerateDigits(System.String)"/>
        </member>
        <member name="E:Traysoft.AddTapi.TapiApp.LineDeviceState">
            <summary>
            Occurs when the state of a line device has changed.
            </summary>
            <remarks>
            <para>
            This event is fired when a telephony service provider reports that the state of a line device has changed.
            Use <see cref="P:Traysoft.AddTapi.TapiLineDeviceStateEventArgs.LineDeviceState"/> property in your event handler to find out
            which device status item has changed.
            </para>
            <note class="note">
            In Windows Forms and WPF applications AddTapi.NET executes the handler of this event on the main thread of the application (the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>).
            It is safe to access Windows Forms or WPF controls from the event handler without using <c>Invoke</c> mechanism.
            </note>
            </remarks>
            <example>The following code shows how to handle LineDeviceState event.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.LineDeviceState += OnLineDeviceState;
            ...
            
            void OnLineDeviceState(object sender, TapiLineDeviceStateEventArgs args)
            {
                // Notify that the line is ringing
                if ((args.LineDeviceState &amp; TapiLineDeviceState.Ringing) != 0)
                {
                   Console.WriteLine("Ringing on line {0}", args.Line.Name);
                }
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.LineDeviceState, AddressOf OnLineDeviceState
            ...
            
            Private Sub OnLineDeviceState(ByVal sender As Object, ByVal args As TapiLineDeviceStateEventArgs)
                ' Notify that the line is ringing
                If args.LineDeviceState And TapiLineDeviceState.Ringing Then
                    Console.WriteLine("Ringing on line {0}", args.Line.Name)
                End If
            End Sub
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiLineDeviceState"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.DeviceStatus"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiApp.Lines">
            <summary>
            Gets a list of telephony line devices available on the computer.
            </summary>
            <remarks>
            <c>Lines</c> is a collection of <see cref="T:Traysoft.AddTapi.TapiLine"/> objects representing telephony line devices installed on the computer.
            This collection is updated automatically when a new line device is added to the system and when existing device is removed.
            The application can subscribe to <see cref="E:Traysoft.AddTapi.TapiApp.LineAdded"/> and <see cref="E:Traysoft.AddTapi.TapiApp.LineRemoved"/> events to receive notifications when a line device is added or removed.
            </remarks>
            <example>The following code shows how to list line devices installed on the computer.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            foreach(TapiLine line in TapiApp.Lines)
            {
                Console.WriteLine("Line device {0}", line.Name);
            }
            TapiApp.Shutdown();
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            For Each line As TapiLine In TapiApp.Lines
                Console.WriteLine("Line device {0}", line.Name)
            Next
            TapiApp.Shutdown()
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiLine"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.LineAdded"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.LineRemoved"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiApp.Voices">
            <summary>
            Gets a list of text-to-speech voices available on the computer.
            </summary>
            <remarks>
            <c>Voices</c> is a collection of <see cref="T:Traysoft.AddTapi.TapiVoice"/> objects representing text-to-speech (TTS) voices installed on the computer.
            This collection is not updated automatically when a new TTS voice is added to the system.
            The application can call <see cref="M:Traysoft.AddTapi.TapiApp.Shutdown"/> followed by <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> to re-initialize AddTapi.NET and update a list of available TTS voices.
            </remarks>
            <example>The following code shows how to list TTS voices installed on the computer.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            foreach(TapiVoice voice in TapiApp.Voices)
            {
                Console.WriteLine("Voice {0}", voice.Name);
            }
            TapiApp.Shutdown();
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            For Each voice As TapiVoice In TapiApp.Voices
                Console.WriteLine("Voice {0}", voice.Name)
            Next
            TapiApp.Shutdown()
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiVoice"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.SpeechVoice"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiApp.SerialNumber">
            <summary>
            Sets a serial number in a licensed version of AddTapi.NET.
            </summary>
            <remarks>
            If you purchased a license for AddTapi.NET, set <c>SerialNumber</c> property to your
            AddTapi.NET serial number. The application must set the SerialNumber before calling
            <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/>. <c>SerialNumber</c> property is not supported in
            Demo version of AddTapi.NET.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiApp.UseSynchronizationContext">
            <summary>
            Indicates whether AddTapi.NET should use SynchronizationContext when firing events.
            </summary>
            <remarks>
            <para>
            When the application initializes AddTapi.NET, AddTapi.NET acquires <see cref="T:System.Threading.SynchronizationContext"/>
            of the thread that called <see cref="M:Traysoft.AddTapi.TapiApp.Initialize(System.String)"/> method. If <c>UseSynchronizationContext</c>
            property is <c>true</c>, AddTapi.NET uses acquired synchronization context to send events to the application.
            This mechanism ensures that events arrive to the UI thread of the application and the application
            can access UI controls from the event handlers.
            </para>
            <para>
            Set <c>UseSynchronizationContext</c> to <c>false</c> if you want AddTapi.NET to call event handlers
            on a separate thread. In this case the application will need to use its own synchronization
            mechanism to access UI controls from the event handlers.
            </para>
            <para>
            This property has no effect for service applications. Applications that run as Windows service
            do not have synchronization context by default. All event handlers are called on a
            separate thread in service applications.
            </para>
            <para>
            <c>UseSynchronizationContext</c> must be set to <c>false</c> for ASP.NET
            applications. If <c>UseSynchronizationContext</c> is not set to <c>false</c>, AddTapi.NET
            might try to invoke callback on a disposed thread causing exception or crash.
            </para>
            </remarks>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallDirection">
            <summary>
            Describes the direction of a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallDirection.Unknown">
            <summary>
            The direction is currently unknown.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallDirection.Incoming">
            <summary>
            Indicates incoming call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallDirection.Outgoing">
            <summary>
            Indicates outgoing call.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCall">
            <summary>
            Provides information about a call and methods for call flow processing.
            </summary>
            <remarks>
            <para>
            AddTapi.NET creates a <c>TapiCall</c> object for each incoming or outgoing call.
            <c>TapiCall</c> object contains information about a call such as the caller's number,
            and provides methods to play wave files, speak text and obtain digits pressed by a remote party.
            </para>
            <para>
            <c>TapiCall</c> objects are provided to the application in <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> callback, and in
            <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/>, <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> and <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> events.
            In addition, <see cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)"/> method returns <c>TapiCall</c> object created for the outgoing call.
            </para>
            </remarks>
            <example>The following code shows how to obtain TapiCall object in the IncomingCall event handler.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.IncomingCall += OnIncomingCall;
            ...
            
            void OnIncomingCall(object sender, TapiEventArgs args)
            {
                TapiCall call = args.Call;
                // Display caller's number to the user
                Console.WriteLine("Incoming call from {0}", call.CallerID);
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.IncomingCall, AddressOf OnIncomingCall
            ...
            
            Private Sub OnIncomingCall(ByVal sender As Object, ByVal args As TapiEventArgs)
                Dim objCall As TapiCall
                objCall = args.Call
                ' Display caller's number to the user
                Console.WriteLine("Incoming call from {0}", objCall.CallerID)
            End Sub
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiCallHandler"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)">
            <summary>
            Speaks the contents of a text string using text synthesis.
            </summary>
            <param name="text">Text string (possibly containing XML markup) to be synthesized.</param>
            <param name="purgeBeforeSpeak">Indicates whether to purge all pending speak and play requests prior to this speak call.</param>
            <remarks>
            <para>
            <c>Speak</c> method speaks a text using text-to-speech voice selected in <see cref="P:Traysoft.AddTapi.TapiLine.SpeechVoice"/> property.
            <see cref="P:Traysoft.AddTapi.TapiLine.SpeechVolume"/> property sets the volume of the spoken text.
            <see cref="P:Traysoft.AddTapi.TapiLine.SpeechRate"/> sets the rate (speed) of the spoken text.
            </para>
            <para>
            <c>Speak</c> is asynchronous and returns immediately after the speak request is queued.
            AddTapi.NET will speak and play queued <c>Speak</c> and <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/> requests in the same order they were queued.
            Use <see cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/> method to find out if all speak and play requests are completed or to wait until all requests are completed.
            If <c>purgeBeforeSpeak</c> parameter is <c>true</c>, <c>Speak</c> clears the queue and removes all pending speak and play requests prior to this speak call.
            In effect, <c>Speak</c> call with <c>purgeBeforeSpeak</c> set to <c>true</c> stops the currently playing file or text and starts speaking the new text passed in <c>text</c> parameter.
            </para>
            <para>
            If the first character of the string in <c>text</c> parameter is a left-angle-bracket (&lt;),
            the input text will be parsed for XML markup. The application can use any SAPI 5 XML tags supported by the text-to-speech engine you are using.
            Please refer to the <externalLink><linkText>Synthesis Markup </linkText>
            <linkUri>http://msdn.microsoft.com/en-us/library/ms723638.aspx</linkUri></externalLink>
            and <externalLink><linkText>XML TTS Tutorial </linkText>
            <linkUri>http://msdn.microsoft.com/en-us/library/ms717077.aspx</linkUri></externalLink>
            topics in Microsoft Speech API documentation for detailed description of SAPI 5 XML.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Speak(System.String)">
            <summary>
            Speaks the contents of a text string using text synthesis. Pending speak and play requests are not purged.
            </summary>
            <param name="text">Text string (possibly containing XML markup) to be synthesized.</param>
            <remarks>
            <para>
            <c>Speak</c> method speaks a text using text-to-speech voice selected in <see cref="P:Traysoft.AddTapi.TapiLine.SpeechVoice"/> property.
            <see cref="P:Traysoft.AddTapi.TapiLine.SpeechVolume"/> property sets the volume of the spoken text.
            <see cref="P:Traysoft.AddTapi.TapiLine.SpeechRate"/> sets the rate (speed) of the spoken text.
            </para>
            <para>
            <c>Speak</c> is asynchronous and returns immediately after the speak request is queued.
            AddTapi.NET will speak and play queued <c>Speak</c> and <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/> requests in the same order they were queued.
            The text passed to this <c>Speak</c> call will be spoken after all outstaning speak and play requests are completed.
            Use <see cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/> method to find out if all speak and play requests are completed or to wait until all requests are completed.
            If you want to purge all outstanding requests and start to speak the text immediately,
            use <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/> and set <c>purgeBeforeSpeak</c> parameter to <c>true</c>.
            </para>
            <para>
            If the first character of the string in <c>text</c> parameter is a left-angle-bracket (&lt;),
            the input text will be parsed for XML markup. The application can use any SAPI 5 XML tags supported by the text-to-speech engine you are using.
            Please refer to the <externalLink><linkText>Synthesis Markup </linkText>
            <linkUri>http://msdn.microsoft.com/en-us/library/ms723638.aspx</linkUri></externalLink>
            and <externalLink><linkText>XML TTS Tutorial </linkText>
            <linkUri>http://msdn.microsoft.com/en-us/library/ms717077.aspx</linkUri></externalLink>
            topics in Microsoft Speech API documentation for detailed description of SAPI 5 XML.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)">
            <summary>
            Plays a wave file.
            </summary>
            <param name="file">Filename (including path) of the file to be played.</param>
            <param name="purgeBeforePlay">Indicates whether to purge all pending speak and play requests prior to this play call.</param>
            <remarks>
            <para>
            <c>Play</c> method plays a wave file (file with .WAV extension) on the call.
            <c>file</c> parameter should contain a fully-qualified name (including path) of the file to be played.
            AddTapi.NET supports all wave formats that can be played in Windows, including compressed formats for which the codecs are installed.
            For best results we recommend uncompressed 16-bit mono files with 22KHz or higher sampling rate.
            </para>
            <para>
            <c>Play</c> is asynchronous and returns immediately after the play request is queued.
            AddTapi.NET will play and speak queued <c>Play</c> and <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/> requests in the same order they were queued.
            Use <see cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/> method to find out if all speak and play requests are completed or to wait until all requests are completed.
            If <c>purgeBeforeSpeak</c> parameter is <c>true</c>, <c>Play</c> clears the queue and removes all pending speak and play requests prior to this play call.
            In effect, <c>Play</c> call with <c>purgeBeforeSpeak</c> set to <c>true</c> stops the currently playing file or text and starts playing the new file passed in <c>file</c> parameter.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Play(System.String)">
            <summary>
            Plays a wave file. Pending speak and play requests are not purged.
            </summary>
            <param name="file">Filename (including path) of the file to be played.</param>
            <remarks>
            <para>
            <c>Play</c> method plays a wave file (file with .WAV extension) on the call.
            <c>file</c> parameter should contain a fully-qualified name (including path) of the file to be played.
            AddTapi.NET supports all wave formats that can be played in Windows, including compressed formats for which the codecs are installed.
            For best results we recommend uncompressed 16-bit mono files with 22KHz or higher sampling rate.
            </para>
            <para>
            <c>Play</c> is asynchronous and returns immediately after the play request is queued.
            AddTapi.NET will play and speak queued <c>Play</c> and <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/> requests in the same order they were queued.
            The file passed to this <c>Play</c> call will be played after all outstaning speak and play requests are completed.
            Use <see cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/> method to find out if all speak and play requests are completed or to wait until all requests are completed.
            If you want to purge all outstanding requests and start to play the file immediately,
            use <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/> and set <c>purgeBeforeSpeak</c> parameter to <c>true</c>.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.StopPlayback">
            <summary>
            Stops currently playing wave file or text-to-speech.
            </summary>
            <remarks>
            <para>
            <c>StopPlayback</c> stops playback of wave file or text-to-speech and
            purges all pending speak and play requests. Use this method to stop audio output
            before calling <see cref="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)"/> if the telephony hardware
            does not support simultaneous playback and recording.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)">
            <summary>
            Starts recording of call audio.
            </summary>
            <param name="file">Filename (including path) of the file to be recorded.</param>
            <remarks>
            <para>
            This method starts recording of the call audio stream to the specified wave file.
            <c>StartRecording</c> method instructs AddTapi.NET to start recording and returns immediately.
            The application can use other methods such as <see cref="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)"/>
            while recording is in progress. Use <see cref="M:Traysoft.AddTapi.TapiCall.StopRecording"/> to stop recording
            and close the wave file. Wave file specified in the <c>file</c> parameter is not
            accessible until recording is stopped.
            </para>
            <para>
            Please note that some telephony hardware including most voice modems does not support
            simultaneous playback and recording. Use <see cref="M:Traysoft.AddTapi.TapiCall.StopPlayback"/> to stop playback
            before calling <c>StartRecording</c> with such hardware.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.StopRecording"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.StopPlayback"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.StopRecording">
            <summary>
            Stops recording of call audio.
            </summary>
            <remarks>
            <para>
            This method stops recording that was started using <see cref="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)"/>
            and closes the wave file. Wave file specified in the <c>file</c> parameter of the
            <see cref="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)"/> method is not accessible until recording is stopped.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.StartRecording(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Disconnect">
            <summary>
            Disconnects the call.
            </summary>
            <remarks>
            <para>
            Disconnect is an asynchronous operation. <c>Disconnect</c> method requests disconnect and returns immediately.
            The call is disconnected by the telephony hardware within a few second after the <c>Disconnect</c> call.
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> event when the call is actually disconnected.
            </para>
            <para>
            If the call is in the connected state (<see cref="F:Traysoft.AddTapi.TapiCallState.Connected"/>), this method drops the connection and releases the line (equivalent to hanging up the phone).
            If the call is in the dialing state (<see cref="F:Traysoft.AddTapi.TapiCallState.Dialing"/>), this method aborts the dialing and releases the line.
            </para>
            <alert class="caution">
            The application should always call <c>Disconnect</c> before returning from the <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method
            if the call is no longer needed and should be disconnected.
            If <c>Disconnect</c> is not called the line will not be released and will not be available to handle future calls.
            The best way to ensure that the <c>Disconnect</c> is called is to put it into the <c>finally</c> block.
            Please refer to the following code snapshot and AddTapi.NET samples for details.
            </alert>
            </remarks>
            <example>The following code shows how to use Disconnect method in the TapiCallHandler.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(true, CallHandler);
            line.RingsToAnswer = 1;
            ...
            
            // This method will be called when incoming call is answered
            private void CallHandler(TapiCall call)
            {
                try
                {
                    call.Play("message.wav");
                    call.WaitUntilDone(60);
                }
                catch (TapiDisconnectException)
                {
                    // Remote party hung up
                }
                catch (Exception exc)
                {
                    // An error occurred
                }
                finally
                {
                    // Disconnect the call to clear up the line
                    call.Disconnect();
                }
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(True, AddressOf CallHandler)
            objLine.RingsToAnswer = 1;
            ...
            
            ' This method will be called when incoming call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                Try
                    objCall.Play("message.wav")
                    objCall.WaitUntilDone(60)
                Catch exc As TapiDisconnectException
                    ' Remote party hung up
                Catch exc As Exception
                    ' An error occurred
                Finally
                    ' Disconnect the call to clear up the line
                    objCall.Disconnect()
                End Try
            End Sub
            </code>
            </example>
            <seealso cref="T:Traysoft.AddTapi.TapiCallHandler"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Answer">
            <summary>
            Answers incoming call. 
            </summary>
            <remarks>
            <para>
            AddTapi.NET answers all incoming calls automatically if <see cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/> is greater than zero.
            The application can set <see cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/> to zero and use <c>Answer</c>
            method if it needs to answer specific calls instead of all calls.
            </para>
            <para>
            <c>Answer</c> is an asynchronous operation. <c>Answer</c> method requests the call to be answered and returns immediately.
            Telephony hardware will answer the call within a few seconds after the <c>Answer</c> call.
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> event and executes <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> passed to <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            when the call is answered and connection is established.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not answered because a TAPI error occurred.</exception>
            <example>The following code shows how to use Answer method to answer calls from a specific number. The error handling was omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiApp.IncomingCall += OnIncomingCall;
            TapiLine line = TapiApp.Lines[0];
            line.Open(true, CallHandler);
            line.RingsToAnswer = 0;
            ...
            
            void OnIncomingCall(object sender, TapiEventArgs args)
            {
                TapiCall call = args.Call;
                // Answer calls from 555-123-4567
                if (call.CallerID == "5551234567")
                {
                    call.Answer();
                }
            }
            
            // This method will be called when incoming call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            AddHandler TapiApp.IncomingCall, AddressOf OnIncomingCall
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(True, AddressOf CallHandler)
            objLine.RingsToAnswer = 0;
            ...
            
            Private Sub OnIncomingCall(ByVal sender As Object, ByVal args As TapiEventArgs)
                Dim objCall As TapiCall
                objCall = args.Call
                ' Answer calls from 555-123-4567
                If objCall.CallerID = "5551234567" Then
                    objCall.Answer()
                End If
            End Sub
            
            ' This method will be called when incoming call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Accept">
            <summary>
            Accepts offered call.
            </summary>
            <remarks>
            <para>
            On some telephony systems incoming calls are first offered on one or more lines (phone extensions).
            For some small amount of time, the application may have the option to reject
            the call using <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/>, redirect the call to another extension using
            <see cref="M:Traysoft.AddTapi.TapiCall.Redirect(System.String)"/>, or accept the call using <c>Accept</c>.
            After a call has been successfully accepted by an application,
            alerting begins at the extension that accepted the call.
            </para>
            <para>
            Please note that <c>Accept</c> is an asynchronous operation. <c>Accept</c> method instructs
            telephony system to accept the call. When telephony system finishes accepting the call, 
            the state of the call changes to <c>TapiCallState.Accepted</c>
            and <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/> event is fired.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not accepted because a TAPI error occurred.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Transfer(System.String)">
            <summary>
            Performs a blind or single-step transfer of the call.
            </summary>
            <param name="number">Number where the call is to be transferred to. The number uses the standard dialable number format.</param>
            <remarks>
            <para>
            The telephony hardware must support "blind transer" or "one-step transfer" function in order for <c>Transfer</c> method to work.
            Please note that voice modems do not support this function. The application can use
            <see cref="M:Traysoft.AddTapi.TapiCall.GenerateDigits(System.String)"/> method to generate a sequence of DTMF digits that will instruct the switch to perform a transfer.
            </para>
            <para>
            Please note that some telephony hardware requires a call to be in the connected state before transferring the call.
            You can instruct AddTapi.NET to automatically answer incoming calls by setting <see cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/> to 1 and
            perfom a transfer using <c>Transfer</c> in your <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not transfered because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Redirect(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Redirect(System.String)">
            <summary>
            Redirects the call to the specified destination number.
            </summary>
            <param name="number">Number where the call is to be redirected to. The number uses the standard dialable number format.</param>
            <remarks>
            <para>
            The telephony hardware must support "redirect" function in order for <c>Redirect</c> method to work.
            Voice modems do not support this function.
            </para>
            <para>
            Please note that some telephony hardware requires a call to be in the accepted state before redirecting the call.
            Use <see cref="M:Traysoft.AddTapi.TapiCall.Accept"/> to accept incoming call, then use <c>Redirect</c>
            in the <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/> event handler to redirect the call after call state changes to <c>TapiCallState.Accepted</c>.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not redirected because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Transfer(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Dial(System.String)">
            <summary>
            Dials the specified number on the existing call.
            </summary>
            <param name="number">Number to dial. The number uses the standard dialable number format.</param>
            <remarks>
            <para>
            The <c>Dial</c> method is used for dialing on an existing call. For example, after a call has been
            set up for transfer or conference, a consultation call is automatically created, and the
            <c>TapiCall.Dial</c> method would be used to perform the dialing of this consultation call.
            The <c>TapiCall.Dial</c> method can be invoked multiple times in the course of multistage dialing,
            if the hardware allows it.
            </para>
            <para>
            The <c>TapiCall.Dial</c> method can also be used in partial dialing. To initiate a call using partial dialing,
            the application calls <see>TapiLine.Dial(string,bool)</see> and specifies a partial dialing string.
            A partial dial string is any dial string terminated by a semicolon. The call will typically transition
            to <see>TapiCallState.Dialing</see> after which <c>TapiCall.Dial</c> can be called to specify more
            dialing strings, each terminated by a semicolon. Dialing is completed by calling <c>TapiCall.Dial</c>
            with a dial string that is not terminated with a semicolon (such as an empty string). This technique
            allows applications to perform interactive partial dialing with the user or enable more sophisticated
            dialing.
            </para>
            <alert class="note">
            The <c>TapiCall.Dial</c> method is only available when a call is in <see>TapiCallState.Dialing</see>
            or <see>TapiCallState.Dialtone</see> state. If DTMF is needed while a call is connected, use <see>TapiCall.GenerateDigits</see>.
            </alert>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The number was not dialed because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Park(System.String)">
            <summary>
            Performs directed or nondirected park.
            </summary>
            <param name="number">Number where the call is to be parked when using directed park.
            This paramater should be <c>null</c> (<c>Nothing</c> in Visual Basic) for nondirected park.</param>
            <returns>For nondirected park, the number where the call is parked is returned.</returns>
            <remarks>
            <para>
            With directed park, the application determines the number at which it wants to park the call.
            With nondirected park, the switch determines the number and provides this to the application.
            In either case, a parked call can be unparked using <see cref="M:Traysoft.AddTapi.TapiLine.Unpark(System.String)"/> by specifying this number.
            </para>
            <para>
            The parked call typically enters the idle state after it has been successfully parked,
            and the application should release the reference to the corresponding <see cref="T:Traysoft.AddTapi.TapiCall"/> object.
            When the application performs a <see cref="M:Traysoft.AddTapi.TapiLine.Unpark(System.String)"/> on the parked call,
            a new <see cref="T:Traysoft.AddTapi.TapiCall"/> object is created for the unparked call.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not parked because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Unpark(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.SetupTransfer">
            <summary>
            Initiates a transfer of the call. It establishes a consultation call, on which the destination
            of the transfer can be dialed.
            </summary>
            <returns>Temporary consultation call. When setting up a call for transfer, a consultation call
            is automatically created that enables <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> to dial the number of the
            new transfer destination of the call. The originating party can carry on a conversation over
            this consultation call prior to completing the transfer.
            </returns>
            <remarks>
            <para>
            The setup phase of a transfer establishes a consultation call that enables the application to
            send the number of the destination (the party to be transferred to) to the switch, while the
            call to be transferred is kept on hold. This new call is referred to as a consultation call
            and can be disconnected or otherwise manipulated independently of the original call.
            </para>
            <para>
            When the consultation call has reached the <see cref="F:Traysoft.AddTapi.TapiCallState.DialTone"/> state,
            the application can proceed transferring the call either by dialing the destination 
            number using <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> and tracking the call progress, or by unholding
            an existing call. The transfer of the original call to the selected destination is
            completed using <see cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>.
            </para>
            <para>
            While the consultation call exists, the original call typically transitions to the
            <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingTransfer"/> state. The application may be able
            to toggle between the consultation call and the original call by using
            <see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/>. A consultation call can be canceled using
            <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/> on it. After dropping a consultation call,
            the original call typically transitions back to the connected state. If the call state
            of the original call is <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingTransfer"/>,
            the <see cref="M:Traysoft.AddTapi.TapiCall.Unhold"/> can be used to recover the call. In this case,
            the consultation call is destroyed.
            </para>
            <para>
            The application can also transfer calls in a single step, without having to deal
            with the intervening consultation call, by using <see cref="M:Traysoft.AddTapi.TapiCall.Transfer(System.String)"/>.
            </para>
            </remarks>
            <example>The following code shows how to perform a 2-step or consultation call transfer. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            // Assuming activeCall represents an active call in Connected state
            // The remote party on that call will be transferred to extension 201
            
            // First step: create consultation call and dial ext. 201
            TapiCall consultationCall = activeCall.SetupTransfer();
            System.Threading.Thread.Sleep(500);
            if (consultationCall.State != TapiCallState.DialTone) throw new Exception("Call state is not Dialtone");
            consultationCall.Dial("201");
            // When the state of the consultation call changes to Connected, the user can talk to ext. 201
            // before transferring the remote party to ext. 201
            ...
            // Second step: complete the transfer
            activeCall.CompleteTransfer(consultationCall, false);
            // Now the remote party of the active call can talk to ext. 201
            // The user's line is free to accept new calls
            </code>
            <para>VB.NET</para>
            <code>
            ' Assuming activeCall represents an active call in Connected state
            ' The remote party on that call will be transferred to extension 201
            
            ' First step: create consultation call and dial ext. 201
            Dim consultationCall as TapiCall
            consultationCall = activeCall.SetupTransfer()
            System.Threading.Thread.Sleep(500)
            If consultationCall.State = TapiCallState.DialTone Then
              consultationCall.Dial("201")
            Else
              ' Error, consultation call is not in dialtone state
            EndIf
            ' When the state of the consultation call changes to Connected, the user can talk to ext. 201
            ' before transferring the remote party to ext. 201
            ...
            ' Second step: complete the transfer
            activeCall.CompleteTransfer(consultationCall, False)
            ' Now the remote party of the active call can talk to ext. 201
            ' The user's line is free to accept new calls
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException">Setup transfer failed because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)">
            <summary>
            Completes the transfer of the call to the party connected in the consultation call.
            </summary>
            <param name="consultationCall">
            <see cref="T:Traysoft.AddTapi.TapiCall"/> object that represents a connection with the destination of the transfer.
            Usually this is a call object returned from <see cref="M:Traysoft.AddTapi.TapiCall.SetupTransfer"/>.
            </param>
            <param name="as3WayConference">
            Specifies how the initiated transfer request is to be resolved. If <c>true</c>, the transfer
            is resolved by establishing a three-way conference between the application, the party connected
            to the initial call, and the party connected to the consultation call. A conference call is
            created when this option is selected. If <c>false</c>, the transfer is resolved by
            transferring the initial call to the consultation call. Both calls will become idle
            to the application.
            </param>
            <returns>A newly created conference call if <c>as3WayConference</c> parameter is <c>true</c>,
            <c>null</c> (<c>Nothing</c> in Visual Basic) otherwise.
            </returns>
            <remarks>
            <para>
            This operation completes the transfer of the original call, to the party currently connected
            by <c>consultationCall</c>. The consultation call is typically dialed on the consultation
            call returned from <see cref="M:Traysoft.AddTapi.TapiCall.SetupTransfer"/>, but it can be any call to which
            the switch is capable of transferring the call.
            </para>
            <para>
            The transfer request can be resolved either as a transfer or as a three-way conference call.
            When resolved as a transfer, the parties connected by the call and <c>consultationCall</c>
            are connected to each other, and both this call and <c>consultationCall</c> are typically
            cleared from the application's line and transition to the idle state.
            </para>
            <para>
            When resolved as a conference, all three parties enter into a conference call.
            Both existing calls remain valid but transition to the <see cref="F:Traysoft.AddTapi.TapiCallState.Conferenced"/>
            state. A conference call is created and returned, and it transitions to
            the <see cref="F:Traysoft.AddTapi.TapiCallState.Connected"/> state.
            </para>
            <para>
            The application can also transfer calls in a single step, without having to deal
            with the intervening consultation call, by using <see cref="M:Traysoft.AddTapi.TapiCall.Transfer(System.String)"/>.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The transfer was not completed because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.SetupTransfer"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Hold">
            <summary>
            Places the call on hold.
            </summary>
            <remarks>
            <para>
            The call on hold is temporarily disconnected allowing the application to use the line device
            for making or answering other calls. Use <see cref="M:Traysoft.AddTapi.TapiCall.Unhold"/> to retrieve the held call.
            The telephony hardware must support "hard hold" function
            for <c>Hold</c> method to work. Regular voice modems do not support this function.
            </para>
            <para>
            Please note that <c>Hold</c> is an asynchronous operation. <c>Hold</c> method instructs
            telephony system to put the call on hold. When telephony system finishes putting the call on hold, 
            the state of the call changes to <c>TapiCallState.OnHold</c>
            and <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/> event is fired. If the held party hangs up while on hold,
            the call transitions to the <c>TapiCallState.Disconnected</c> state.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not put on hold because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Unhold"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.Unhold">
            <summary>
            Retrieves the held call.
            </summary>
            <remarks>
            <para>
            Use <c>Unhold</c> method to retrieve a call that was previously put on hold using <see cref="M:Traysoft.AddTapi.TapiCall.Hold"/>.
            When telephony hardware completes unhold operation, retrieved call transitions back to the <c>TapiCallState.Connected</c> state
            and <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/> event is fired. If the held party hangs up while on hold,
            the call transitions to the <c>TapiCallState.Disconnected</c> state.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The held call was not retrieved because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Hold"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)">
            <summary>
            Swaps the active call with the specified call on consultation hold.
            </summary>
            <param name="heldCall">
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/> object representing the call on consultation hold.
            The call state of the <c>heldCall</c> can be <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingTransfer"/>,
            <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference"/>, or <see cref="F:Traysoft.AddTapi.TapiCallState.OnHold"/>.
            </param>
            <remarks>
            <para>
            Swapping the active call with the call on consultation hold allows the application to alternate
            or toggle between these two calls.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The swap hold failed because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.SetupTransfer"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Hold"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.PrepareAddToConference">
            <summary>
            Prepares the conference call for the addition of another party.
            </summary>
            <returns>Newly created consultation call to be added to the conference. Use <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> on that call to dial
            the number of another party that you want to add to the conference.
            </returns>
            <remarks>
            <para>
            The conference call is established either by <see cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/> or <see cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>
            resolved as a 3-way conference. <c>PrepareAddToConference</c> places the existing conference call in the
            <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference"/> state and creates a consultation call that can be added later
            to the existing conference call with <see cref="M:Traysoft.AddTapi.TapiCall.AddToConference(Traysoft.AddTapi.TapiCall)"/>. The consultation call can be canceled
            using <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/>. The application may also be able to swap between the consultation call and the held
            conference call with <see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/>.
            </para>
            <para>
            Some PBXs allow adding arbitrary calls to the conference, and such a call can have been set up using
            <see cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)"/> and be on (hard) hold. <c>PrepareAddToConference</c> is not needed in that case.
            </para>
            </remarks>
            <example>The following code shows how to add another party to a conference. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            // Assuming conferenceCall represents an active conference call in Connected state
            // Consultation call will be created and extension 201 added to the conference
            
            // First step: prepare the conference, create consultation call and dial ext. 201
            TapiCall consultationCall = conferenceCall.PrepareAddToConference();
            System.Threading.Thread.Sleep(500);
            if (consultationCall.State != TapiCallState.DialTone) throw new Exception("Call state is not Dialtone");
            consultationCall.Dial("201");
            // When the state of the consultation call changes to Connected, the user can talk to ext. 201
            // before adding ext. 201 to the conference
            ...
            // Second step: connect consultation call to the conference
            consultationCall.AddToConference(conferenceCall);
            </code>
            <para>VB.NET</para>
            <code>
            ' Assuming conferenceCall represents an active conference call in Connected state
            ' Consultation call will be created and extension 201 added to the conference
            
            ' First step: prepare the conference, create consultation call and dial ext. 201
            Dim consultationCall as TapiCall
            consultationCall = conferenceCall.PrepareAddToConference()
            System.Threading.Thread.Sleep(500)
            If consultationCall.State = TapiCallState.DialTone Then
              consultationCall.Dial("201")
            Else
              ' Error, consultation call is not in dialtone state
            EndIf
            ' When the state of the consultation call changes to Connected, the user can talk to ext. 201
            ' before adding ext. 201 to the conference
            ...
            ' Second step: connect consultation call to the conference
            consultationCall.AddToConference(conferenceCall)
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException">The consultation call was not created because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.AddToConference(Traysoft.AddTapi.TapiCall)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.RemoveFromConference"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.AddToConference(Traysoft.AddTapi.TapiCall)">
            <summary>
            Adds the consultation call to the existing conference.
            </summary>
            <param name="conferenceCall">
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/> object representing the conference call. The call state of the <c>conferenceCall</c>
            must be <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference"/> or <see cref="F:Traysoft.AddTapi.TapiCallState.OnHold"/>.
            </param>
            <remarks>
            <para>
            <c>AddToConference</c> method adds the call represented by this object to the conference call specified by <c>conferenceCall</c>.
            Call state of <c>conferenceCall</c> must be <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference"/> or <see cref="F:Traysoft.AddTapi.TapiCallState.OnHold"/>.
            The state of the call to be added to the conference must be <see cref="F:Traysoft.AddTapi.TapiCallState.Connected"/>, <see cref="F:Traysoft.AddTapi.TapiCallState.OnHold"/>,
            <see cref="F:Traysoft.AddTapi.TapiCallState.Proceeding"/> or <see cref="F:Traysoft.AddTapi.TapiCallState.Ringback"/>. Many PBXs allow calls to be added to conferences
            before they are actually answered.
            </para>
            <para>
            The conference call is established either by <see cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/> or <see cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>
            resolved as a 3-way conference. The call added to a conference is typically established using <see cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/>
            or <see cref="M:Traysoft.AddTapi.TapiCall.PrepareAddToConference"/>. Some PBXs allow adding arbitrary calls to the conference, and such a call
            can have been set up using <see cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)"/> and be on (hard) hold.
            </para>
            <alert class="note">
            All calls that are part of a conference must exist on the same open line.
            </alert>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not added to the conference because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.PrepareAddToConference"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.RemoveFromConference"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.RemoveFromConference">
            <summary>
            Removes the call from the conference.
            </summary>
            <remarks>
            <para>
            Use <c>RemoveFromConference</c> method to remove the call from the conference call to which it currently belongs.
            The remaining calls in the conference call are unaffected. The availability of this operation and its result are
            likely to be limited in many PBXs. For example, in many cases, only the most recently added party can be removed
            from a conference, and the removed call can be automatically dropped.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not removed from the conference because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.AddToConference(Traysoft.AddTapi.TapiCall)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.WaitUntilDone(System.Int32)">
            <summary>
            Waits until either all pending speak and play requests have completed or the specified time interval has elapsed.
            </summary>
            <param name="timeoutSeconds">Timeout period in seconds.</param>
            <returns><c>True</c> if all pending speak and play requests completed withing the specified time interval.</returns>
            <remarks>
            When the application calls <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/> or <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String,System.Boolean)"/>,
            speak and play requests are added to the queue. AddTapi.NET plays and speaks queued play and speak requests in the same order they were queued.
            The application can use <c>WaitUntilDone</c> method to wait until all pending speak and play requests have completed.
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been disconnected while waiting for speak and play requests to be completed.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)">
            <summary>
            Waits until either a DTMF digit has been detected or the specified time interval has elapsed.
            </summary>
            <param name="timeoutSeconds">Timeout period in seconds. Negative value means that the timeout
            should start after playback initiated by the <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/> or
            <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/> is completed.</param>
            <returns>
            A string that contains detected digit, if any. This method returns a <c>null</c> 
            reference (<c>Nothing</c> in Visual Basic) if no digits were detected within
            the specified time interval.
            </returns>
            <remarks>
            This method detects DTMF digits (buttons) pressed by the remote party on a touch-tone phone.
            When zero timeout is specified, <c>WaitForDigit</c> returns a digit received since the last
            call to <c>WaitForDigit</c> or <see cref="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)"/> or since the beginning
            of the call, if any. With non-zero timeout <c>WaitForDigit</c> ignores the digits received
            before the application called this method.
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been disconnected while waiting for a digit.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.WaitForSilence(System.Int32,System.Int32)">
            <summary>
            Waits until either a period of silence has been detected or the specified time interval has elapsed.
            </summary>
            <param name="silenceDurationMilliseconds">Duration of time during which the silence should be present before a detection is made, in milliseconds.</param>
            <param name="timeoutSeconds">Timeout period in seconds.</param>
            <returns>This method returns <c>true</c> if the silence was detected or <c>false</c> if the silence was not detected within the specified time interval.</returns>
            <remarks>
            <para>
            <c>WaitForSilence</c> detects a specified period of silence on the call.
            This method can be useful if the application makes outgoing calls
            and needs to wait until the end of answering machine greetings before playing a message.
            </para>
            <para>
            Please note that the telephony hardware must support hardware silence detection for this method to work.
            Regular voice modems do not support silence detection.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been disconnected while waiting for silence.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)">
            <summary>
            Gathers one or more DTMF digits on the call.
            </summary>
            <param name="numDigits">The number of digits to be collected.</param>
            <param name="terminationDigits">A string of termination digits as text characters. If one of the digits in the string is detected, that termination digit is appended to the buffer, digit collection is terminated, and the buffer is returned to the application.</param>
            <param name="firstDigitTimeoutSeconds">Time duration in seconds in which the first digit is expected. Negative value means that the timeout
            should start after playback initiated by <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/> or <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/> is completed.
            If the first digit is not received in this timeframe, digit collection is terminated and <c>null</c> reference (<c>Nothing</c> in Visual Basic) is returned to the application.</param>
            <param name="interDigitTimeoutSeconds">Maximum time duration in seconds between consecutive digits. If no digit is received in this timeframe, digit collection is terminated and the digits collected up to this point are returned to the application.</param>
            <returns>A string that contains gathered digits. The returned string contains detected termination digit, if any. If the first digit was not received within <c>firstDigitTimeoutSeconds</c> seconds, this method returns <c>null</c> reference (<c>Nothing</c> in Visual Basic).</returns>
            <remarks>
            This method gathers DTMF digits (buttons) pressed by remote party on a touch-tone phone.
            The application can use this method to gather a fixed number of digits or to gather a variable number of digits followed by a termination digit.
            For example, if the application expects the caller to enter an 8-digit account number,
            set <c>numDigits</c> parameter to 8 and <c>terminationDigits</c> to <c>null</c> (<c>Nothing</c> in Visual Basic).
            In this case <c>GatherDigits</c> will terminate when the caller enters exactly 8 digits (or when one of the timeouts expires).
            If the application expects a pin code that has 4 to 6 digits followed by the # key,
            set <c>numDigits</c> to 7 (6 digits for a pin code plus # key) and <c>terminationDigits</c> to "#".
            In this case <c>GatherDigits</c> will terminate when the caller presses the # key or enters 7 digits (or when one of the timeouts expires).
            The application can check returned string to determine how many digits where entered.
            Please note that <c>GatherDigits</c> ignores the digits received before the application called this method.
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been disconnected while waiting for a digit.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.GenerateDigits(System.String)">
            <summary>
            Initiates the generation of the specified digits on the call.
            </summary>
            <param name="digits">A string that contains the digits to be generated.</param>
            <remarks>
            <para>
            This method generates the specified digits as inband tones using DTMF signaling.
            Valid digits are 0 through 9, '*', '#', 'A', 'B', 'C', and 'D'.
            In addition, the comma (,) is also a valid character. A comma injects an extra delay between the signaling of the previous and next digits it separates. The duration of this pause is hardware dependent (usually 500 ms). Multiple commas can be used to inject longer pauses.
            The exclamation (!) is a valid character. This character causes a "hookflash" operation (one-half second onhook, followed by one-half second offhook before continuing).
            The application can use <c>GenerateDigits</c> to perform call transfer by generating a sequence of digits that instructs the PBX to transfer a call.
            </para>
            <para>
            Please note that <c>GenerateDigits</c> is an asynchronous operation. <c>GenerateDigits</c> queues the digits to generate and returns immediately.
            The telephony hardware will start digit generation after the method returns. After all digits have been generated,
            or after digit generation has been aborted or canceled, a <see cref="E:Traysoft.AddTapi.TapiApp.Generated"/> event is fired.
            </para>
            <para>
            Only one inband generation request (tone generation or digit generation) is allowed to be in progress per call across all
            applications that are owners of the call. Digit generation on a call is canceled by initiating either another digit generation request or a tone generation request.
            To cancel the current digit generation, the application can call <c>GenerateDigits</c> and specify <c>null</c> (<c>Nothing</c> in Visual Basic for the <c>digits</c> parameter.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <exception cref="T:Traysoft.AddTapi.TapiException">AddTapi.NET cannot generate the digits because a TAPI error occurred.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiCall.GetCommHandle">
            <summary>
            Obtains a handle of the open communication port associated with the call.
            </summary>
            <returns>
            <c>IntPtr</c> that incapsulates a Win32 handle of the open communication port.
            </returns>
            <remarks>
            <para>
            <c>GetCommHandle</c> obtains a handle of the open communication port of the data modem.
            Returned handle can be used to transfer data between the application and the remote terminal.
            The telephony service provider opens the port in overlapped I/O mode and configures the port using the settings specified in the Control Panel.
            The application can set additional configuration options for the device by using communications functions with the returned handle.
            </para>
            <para>
            The application assumes ownership of the returned handle. The handle must be closed using
            CloseHandle Win32 function before the call is disconnected (before calling <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/>).
            We recommend using <see cref="T:Microsoft.Win32.SafeHandles.SafeFileHandle">SafeFileHandle</see> wrapper
            to manage the returned handle.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiDisconnectException">The call has been already disconnected.</exception>
            <exception cref="T:Traysoft.AddTapi.TapiException">AddTapi.NET cannot obtain a handle because a TAPI error occurred.</exception>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Line">
            <summary cref="T:Traysoft.AddTapi.TapiLine">
            Gets a TapiLine that the call is associated with.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Address">
            <summary cref="T:Traysoft.AddTapi.TapiAddress">
            Gets a TapiAddress that received the call.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Direction">
            <summary>
            Gets a direction of the call (incoming or outgoing).
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.CallerID">
            <summary>
            Gets the caller's ID (phone number), if available.
            </summary>
            <value>
            A string containing the caller, or originator, party identifier information.
            Contains "Unavail" if the telephony system reports that the party identifier information is not available and will not become available later.
            </value>
            <remarks>
            After a new incoming call is detected, AddTapi.NET waits up to 3 seconds for Caller ID information
            to arrive before reporting or answering new incoming call.
            Set <see cref="P:Traysoft.AddTapi.TapiLine.WaitForCallerID"/> property to <c>false</c> if you do not want AddTapi.NET to wait for Caller ID and process new incoming calls immediately.
            In this case <c>CallerID</c> property may contain <c>null</c> reference (<c>Nothing</c> in Visual Basic) when an <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> event is fired.
            Caller's ID might become available a few seconds later and the <c>CallerID</c> property will change its value to the received caller's ID.
            Please note that some voice modems do not support Caller ID.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.CallerIDName">
            <summary>
            Gets the caller's name, if available.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.CallerID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.CalledID">
            <summary>
            Gets the called party's ID (phone number), if available.
            </summary>
            <value>
            A string containing the called-party identifier information.
            The called party corresponds to the originally addressed party.
            Contains "Unavail" if the telephony system reports that the party identifier information is not available and will not become available later.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.CalledIDName">
            <summary>
            Gets the called party's name, if available.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.CalledID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.ConnectedID">
            <summary>
            Gets the connected party's ID (phone number), if available.
            </summary>
            <value>
            A string containing the connected party identifier information.
            The connected party is the party that was actually connected to. This may be different from the called-party ID if the call was diverted.
            Contains "Unavail" if the telephony system reports that the party identifier information is not available and will not become available later.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.ConnectedIDName">
            <summary>
            Gets the connected party's name, if available.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.ConnectedID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.RedirectionID">
            <summary>
            Gets the redirection party's ID (phone number), if available.
            </summary>
            <value>
            A string containing the redirection party identifier information.
            The redirection party identifies the number to which the call was redirected.
            Contains "Unavail" if the telephony system reports that the party identifier information is not available and will not become available later.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.RedirectionIDName">
            <summary>
            Gets the redirection party's name, if available.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.RedirectionID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.RedirectingID">
            <summary>
            Gets the redirecting party's ID (phone number), if available.
            </summary>
            <value>
            A string containing the redirecting party identifier information.
            The redirecting party identifies the number which redirects the call.
            Contains "Unavail" if the telephony system reports that the party identifier information is not available and will not become available later.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.RedirectingIDName">
            <summary>
            Gets the redirecting party's name, if available.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.RedirectingID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Display">
            <summary>
            Gets the telephony system-specific call display information, if available.
            </summary>
            <value>
            A string containing call display information provided by the telephony system.
            Some telephony service providers supply additional call information in Display field.
            Most telephony systems do not use this field.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.State">
            <summary>
            Gets the state of the call.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.DisconnectMode">
            <summary>
            Gets the disconnect mode (reason) for the disconnected call.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Tag">
            <summary>
            Gets or sets the object that contains supplemental data about the call.
            </summary>
            <value>
            An Object that contains data about the call. The default is a null reference (<c>Nothing</c> in Visual Basic).
            </value>
            <remarks>
            Any type derived from the <c>Object</c> class can be assigned to this property.
            The application can use <c>Tag</c> property to store data closely associated with the call or the caller for easy access in all call-related events.
            For example, it can store caller's account number in the <c>Tag</c> property so the account information can be accessed quickly.
            AddTapi.NET does not use this property internally. This property provides a place for the application to store its own data.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Guid">
            <summary>
            Gets the globally unique identifier (GUID) of the call.
            </summary>
            <value>
            An unique identifier assigned by AddTapi.NET to the call.
            </value>
            <remarks>
            AddTapi.NET assigns an unique identifier to each call.
            The application can use <c>Guid</c> property to keep track of the call through all call-related events
            or to store call information in a database.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Reason">
            <summary>
            Gets the reason for the call.
            </summary>
            <value>
            One of the <see cref="T:Traysoft.AddTapi.TapiCallReason"/> constants describing the reason why the call occured.
            </value>
            <remarks>
            Please note that some telephony service providers do not report the reason for the call.
            The <c>Reason</c> property is <c>TapiCallReason.Unavail</c> in this case.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Origin">
            <summary>
            Gets the origin of the call.
            </summary>
            <value>
            One of the <see cref="T:Traysoft.AddTapi.TapiCallOrigin"/> constants describing the origin of the call.
            </value>
            <remarks>
            Please note that some telephony service providers do not report the origin of the call.
            The <c>Origin</c> property is <c>TapiCallOrigin.Unavail</c> in this case.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.CallID">
            <summary>
            Gets a numeric identifier (sequence number) of the call.
            </summary>
            <value>A numeric identifier assigned by the telephony system to this call.</value>
            <remarks>
            Some telephony systems can assign a unique identifier to each call.
            This allows the call to be tracked across transfers, redirects, or other events.
            If this feature is not supported, the <c>CallID</c> property is zero for all calls.
            </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.RelatedCallID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.RelatedCallID">
            <summary>
            Gets a numeric identifier (sequence number) of the related call.
            </summary>
            <value>A numeric identifier assigned by the telephony system to the related call.</value>
            <remarks>
            Telephony systems that use the call ID often may find it necessary to relate
            one call to another. <c>RelatedCallID</c> may be used by the telephony service
            provider for this purpose.
            </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiCall.CallID"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Privilege">
            <summary>
            Gets access rights or privileges an application may have to the corresponding call.
            </summary>
            <value><see cref="T:Traysoft.AddTapi.TapiCallPrivilege"/> bit-flags describing call privileges of the application.</value>
            <remarks>
            When a new call is first provided to an application, <c>Privilege</c> property contains initial privileges that the application has for the call.
            Whenever privileges of the application are modified, the <see>TapiApp.CallState</see> event is sent to the application.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.Trunk">
            <summary>
            Gets the number of the trunk over which the call is routed.
            </summary>
            <value>A number identifying the trunk over which the call is routed. -1 if unknown.</value>
            <remarks>
            The application can use <c>Trunk</c> property to find out which trunk the call is routed over.
            This property is used for both incoming and outgoing calls. <c>Trunk</c> property is set to -1
            if the trunk is unknown.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiCall.DeviceSpecificInfo">
            <summary>
            Gets device specific information about the call.
            </summary>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecificInfo</c> property allows the application to retrieve device specific information about the call.
            The information provided in <c>DeviceSpecificInfo</c> property is described in TAPI documentation for the telephony hardware.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use device specific functionality.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
        </member>
        <member name="T:Traysoft.AddTapi.TapiLineDeviceStatus">
            <summary>
            Represents current status of a line device.
            </summary>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.DeviceStatus"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.NumActiveCalls">
            <summary>
            Number of calls on the line in call states other than Idle, OnHold, OnHoldPendingTransfer, and OnHoldPendingConference.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.NumOnHoldCalls">
            <summary>
            Number of calls on the line in the OnHold state. 
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.NumOnHoldPendingCalls">
            <summary>
            Number of calls on the line in the OnHoldPendingTransfer or OnHoldPendingConference state. 
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.IsConnected">
            <summary>
            Specifies whether the line is connected to TAPI.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.IsInService">
            <summary>
            Indicates whether the line is in service.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.IsMsgWaitOn">
            <summary>
            Indicates whether the line has a message waiting (message light is on).
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLineDeviceStatus.DeviceSpecificInfo">
            <summary>
            Gets device specific information about the status of a line device.
            </summary>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecificInfo</c> property allows the application to retrieve device specific portion of the line device status.
            The information provided in <c>DeviceSpecificInfo</c> property is described in TAPI documentation for the telephony hardware.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use device specific functionality.
            </para>
            <para>
            Avaya IP Office system uses this property to provide additional information about the line/extension,
            including call forwarding/DND information, number of read/new voicemail messages, user login information and more.
            Please contact us for a code sample that shows how to use this feature of the Avaya IP Office phone system.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
        </member>
        <member name="T:Traysoft.AddTapi.TapiForwardMode">
            <summary>
            Describes the conditions under which calls can be forwarded.
            </summary>
            <remarks>
            <para>
            The bit flags defined by <c>TapiForwardMode</c> are not independent of each other.
            Unconditional forwarding ignores any specific condition such as busy or no answer.
            If unconditional forwarding is not in effect, then forwarding on busy and on no answer
            can be controlled separately or not separately. If controlled separately, the
            <c>Busy</c> and <c>NoAnswer</c> flags can be used separately. If not controlled separately,
            the <c>BusyNoAnswer</c> flags must be used. Similarly, if forwarding of internal and
            external calls can be controlled separately, then <c>Internal</c> and <c>External</c> flags
            can be used separately; otherwise the combination is used.
            </para>
            <para>
            <see cref="P:Traysoft.AddTapi.TapiAddress.ForwardModes"/> indicates which forwarding modes are available for each address
            assigned to a line.
            </para>
            </remarks>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.Unconditional">
            <summary>
            Forward all calls unconditionally, irrespective of their origin.
            Use this value when unconditional forwarding for internal and external
            calls cannot be controlled separately. Unconditional forwarding overrides
            forwarding on busy and/or no answer conditions.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.UnconditionalInternal">
            <summary>
            Forward all internal calls unconditionally. Use this value when
            unconditional forwarding for internal and external calls can be
            controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.UnconditionalExternal">
            <summary>
            Forward all external calls unconditionally. Use this value when
            unconditional forwarding for internal and external calls can be
            controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.UnconditionalSpecific">
            <summary>
            Unconditionally forward all calls from a specified phone number or extension
            (selective call forwarding).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.Busy">
            <summary>
            Forward all calls on busy, irrespective of their origin. Use this value
            when forwarding for internal and external calls on busy and on no answer
            cannot be controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyInternal">
            <summary>
            Forward all internal calls on busy. Use this value when forwarding for
            internal and external calls on busy and on no answer can be controlled
            separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyExternal">
            <summary>
            Forward all external calls on busy. Use this value when forwarding for
            internal and external calls on busy and on no answer can be controlled
            separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusySpecific">
            <summary>
            Forward on busy all calls from a specified phone number or extension
            (selective call forwarding).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.NoAnswer">
            <summary>
            Forward all calls on no answer, irrespective of their origin. Use this
            value when call forwarding for internal and external calls on no answer
            cannot be controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.NoAnswerInternal">
            <summary>
            Forward all internal calls on no answer. Use this value when forwarding
            for internal and external calls on no answer can be controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.NoAnswerExternal">
            <summary>
            Forward all external calls on no answer. Use this value when forwarding
            for internal and external calls on no answer can be controlled separately.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.NoAnswerSpecific">
            <summary>
            Forward on no answer all calls from a specified phone number or extension
            (selective call forwarding).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyNoAnswer">
            <summary>
            Forward all calls on busy/no answer, irrespective of their origin.
            Use this value when forwarding for internal and external calls on busy
            and on no answer cannot be controlled separately. 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyNoAnswerInternal">
            <summary>
            Forward all internal calls on busy/no answer. Use this value when call
            forwarding on busy and on no answer cannot be controlled separately for
            internal calls. 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyNoAnswerExternal">
            <summary>
            Forward all external calls on busy/no answer. Use this value when call
            forwarding on busy and on no answer cannot be controlled separately for
            internal calls.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.BusyNoAnswerSpecific">
            <summary>
            Forward on busy/no answer all calls from a specified phone number or extension
            (selective call forwarding). 
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.Unknown">
            <summary>
            Calls are forwarded, but the conditions under which forwarding will occur
            are not known at this time. It is possible that the conditions may become
            known at a future time.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.Unavailable">
            <summary>
            Calls are forwarded, but the conditions under which forwarding will occur
            are not known, and will never be known by the service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiForwardMode.All">
            <summary>
            A mask that includes all forward modes.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiMediaMode">
            <summary>
            Describes media types (or modes) of a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.Default">
            <summary>
            AddTapi.NET will select media mode based on capabilities of telephony hardware.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.Unknown">
            <summary>
            Media mode is not currently known and may become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.InteractiveVoice">
            <summary>
            A voice call, and the call is handled as an interactive voice call with humans on both ends.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.AutomatedVoice">
            <summary>
            A voice call, and the call is locally handled by an automated application.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.DataModem">
            <summary>
            A data modem session on the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiMediaMode.All">
            <summary>
            A mask that includes all media modes.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiForwardEntry">
            <summary>
            Describes an entry of the forwarding instructions.
            </summary>
            <seealso cref="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiForwardEntry.#ctor(Traysoft.AddTapi.TapiForwardMode,System.String,System.String)">
            <summary>
            Initializes a new instance of the <c>TapiForwardEntry</c> class with the specified forward mode, destination number and caller number.
            </summary>
            <param name="forwardMode">Type of forwarding.</param>
            <param name="destinationNumber">The destination number where calls are to be forwarded.</param>
            <param name="callerNumber">The number of a caller to be forwarded. Applicable only for selective call forwarding modes.</param>
            <remarks>
            This method creates a <c>TapiForwardEntry</c> object representing one entry in the list of forwarding instructions
            for <see cref="M:Traysoft.AddTapi.TapiLine.SetupForwarding(System.Collections.Generic.IEnumerable{Traysoft.AddTapi.TapiForwardEntry},System.Int32,Traysoft.AddTapi.TapiAddress)"/>.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiForwardEntry.ForwardMode">
            <summary>
            Types of forwarding.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiForwardEntry.DestinationNumber">
            <summary>
            The destination number where calls are to be forwarded.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiForwardEntry.CallerNumber">
            <summary>
            The number of a caller to be forwarded. 
            Applicable only for selective call forwarding modes.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallOrigin">
            <summary>
            Describes the origin of a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Outbound">
            <summary>
            The call originated from this station as an outgoing call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Internal">
            <summary>
            The call originated as an incoming call at a station internal to the same switching environment.
            For example, a call from one extension to another on the same PBX.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.External">
            <summary>
            The call originated as an incoming call on an external line.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Unknown">
            <summary>
            The call origin is currently unknown but may become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Unavail">
            <summary>
            The call origin is not available and will never become known for this call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Conference">
            <summary>
            The call is a conference call, that is, it is the application's connection to the conference bridge in the switch.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallOrigin.Inbound">
            <summary>
            The call originated as an incoming call, but the service provider is unable to determine whether it came from another station on the same switch or from an external line.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiAudioFormat">
            <summary>
            Describes audio formats for audio input/output.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.Default">
            <summary>
            AddTapi.NET will automatically select audio format supported by the telephony hardware.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_16kHz16BitMono">
            <summary>
            16000 Hz 16 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_12kHz16BitMono">
            <summary>
            12000 Hz 16 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_11kHz16BitMono">
            <summary>
            11025 Hz 16 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_8kHz16BitMono">
            <summary>
            8000 Hz 16 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_16kHz8BitMono">
            <summary>
            16000 Hz 8 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_12kHz8BitMono">
            <summary>
            12000 Hz 8 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_11kHz8BitMono">
            <summary>
            11025 Hz 8 bit mono
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiAudioFormat.PCM_8kHz8BitMono">
            <summary>
            8000 Hz 8 bit mono
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiErrors">
            <summary>
            Contains the most common Telephony API (TAPI) error numbers.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.Allocated">
            <summary>
            The line cannot be opened due to a persistent condition, such as that of a serial port being exclusively opened by another process.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.BadDeviceID">
            <summary>
            The specified device identifier or line device identifier is invalid or out of range.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.BearerModeUnavail">
            <summary>
            The bearer mode is invalid, the bearer mode is not available, or the call's bearer mode cannot be changed to the specified bearer mode.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.CallUnavail">
            <summary>
            All call appearances on the specified address are currently in use.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.CompletionOverrun">
            <summary>
            The maximum number of outstanding call completions has been exceeded.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.ConferenceFull">
            <summary>
            The maximum number of parties for a conference has been reached, or the requested number of parties cannot be satisfied.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.DialBilling">
            <summary>
            The dialable number contains dialing control characters that are not processed by the service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.DialDialTone">
            <summary>
            The dialable number contains dialing control characters that are not processed by the service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.DialPrompt">
            <summary>
            The dialable number contains dialing control characters that are not processed by the service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.DialQuiet">
            <summary>
            The dialable number contains dialing control characters that are not processed by the service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.IncompatibleAPIVersion">
            <summary>
            The application requested a TAPI version or version range that is either incompatible with, or cannot be supported by, the Telephony API implementation and the corresponding service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.IncompatibleExtVersion">
            <summary>
            The application requested an extension version range that is either invalid or cannot be supported by the corresponding service provider.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.IniFileCorrupt">
            <summary>
            The Telephon.ini file cannot be read or understood properly by TAPI because of internal inconsistencies or formatting problems. For example, the [Locations], [Cards], or [Countries] section of the Telephon.ini file may be corrupted or inconsistent.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InUse">
            <summary>
            The line device is in use and cannot currently be configured, allow a party to be added, allow a call to be answered, allow a call to be placed, or allow a call to be transferred.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAddress">
            <summary>
            The specified address (phone number or extension) is either invalid or not allowed. If invalid, the address contains invalid characters or digits, or the destination address contains dialing control characters, W, @, $, or ?, that are not supported by the service provider. If the address is not allowed, the specified address is either not assigned to the specified line or is not valid for address redirection.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAddressID">
            <summary>
            The specified address identifier is either invalid or out of range.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAddressMode">
            <summary>
            The specified address mode is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAddressState">
            <summary>
            The specified address state contains one or more bits that are not LINEADDRESSSTATE.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAppHandle">
            <summary>
            The application handle or the application registration handle is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAppName">
            <summary>
            The specified application name is invalid. The application name should not contain any non-displayable characters, and should be zero-terminated.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalBearerMode">
            <summary>
            The specified bearer mode is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallComplMode">
            <summary>
            The specified completion is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallHandle">
            <summary>
            The specified call handle is not valid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallParams">
            <summary>
            The specified call parameters are invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallPrivilege">
            <summary>
            The specified call privilege parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallSelect">
            <summary>
            The specified select parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallState">
            <summary>
            The current state of a call is not a valid state for the requested operation.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCallStateList">
            <summary>
            The specified call state list is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCard">
            <summary>
            The permanent card identifier could not be found in any entry in the [Cards] section in the registry.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCompletionID">
            <summary>
            The completion identifier is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalConfCallHandle">
            <summary>
            The specified call handle for the conference call is invalid or is not a handle for a conference call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalConsultCallHandle">
            <summary>
            The specified consultation call handle is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalCountryCode">
            <summary>
            The specified country/region code is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDeviceClass">
            <summary>
            The line device has no associated device for the given device class, or the specified line does not support the indicated device class.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDeviceHandle">
            <summary>
            The line device handle is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDialParams">
            <summary>
            The dialing parameters are invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDigitList">
            <summary>
            The specified digit list is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDigitMode">
            <summary>
            The specified digit mode is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalDigits">
            <summary>
            The specified termination digits are not valid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalExtVersion">
            <summary>
            The service provider extension version number is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalGroupID">
            <summary>
            The specified group identifier is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalLineHandle">
            <summary>
            The specified call, device, line device, or line handle is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalLineState">
            <summary>
            The device configuration may not be changed in the current line state.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalLocation">
            <summary>
            The permanent location identifier could not be found in any entry in the [Locations] section in the registry.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalMediaList">
            <summary>
            The specified media list is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalMediaMode">
            <summary>
            The list of media types (modes) to be monitored contains invalid information, the specified media type parameter is invalid, or the service provider does not support the specified media type.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalMessageID">
            <summary>
            The number given in MessageID is outside the range specified by the NumCompletionMessages member.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalParam">
            <summary>
            A parameter or structure that a parameter points to contains invalid information, a country/region code is invalid, or the specified forward list parameter contains invalid information.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalParkID">
            <summary>
            The park identifier is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalParkMode">
            <summary>
            The specified park mode is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalPointer">
            <summary>
            One or more of the specified pointer parameters are invalid, or a required pointer to an output parameter is NULL.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalPrivSelect">
            <summary>
            An invalid flag or combination of flags was set for the Privileges parameter.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalRate">
            <summary>
            The specified rate is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalRequestMode">
            <summary>
            The RequestMode indicator is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalTerminalID">
            <summary>
            The specified terminal identifier is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalTerminalMode">
            <summary>
            The specified terminal modes parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalTimeout">
            <summary>
            Timeouts are not supported or a value falls outside the valid range.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalTone">
            <summary>
            The specified custom tone does not represent a valid tone or is made up of too many frequencies or the specified tone structure does not describe a valid tone.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalToneList">
            <summary>
            The specified tone list is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalToneMode">
            <summary>
            The specified tone mode parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalTransferMode">
            <summary>
            The specified transfer mode parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.LineMapperFailed">
            <summary>
            No lines were found that match the requirements specified in the CallParams parameter.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoConference">
            <summary>
            The specified call is not a conference call handle or a participant call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoDevice">
            <summary>
            The specified device identifier, which was previously valid, is no longer accepted because the associated device has been removed from the system since TAPI was last initialized. Alternately, the line device has no associated device for the given device class.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoDriver">
            <summary>
            Either Tapiaddr.dll could not be located or the telephone service provider for the specified device found that one of its components is missing or corrupt in a way that was not detected at initialization time. The user should be advised to use the Telephony Control Panel to correct the problem.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoMem">
            <summary>
            Insufficient memory to perform the operation, or unable to lock memory.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoRequest">
            <summary>
            There currently is no request pending of the indicated mode, or the application is no longer the highest-priority application for the specified request mode.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NotOwner">
            <summary>
            The application does not have owner privilege to the specified call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NotRegistered">
            <summary>
            The application is not registered as a request recipient for the indicated request mode.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.OperationFailed">
            <summary>
            The operation failed for an unspecified or unknown reason.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.OperationUnavail">
            <summary>
            The operation is not available, such as for the given device or specified line.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.RateUnavail">
            <summary>
            The service provider currently does not have enough bandwidth available for the specified rate.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.ResourceUnavail">
            <summary>
            Insufficient resources to complete the operation. For example, a line cannot be opened due to a dynamic resource overcommitment.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.RequestOverrun">
            <summary>
            More requests are pending than the device can handle.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.StructureTooSmall">
            <summary>
            The TotalSize member of a structure does not specify enough memory to contain the fixed portion of the specified structure.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.TargetNotFound">
            <summary>
            A target for the call handoff was not found.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.TargetSelf">
            <summary>
            The application invoking this operation is the target of the indirect handoff.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.Uninitialized">
            <summary>
            The operation was invoked before TAPI was initialized.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.UserUserInfoTooBig">
            <summary>
            The string containing user-user information is too long.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.ReInit">
            <summary>
            TAPI reinitialization has been requested, all applications should shut down its usage of TAPI.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.AddressBlocked">
            <summary>
            The specified address (phone number or extension) is blocked from being dialed on the specified call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.BillingRejected">
            <summary>
            The billing mode of the call was rejected
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalFeature">
            <summary>
            The requested Feature parameter is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.NoMultipleInstance">
            <summary>
            A telephony service provider that does not support multiple instances is listed more than once in the [Providers] section in the registry. The application should advise the user to use the Telephony Control Panel to remove the duplicated driver.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAgentID">
            <summary>
            The specified agent identifier is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAgentGroup">
            <summary>
            The application referenced an agent group that is not valid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalPassword">
            <summary>
            The application used an invalid password.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAgentState">
            <summary>
            The application referenced an agent state that is not valid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAgentActivity">
            <summary>
            The specified agent activity is not valid
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.DialVoiceDetect">
            <summary>
            Use of the dial modifier (:) is not supported.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.UserCancelled">
            <summary>
            The user cancelled the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAddressType">
            <summary>
            The application referenced an address type that is not valid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.InvalAgentSessionState">
            <summary>
            The agent session state is invalid.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.Disconnected">
            <summary>
            The call has been disconnected.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiErrors.ServiceNotRunning">
            <summary>
            The TAPI service is not running.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallReason">
            <summary>
            Describes the reason for a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Direct">
            <summary>
            This is a direct incoming or outgoing call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.FwdBusy">
            <summary>
            This call was forwarded from another extension that was busy at the time of the call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.FwdNoAnswer">
            <summary>
            The call was forwarded from another extension that didn't answer the call after some number of rings.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.FwdUncond">
            <summary>
            The call was forwarded unconditionally from another number.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Pickup">
            <summary>
            The call was picked up from another extension.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Unpark">
            <summary>
            The call was retrieved as a parked call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Redirect">
            <summary>
            The call was redirected to this station.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.CallCompletion">
            <summary>
            The call was the result of a call completion request.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Transfer">
            <summary>
            The call has been transferred from another number.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Reminder">
            <summary>
            The call is a reminder (or "recall") that the user has a call parked or on hold for (potentially) a long time.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Unknown">
            <summary>
            The reason for the call is currently unknown but may become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Unavail">
            <summary>
            The reason for the call is unavailable and will not become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Intrude">
            <summary>
            The call intruded onto the line, either by a call completion action invoked by another station or by operator action. Depending on switch implementation, the call may appear either in the connected state, or conferenced with an existing active call on the line.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.Parked">
            <summary>
            The call was parked on the address. Usually, it appears initially in the onhold state.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.CampedOn">
            <summary>
            The call was camped on the address. Usually, it appears initially in the onhold state. If an active call becomes idle, the camped-on call may change to the offering state and the device start ringing.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallReason.RouteRequest">
            <summary>
            The call appears on the address because the switch needs routing instructions from the application.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDisconnectException">
            <summary>
            The exception that is thrown when the call is disconnected before application called Disconnect method.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiException">
            <summary>
            The exception that is thrown when Telephony API (TAPI) error occurs.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiException.TapiError">
            <summary>
            Gets the TAPI error number. Most common TAPI error numbers are listed in <see cref="T:Traysoft.AddTapi.TapiErrors"/> enumeration.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiAddress">
            <summary>
            Represents an address (phone number or extension) associated with the line device.
            </summary>
            <remarks>
            Telephony system is represented as a set of <see cref="T:Traysoft.AddTapi.TapiLine"/> objects, each with one
            or more addresses. Most systems have one line for each phone number or extension,
            with one address on each line. For systems with multiple addresses on each line,
            <c>TapiAddress</c> object is used to obtain information about available addresses and
            to specify originating address for outgoing calls.
            </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.Addresses"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo">
            <summary>
            Gets a forwarding information for the address.
            </summary>
            <returns>A list of forwarding entries.</returns>
            <remarks>
            <para>
            <c>GetForwardingInfo</c> gets a list of forwarding instructions for the address. Forwarding instructions
            describe when incoming calls are forwarded and the destination number(s) for call forwarding.
            This method returns <c>null</c> (<c>Nothing</c> in Visual Basic) if call forwarding is not configured
            for the address or if call forwarding information is not available.
            </para>
            <para>
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.ForwardingInfo"/> event to notify the application when forwarding
            information for the address changes. Some telephony service providers cannot detect when the forwarding
            information changes externally and do not notify the application about the changes.
            </para>
            </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiAddress.ForwardModes"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.AddressID">
            <summary>
            Gets the address identifier for the address.
            </summary>
            <remarks>
            Individual addresses are referred to by address identifiers.
            Address identifiers range from zero to one less than the number of addresses on the line.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.Address">
            <summary>
            Gets the phone number or extension assigned to the address.
            </summary>
            <remarks>
            <c>Address</c> property can contain <c>null</c> reference (<c>Nothing</c> in Visual Basic)
            if the line device has only one associated address.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.SupportsPredictiveDialing">
            <summary>
            Indicates if predictive dialing is supported on the address.
            </summary>
            <remarks>
            This property is <c>true</c> if this address has enhanced call progress monitoring
            capabilities which can be applied to outgoing calls to determine call states such
            as ringback, busy, specialinfo and connected, or the media type of the device
            answering the call.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.SupportsPickupCallWaiting">
            <summary>
            Indicates if the call-waiting call can be picked on the address.
            </summary>
            <remarks>
            This property is <c>true</c> if <see cref="M:Traysoft.AddTapi.TapiLine.Pickup(System.String,System.String,Traysoft.AddTapi.TapiAddress)"/>
            can be used to pick up a call detected by the user as a call-waiting call.
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Pickup(System.String,System.String)"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.IsRoutePoint">
            <summary>
            Indicates if this address is a route point.
            </summary>
            <remarks>
            This property is <c>true</c> if this address is not associated with a particular
            station or physical device, but is a holding place where calls wait for routing
            by the application. The application examines calls arriving on this address, and
            can redirect the call to another address/extension using <see cref="M:Traysoft.AddTapi.TapiCall.Redirect(System.String)"/>.
            The call can also be automatically transferred if a routing timeout expires 
            (the switch usually assumes a default routing). 
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.IsQueue">
            <summary>
            Indicates if this address is a queue.
            </summary>
            <remarks>
            This property is <c>true</c> if this address is not associated with
            a particular station or physical device, but is a holding place where
            calls wait for further processing. The calls placed in the queue may
            receive a particular treatment. They may also be automatically transferred
            when a particular resource becomes available (for example, if the queue
            is an ACD queue and calls are waiting for an available agent).
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.CallFeatures">
            <summary>
            Describes features available for all calls on this address.
            </summary>
            <value><see cref="T:Traysoft.AddTapi.TapiCallFeatures"/> describing switching capabilities or
            features available for all calls on this address.</value>
            <remarks>
            This property represents the call-related features that may possibly be available
            on the address (static availability as opposed to dynamic availability). 
            Invoking a supported feature requires the call to be in the proper state and
            the underlying line device to be opened in a compatible mode. A zero in a bit position
            indicates that the corresponding feature is never available. A one indicates that
            the corresponding feature may be available if the application has the right
            privileges to the call and the call is in the appropriate state for the operation
            to be meaningful. This member allows an application to discover which call features
            can be (and which can never be) supported by the address.
            </remarks>
            <seealso cref="T:Traysoft.AddTapi.TapiCallFeatures"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.ForwardModes">
            <summary>
            Indicates modes of forwarding available for this address.
            </summary>
            <value><see cref="T:Traysoft.AddTapi.TapiForwardMode"/> flags describing forwarding modes supported on this address.</value>
            <seealso cref="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.MaxNumActiveCalls">
            <summary>
            Gets the maximum number of calls that can be active on the address.
            </summary>
            <value>
            Maximum number of active call appearances that the address can handle.
            This number does not include calls on hold or calls on hold pending transfer
            or conference.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.MaxNoAnswerTimeout">
            <summary>
            Gets the maximum no answer timeout for calls on this address.
            </summary>
            <value>Maximum value in seconds of the <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
            property for outgoing calls originating from this address.
            </value>
            <remarks>
            A value of 0 indicates that automatic abandonment of unanswered calls is not supported
            by the telephony hardware, or that the timeout value is not adjustable by applications.        /// </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiAddress.DeviceSpecificInfo">
            <summary>
            Gets device specific information about the address.
            </summary>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecificInfo</c> property allows the application to retrieve device specific information about the address.
            The information provided in <c>DeviceSpecificInfo</c> property is described in TAPI documentation for the telephony hardware.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use device specific functionality.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallHandler">
            <summary>
            Represents a method that will perform call flow processing.
            </summary>
            <param name="call">A call to be processed.</param>
            <remarks>
            When a call is connected, AddTapi.NET calls a method that will perform application-specific call flow processing.
            For an example of such methods please refer to the samples included in AddTapi.NET installation.
            Please note that your method must call <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/> to release the call before the method exits
            if the call is no longer needed and should be disconnected.
            <alert class="caution">
            The method represented by this delegate is called on a separate thread and executed in the background.
            Several copies of this method can be executed at the same time (one for each line).
            If you call other methods of your class or access other classes, make sure you do that in a thread-safe manner.
            Windows Forms controls cannot be accessed directly in this method because it is called on a non-UI thread.
            The application must use <c>Invoke</c> mechanism to access Windows Forms controls from this method.
            Please refer to the included samples for an example of using <c>Invoke</c> to update Windows Forms controls.
            </alert>
            </remarks>
            <example>The following code shows how to define a method for call flow processing. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(true, CallHandler);
            line.RingsToAnswer = 1;
            ...
            
            // This method will be called when incoming call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(True, AddressOf CallHandler)
            objLine.RingsToAnswer = 1;
            ...
            
            ' This method will be called when incoming call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
        </member>
        <member name="T:Traysoft.AddTapi.TapiLine">
            <summary>
            Represents a telephony line device.
            </summary>
            <remarks>
            <para>
            Telephony system is represented as a set of <c>TapiLine</c> objects, each with one
            or more addresses. <see cref="P:Traysoft.AddTapi.TapiLine.Addresses"/> collection lists 
            <see cref="T:Traysoft.AddTapi.TapiAddress"/> objects representing addresses (phone numbers or extensions) associated with the line.
            Most systems have one line for each phone number or extension, with one address on each line.
            </para>
            <para>
            AddTapi.NET creates a <c>TapiLine</c> object for each telephony line device
            installed on the computer. The application can subscribe to <see cref="E:Traysoft.AddTapi.TapiApp.LineAdded"/>
            and <see cref="E:Traysoft.AddTapi.TapiApp.LineRemoved"/> events to receive notifications
            when a line device is added or removed.
            </para>
            </remarks>
            <seealso cref="P:Traysoft.AddTapi.TapiApp.Lines"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.LineAdded"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.LineRemoved"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.ToString">
            <summary>
            Overriden. Returns a string that contains the name of the line.
            </summary>
            <returns>A string that contains the name of the line.</returns>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)">
            <summary>
            Negotiates a version of the device specific extension to use with the line.
            </summary>
            <param name="lowVersion">
            Earliest extension version with which the application is compliant.
            </param>
            <param name="highVersion">
            Latest extension version with which the application is compliant.
            </param>
            <returns>
            The extension version number that was negotiated.
            If negotiation succeeds, this number is in the range between <c>lowVersion</c> and <c>highVersion</c>.
            </returns>
            <remarks>
            <para>
            The high-order word is the major version number; the low-order word is the minor version number.
            For example, version 2.1 is represented as 0x00020001 (hex 20001).
            </para>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            In order to use device specific extension on the line, the application must negotiate a version of
            the extension using <c>NegotiateDeviceSpecificExtensionVersion</c> before opening the line
            with <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            </para>
            <para>
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            </remarks>
            <example>The following code shows how to negotiate an extension version. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            TapiDeviceSpecificExtensionID extID = line.DeviceSpecificExtensionID;
            if (extID.ID0 == 0x8EBD6A50 &amp;&amp; extID.ID1 == 0x138011D2 &amp;&amp;
                extID.ID2 == 0x905B0060 &amp;&amp; extID.ID3 == 0xB03DD275)
            {
                // This line supports Cisco Unified TSP extension
                // Our application knows how to work with versions 3.0 - 5.0
                // Negotiate to find out which version is supported
                uint ciscoExtVersion = line.NegotiateDeviceSpecificExtensionVersion(0x30000, 0x50000);
                Console.WriteLine("Line {0} supports Cisco extension {1}", line.Name, ciscoExtVersion);
            }
            line.Open(true, CallHandler);
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            Dim extID As TapiDeviceSpecificExtensionID
            extID = objLine.DeviceSpecificExtensionID
            If extID.ID0 = &amp;H8EBD6A50 And extID.ID1 = &amp;H138011D2 And \
               extID.ID2 = &amp;H905B0060 And extID.ID3 = &amp;HB03DD275 Then
                ' This line supports Cisco Unified TSP extension
                ' Our application knows how to work with versions 3.0 - 5.0
                ' Negotiate to find out which version is supported
                Dim ciscoExtVersion As UInt32
                ciscoExtVersion = objLine.NegotiateDeviceSpecificExtensionVersion(&amp;H30000, &amp;H50000)
                Console.WriteLine("Line {0} supports Cisco extension {1}", objLine.Name, ciscoExtVersion)
            End If
            objLine.Open(True, AddressOf CallHandler)
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>NegotiateDeviceSpecificExtensionVersion</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.DeviceSpecificExtensionID"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)">
            <summary>
            Opens the line. After the line is opened, it can be used to monitor incoming calls and/or to place outgoing calls.
            </summary>
            <param name="monitorIncomingCalls">Indicates whether the line should monitor incoming calls.</param>
            <param name="callback">Callback method that will be called when a call is connected.</param>
            <remarks>
            <para>
            The line has to be opened before it can be used to place outgoing calls and receive incoming calls.
            If the application only makes outgoing calls and does not need to be notified about incoming calls,
            pass <c>false</c> as the <c>monitorIncomingCalls</c> parameter. AddTapi.NET will monitor incoming calls
            on the line and fire <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> events if <c>monitorIncomingCalls</c>
            parameter is <c>true</c>. When <c>monitorIncomingCalls</c> parameter is
            <c>true</c>, AddTapi.NET will also answer incoming calls if <see cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/> is greater than zero.
            </para>
            <para>
            The <c>callback</c> parameter represents a method in the application that AddTapi.NET will call when a call is connected.
            This method will be called for all connected calls, incoming and outgoing.
            This method should perform application-specific call flow processing. Please see <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> for more information.
            </para>
            <para>
            When you use this method, AddTapi.NET automatically selects appropriate media modes based on the capabilities of telephony hardware.
            Use <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler,Traysoft.AddTapi.TapiMediaMode)"></see> if you want to open the line device for calls with specific media types (modes).
            </para>
            </remarks>
            <example>The following code shows how to open the line to process incoming calls. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(true, CallHandler);
            line.RingsToAnswer = 1;
            ...
            
            // This method will be called when incoming call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(True, AddressOf CallHandler)
            objLine.RingsToAnswer = 1;
            ...
            
            ' This method will be called when incoming call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Open</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="T:Traysoft.AddTapi.TapiCallHandler"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Close"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler,Traysoft.AddTapi.TapiMediaMode)">
            <summary>
            Opens the line for calls with selected media types (modes). After the line is opened, it can be used to monitor incoming calls and/or to place outgoing calls.
            </summary>
            <param name="monitorIncomingCalls">Indicates whether the line should monitor incoming calls.</param>
            <param name="callback">Callback method that will be called when a call is connected.</param>
            <param name="mediaModes">The media type or modes of interest to the application.</param>
            <remarks>
            <para>
            The line has to be opened before it can be used to place outgoing calls and receive incoming calls.
            If the application only makes outgoing calls and does not need to be notified about incoming calls,
            pass <c>false</c> as the <c>monitorIncomingCalls</c> parameter. AddTapi.NET will monitor incoming calls
            on the line and fire <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> events if <c>monitorIncomingCalls</c>
            parameter is <c>true</c>. When <c>monitorIncomingCalls</c> parameter is <c>true</c>, AddTapi.NET will
            also answer incoming calls if <see cref="P:Traysoft.AddTapi.TapiLine.RingsToAnswer"/> is greater than zero.
            </para>
            <para>
            The <c>callback</c> parameter represents a method in the application that AddTapi.NET will call when a call is connected.
            This method will be called for all connected calls, incoming and outgoing.
            This method should perform application-specific call flow processing. Please see <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> for more information.
            </para>
            <para>
            The <c>mediaModes</c> parameter is used to register the application as having an interest in monitoring calls that are of the specified media types.
            The application can register for multiple media types. The application should include <c>TapiMediaMode.AutomatedVoice</c>
            media mode if the application wants to use voice functionality such as playing wave files using <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/>
            and speaking to the caller using <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/>.
            Specifying <c>TapiMediaMode.Unknown</c> media mode indicates that the application
            wants to control unclassified calls (calls of unknown media type).
            To obtain a list of media modes supported by the line hardware please use <see cref="P:Traysoft.AddTapi.TapiLine.AvailableMediaModes"/> properties.
            </para>
            </remarks>
            <example>The following code shows how to open the line to process incoming calls. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(true, CallHandler, TapiMediaMode.InteractiveVoice | TapiMediaMode.AutomatedVoice );
            line.RingsToAnswer = 1;
            ...
            
            // This method will be called when incoming call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(True, AddressOf CallHandler, TapiMediaMode.InteractiveVoice Or TapiMediaMode.AutomatedVoice)
            objLine.RingsToAnswer = 1;
            ...
            
            ' This method will be called when incoming call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Open</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="T:Traysoft.AddTapi.TapiCallHandler"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Close"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean,Traysoft.AddTapi.TapiMediaMode)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.AvailableMediaModes"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.OpenMediaModes"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Close">
            <summary>
            Closes the line. Closing the line stops monitoring of incoming calls on the line.
            </summary>
            <remarks>
            This method closes the line and releases associated telephony hardware. When the line is closed,
            it cannot be used to place outgoing calls.
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean)">
            <summary>
            Dials an outgoing call on the line.
            </summary>
            <param name="number">A string that contains a number to dial.</param>
            <param name="useDialingRules">Indicates if the dialing rules specified in the Control Panel should be applied.</param>
            <returns>A newly created call.</returns>
            <remarks>
            <para>
            In order to dial an outgoing call, the line must be opened using <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> method first.
            The application can open the line for outgoing calls by passing <c>false</c> as the first parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            Also, outgoing calls can be dialed on the line open for incoming calls.
            </para>
            <para>
            After an outgoing call is connected, AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> event and executes <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method passed as the second parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            If outgoing call cannot be completed because there is no dailtone, a busy signal was detected or if the called party did not answer within the time interval set in <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/> property,
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> event.
            the application can find out the reason for disconnect by examining the <see cref="P:Traysoft.AddTapi.TapiCall.DisconnectMode"/> property of the disconnected call.
            After <c>CallDisconnected</c> event occurs, another outgoing call can be placed on the same line.
            </para>
            <alert class="caution">
            The line must support predictive dialing (also called hardware answer detection) in order for AddTapi.NET to detect if outgoing call was answered.
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case "no answer" is never reported.
            </alert>
            <para>
            When <c>useDialingRules</c> parameter is <c>false</c>, a number to dial is passed directly to the telephony hardware without any translation.
            In this case the <c>number</c> parameter follows a standard dialable number format. A dialable number can contain the following DTMF or pulse digits: '0'-'9', 'A'-'D', '*' and '#'.
            A dialable number can also contain the following modifiers (if supported by the telephony hardware):
            <list type="table">
            <listheader>
            <term>Modifier</term>
            <term>Meaning</term>
            </listheader>
            <item>
            <term>!</term>
            <term>Hex (21). Indicates that a hookflash (one-half second onhook, followed by one-half second offhook before continuing) is to be inserted in the dial string.</term>
            </item>
            <item>
            <term>P p</term>
            <term>Hex (50) or Hex (70). An uppercase or lowercase P indicates that pulse dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>T t</term>
            <term>Hex (54) or Hex (74). An uppercase or lowercase T indicates that tone (DTMF) dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>,</term>
            <term>Hex (27). A comma indicates that dialing is to be paused. The duration of a pause is device specific (usually 500 ms). Multiple commas can be used to provide longer pauses.</term>
            </item>
            <item>
            <term>W w</term>
            <term>Hex (57) or Hex (77). An uppercase or lowercase W indicates that dialing should proceed only after a dial tone has been detected.</term>
            </item>
            <item>
            <term>@</term>
            <term>Hex (40). Indicates that dialing is to "wait for quiet answer" before dialing the remainder of the dialable number. This means to wait for at least one ringback tone followed by several seconds of silence.</term>
            </item>
            </list>
            </para>
            <para>
            When <c>useDialingRules</c> parameter is <c>true</c>, a number to dial is translated using dialing rules specified in the Telephony applet in the Control Panel.
            In this case the <c>number</c> parameter should follow canonical format. A canonical phone number is a text string with the following structure:
            </para>
            <para>
            + CountryCode Space [(AreaCode) Space] SubscriberNumber
            </para>
            <para>
            Plus sign (hex 2B) indicates that the number that follows it uses the canonical format.
            The plus sign is followed by the variably sized country code (CountryCode element) without any spaces between the plus sign and the country code.
            CountryCode is followed by exactly one space character (hex 20).
            AreaCode is the area code part of the number and is optional.
            If the area code is present, it must be preceded by exactly one left parenthesis character (hex 28), and be followed by exactly one right parenthesis character (hex 29) and one space character (hex 20).
            SubscriberNumber may include digits '0' - '9', 'A' - 'D' , '*' and '#'. Other dial control characters described above in the dialable number format are also allowed.
            The subscriber number should not contain the left parenthesis or right parenthesis character (which are used only to delimit the area code).
            The following nondigit characters in the subscriber number are allowed: spaces, periods '.' and dashes '-'. They are used for display purposes and are ignored.
            For example, the canonical representation of the US phone number 555-123-4567 would be:
            </para>
            <para>
            +1 (555) 123-4567
            </para>
            </remarks>
            <example>The following code shows how to open the line for outgoing calls and make a call. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(false, CallHandler);
            line.Dial("15551234567", false);
            ...
            
            // This method will be called when outgoing call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(False, AddressOf CallHandler)
            objLine.Dial("15551234567", False)
            ...
            
            ' This method will be called when outgoing call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean,Traysoft.AddTapi.TapiMediaMode)">
            <summary>
            Dials an outgoing call on the line using specified media mode.
            </summary>
            <param name="number">A string that contains a number to dial.</param>
            <param name="useDialingRules">Indicates if the dialing rules specified in the Control Panel should be applied.</param>
            <param name="mediaMode">Expected media type of the call.</param>
            <returns>A newly created call.</returns>
            <remarks>
            <para>
            In order to dial an outgoing call, the line must be opened using <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> method first.
            The application can open the line for outgoing calls by passing <c>false</c> as the first parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            Also, outgoing calls can be dialed on the line open for incoming calls.
            </para>
            <para>
            After an outgoing call is connected, AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> event and executes <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method passed as the second parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            If outgoing call cannot be completed because there is no dailtone, a busy signal was detected or if the called party did not answer within the time interval set in <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/> property,
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> event.
            The application can find out the reason for disconnect by examining the <see cref="P:Traysoft.AddTapi.TapiCall.DisconnectMode"/> property of the disconnected call.
            After <c>CallDisconnected</c> event occurs, another outgoing call can be placed on the same line.
            </para>
            <alert class="caution">
            The line must support predictive dialing (also called hardware answer detection) in order for AddTapi.NET to detect if outgoing call was answered.
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case "no answer" is never reported.
            </alert>
            <para>
            When <c>useDialingRules</c> parameter is <c>false</c>, a number to dial is passed directly to the telephony hardware without any translation.
            In this case the <c>number</c> parameter follows a standard dialable number format. A dialable number can contain the following DTMF or pulse digits: '0'-'9', 'A'-'D', '*' and '#'.
            A dialable number can also contain the following modifiers (if supported by the telephony hardware):
            <list type="table">
            <listheader>
            <term>Modifier</term>
            <term>Meaning</term>
            </listheader>
            <item>
            <term>!</term>
            <term>Hex (21). Indicates that a hookflash (one-half second onhook, followed by one-half second offhook before continuing) is to be inserted in the dial string.</term>
            </item>
            <item>
            <term>P p</term>
            <term>Hex (50) or Hex (70). An uppercase or lowercase P indicates that pulse dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>T t</term>
            <term>Hex (54) or Hex (74). An uppercase or lowercase T indicates that tone (DTMF) dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>,</term>
            <term>Hex (27). A comma indicates that dialing is to be paused. The duration of a pause is device specific (usually 500 ms). Multiple commas can be used to provide longer pauses.</term>
            </item>
            <item>
            <term>W w</term>
            <term>Hex (57) or Hex (77). An uppercase or lowercase W indicates that dialing should proceed only after a dial tone has been detected.</term>
            </item>
            <item>
            <term>@</term>
            <term>Hex (40). Indicates that dialing is to "wait for quiet answer" before dialing the remainder of the dialable number. This means to wait for at least one ringback tone followed by several seconds of silence.</term>
            </item>
            </list>
            </para>
            <para>
            When <c>useDialingRules</c> parameter is <c>true</c>, a number to dial is translated using dialing rules specified in the Telephony applet in the Control Panel.
            In this case the <c>number</c> parameter should follow canonical format. A canonical phone number is a text string with the following structure:
            </para>
            <para>
            + CountryCode Space [(AreaCode) Space] SubscriberNumber
            </para>
            <para>
            Plus sign (hex 2B) indicates that the number that follows it uses the canonical format.
            The plus sign is followed by the variably sized country code (CountryCode element) without any spaces between the plus sign and the country code.
            CountryCode is followed by exactly one space character (hex 20).
            AreaCode is the area code part of the number and is optional.
            If the area code is present, it must be preceded by exactly one left parenthesis character (hex 28), and be followed by exactly one right parenthesis character (hex 29) and one space character (hex 20).
            SubscriberNumber may include digits '0' - '9', 'A' - 'D' , '*' and '#'. Other dial control characters described above in the dialable number format are also allowed.
            The subscriber number should not contain the left parenthesis or right parenthesis character (which are used only to delimit the area code).
            The following nondigit characters in the subscriber number are allowed: spaces, periods '.' and dashes '-'. They are used for display purposes and are ignored.
            For example, the canonical representation of the US phone number 555-123-4567 would be:
            </para>
            <para>
            +1 (555) 123-4567
            </para>
            <para>
            The <c>mediaMode</c> parameter indicates what media type is expected on the call.
            The application should specify <c>TapiMediaMode.AutomatedVoice</c>
            media mode in order to use voice functionality such as playing wave files using <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/>
            and speaking to the caller using <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/>.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <example>The following code shows how to open the line for outgoing calls and make a call. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(false, CallHandler, TapiMediaMode.AutomatedVoice);
            line.Dial("15551234567", false, TapiMediaMode.AutomatedVoice);
            ...
            
            // This method will be called when outgoing call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(False, AddressOf CallHandler, TapiMediaMode.AutomatedVoice)
            objLine.Dial("15551234567", False, TapiMediaMode.AutomatedVoice)
            ...
            
            ' This method will be called when outgoing call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean,Traysoft.AddTapi.TapiMediaMode,Traysoft.AddTapi.TapiAddress)">
            <summary>
            Dials an outgoing call on the line using specified media mode and originating TapiAddress.
            </summary>
            <param name="number">A string that contains a number to dial.</param>
            <param name="useDialingRules">Indicates if the dialing rules specified in the Control Panel should be applied.</param>
            <param name="mediaMode">Expected media type of the call.</param>
            <param name="address">Originating address for the call.</param>
            <returns>A newly created call.</returns>
            <remarks>
            <para>
            In order to dial an outgoing call, the line must be opened using <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> method first.
            The application can open the line for outgoing calls by passing <c>false</c> as the first parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            Also, outgoing calls can be dialed on the line open for incoming calls.
            </para>
            <para>
            After an outgoing call is connected, AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> event and executes <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method passed as the second parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            If outgoing call cannot be completed because there is no dailtone, a busy signal was detected or if the called party did not answer within the time interval set in <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/> property,
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> event.
            The application can find out the reason for disconnect by examining the <see cref="P:Traysoft.AddTapi.TapiCall.DisconnectMode"/> property of the disconnected call.
            After <c>CallDisconnected</c> event occurs, another outgoing call can be placed on the same line.
            </para>
            <alert class="caution">
            The line must support predictive dialing (also called hardware answer detection) in order for AddTapi.NET to detect if outgoing call was answered.
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case "no answer" is never reported.
            </alert>
            <para>
            When <c>useDialingRules</c> parameter is <c>false</c>, a number to dial is passed directly to the telephony hardware without any translation.
            In this case the <c>number</c> parameter follows a standard dialable number format. A dialable number can contain the following DTMF or pulse digits: '0'-'9', 'A'-'D', '*' and '#'.
            A dialable number can also contain the following modifiers (if supported by the telephony hardware):
            <list type="table">
            <listheader>
            <term>Modifier</term>
            <term>Meaning</term>
            </listheader>
            <item>
            <term>!</term>
            <term>Hex (21). Indicates that a hookflash (one-half second onhook, followed by one-half second offhook before continuing) is to be inserted in the dial string.</term>
            </item>
            <item>
            <term>P p</term>
            <term>Hex (50) or Hex (70). An uppercase or lowercase P indicates that pulse dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>T t</term>
            <term>Hex (54) or Hex (74). An uppercase or lowercase T indicates that tone (DTMF) dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>,</term>
            <term>Hex (27). A comma indicates that dialing is to be paused. The duration of a pause is device specific (usually 500 ms). Multiple commas can be used to provide longer pauses.</term>
            </item>
            <item>
            <term>W w</term>
            <term>Hex (57) or Hex (77). An uppercase or lowercase W indicates that dialing should proceed only after a dial tone has been detected.</term>
            </item>
            <item>
            <term>@</term>
            <term>Hex (40). Indicates that dialing is to "wait for quiet answer" before dialing the remainder of the dialable number. This means to wait for at least one ringback tone followed by several seconds of silence.</term>
            </item>
            </list>
            </para>
            <para>
            When <c>useDialingRules</c> parameter is <c>true</c>, a number to dial is translated using dialing rules specified in the Telephony applet in the Control Panel.
            In this case the <c>number</c> parameter should follow canonical format. A canonical phone number is a text string with the following structure:
            </para>
            <para>
            + CountryCode Space [(AreaCode) Space] SubscriberNumber
            </para>
            <para>
            Plus sign (hex 2B) indicates that the number that follows it uses the canonical format.
            The plus sign is followed by the variably sized country code (CountryCode element) without any spaces between the plus sign and the country code.
            CountryCode is followed by exactly one space character (hex 20).
            AreaCode is the area code part of the number and is optional.
            If the area code is present, it must be preceded by exactly one left parenthesis character (hex 28), and be followed by exactly one right parenthesis character (hex 29) and one space character (hex 20).
            SubscriberNumber may include digits '0' - '9', 'A' - 'D' , '*' and '#'. Other dial control characters described above in the dialable number format are also allowed.
            The subscriber number should not contain the left parenthesis or right parenthesis character (which are used only to delimit the area code).
            The following nondigit characters in the subscriber number are allowed: spaces, periods '.' and dashes '-'. They are used for display purposes and are ignored.
            For example, the canonical representation of the US phone number 555-123-4567 would be:
            </para>
            <para>
            +1 (555) 123-4567
            </para>
            <para>
            The <c>mediaMode</c> parameter indicates what media type is expected on the call.
            The application should specify <c>TapiMediaMode.AutomatedVoice</c>
            media mode in order to use voice functionality such as playing wave files using <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/>
            and speaking to the caller using <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/>.
            </para>
            <para>
            The <c>address</c> parameter allows to select originating address for lines that have multiple
            associated addresses. This parameter must contain one of the addresses listed in the
            <see cref="P:Traysoft.AddTapi.TapiLine.Addresses"/> collection.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <example>The following code shows how to open the line for outgoing calls and make a call. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(false, CallHandler, TapiMediaMode.AutomatedVoice);
            line.Dial("15551234567", false, TapiMediaMode.AutomatedVoice, line.Addresses[0]);
            ...
            
            // This method will be called when outgoing call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(False, AddressOf CallHandler, TapiMediaMode.AutomatedVoice)
            objLine.Dial("15551234567", False, TapiMediaMode.AutomatedVoice, objLine.Addresses(0))
            ...
            
            ' This method will be called when outgoing call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Dial(System.String,System.Boolean,Traysoft.AddTapi.TapiMediaMode,System.String)">
            <summary>
            Dials an outgoing call on the line using specified media mode and originating address.
            </summary>
            <param name="number">A string that contains a number to dial.</param>
            <param name="useDialingRules">Indicates if the dialing rules specified in the Control Panel should be applied.</param>
            <param name="mediaMode">Expected media type of the call.</param>
            <param name="originatingAddress">Originating address for the call, specified through its phone number.</param>
            <returns>A newly created call.</returns>
            <remarks>
            <para>
            In order to dial an outgoing call, the line must be opened using <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> method first.
            The application can open the line for outgoing calls by passing <c>false</c> as the first parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            Also, outgoing calls can be dialed on the line open for incoming calls.
            </para>
            <para>
            After an outgoing call is connected, AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/> event and executes <see cref="T:Traysoft.AddTapi.TapiCallHandler"/> method passed as the second parameter of <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>.
            If outgoing call cannot be completed because there is no dailtone, a busy signal was detected or if the called party did not answer within the time interval set in <see cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/> property,
            AddTapi.NET fires <see cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/> event.
            The application can find out the reason for disconnect by examining the <see cref="P:Traysoft.AddTapi.TapiCall.DisconnectMode"/> property of the disconnected call.
            After <c>CallDisconnected</c> event occurs, another outgoing call can be placed on the same line.
            </para>
            <alert class="caution">
            The line must support predictive dialing (also called hardware answer detection) in order for AddTapi.NET to detect if outgoing call was answered.
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case "no answer" is never reported.
            </alert>
            <para>
            When <c>useDialingRules</c> parameter is <c>false</c>, a number to dial is passed directly to the telephony hardware without any translation.
            In this case the <c>number</c> parameter follows a standard dialable number format. A dialable number can contain the following DTMF or pulse digits: '0'-'9', 'A'-'D', '*' and '#'.
            A dialable number can also contain the following modifiers (if supported by the telephony hardware):
            <list type="table">
            <listheader>
            <term>Modifier</term>
            <term>Meaning</term>
            </listheader>
            <item>
            <term>!</term>
            <term>Hex (21). Indicates that a hookflash (one-half second onhook, followed by one-half second offhook before continuing) is to be inserted in the dial string.</term>
            </item>
            <item>
            <term>P p</term>
            <term>Hex (50) or Hex (70). An uppercase or lowercase P indicates that pulse dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>T t</term>
            <term>Hex (54) or Hex (74). An uppercase or lowercase T indicates that tone (DTMF) dialing is to be used for the digits following it.</term>
            </item>
            <item>
            <term>,</term>
            <term>Hex (27). A comma indicates that dialing is to be paused. The duration of a pause is device specific (usually 500 ms). Multiple commas can be used to provide longer pauses.</term>
            </item>
            <item>
            <term>W w</term>
            <term>Hex (57) or Hex (77). An uppercase or lowercase W indicates that dialing should proceed only after a dial tone has been detected.</term>
            </item>
            <item>
            <term>@</term>
            <term>Hex (40). Indicates that dialing is to "wait for quiet answer" before dialing the remainder of the dialable number. This means to wait for at least one ringback tone followed by several seconds of silence.</term>
            </item>
            </list>
            </para>
            <para>
            When <c>useDialingRules</c> parameter is <c>true</c>, a number to dial is translated using dialing rules specified in the Telephony applet in the Control Panel.
            In this case the <c>number</c> parameter should follow canonical format. A canonical phone number is a text string with the following structure:
            </para>
            <para>
            + CountryCode Space [(AreaCode) Space] SubscriberNumber
            </para>
            <para>
            Plus sign (hex 2B) indicates that the number that follows it uses the canonical format.
            The plus sign is followed by the variably sized country code (CountryCode element) without any spaces between the plus sign and the country code.
            CountryCode is followed by exactly one space character (hex 20).
            AreaCode is the area code part of the number and is optional.
            If the area code is present, it must be preceded by exactly one left parenthesis character (hex 28), and be followed by exactly one right parenthesis character (hex 29) and one space character (hex 20).
            SubscriberNumber may include digits '0' - '9', 'A' - 'D' , '*' and '#'. Other dial control characters described above in the dialable number format are also allowed.
            The subscriber number should not contain the left parenthesis or right parenthesis character (which are used only to delimit the area code).
            The following nondigit characters in the subscriber number are allowed: spaces, periods '.' and dashes '-'. They are used for display purposes and are ignored.
            For example, the canonical representation of the US phone number 555-123-4567 would be:
            </para>
            <para>
            +1 (555) 123-4567
            </para>
            <para>
            The <c>mediaMode</c> parameter indicates what media type is expected on the call.
            The application should specify <c>TapiMediaMode.AutomatedVoice</c>
            media mode in order to use voice functionality such as playing wave files using <see cref="M:Traysoft.AddTapi.TapiCall.Play(System.String)"/>
            and speaking to the caller using <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String)"/>.
            </para>
            <para>
            The <c>originatingAddress</c> parameter allows to select originating address for lines that have multiple
            associated addresses. The address is specified through its phone number.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <example>The following code shows how to open the line for outgoing calls and make a call. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            line.Open(false, CallHandler, TapiMediaMode.AutomatedVoice);
            line.Dial("15551234567", false, TapiMediaMode.AutomatedVoice, "3220");
            ...
            
            // This method will be called when outgoing call is answered
            private void CallHandler(TapiCall call)
            {
                call.Play("welcome.wav");
                call.Speak("Press 1 to hear the current time. Press any other button to disconnect.");
                if(call.WaitForDigit(20) == "1")
                {
                    call.Speak(DateTime.Now.ToString());
                    call.WaitUntilDone(10);
                }
                call.Disconnect();
            }
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            objLine.Open(False, AddressOf CallHandler, TapiMediaMode.AutomatedVoice)
            objLine.Dial("15551234567", False, TapiMediaMode.AutomatedVoice, "3220")
            ...
            
            ' This method will be called when outgoing call is answered
            Private Sub CallHandler(ByVal objCall As TapiCall)
                objCall.Play("welcome.wav")
                objCall.Speak("Press 1 to hear the current time. Press any other button to disconnect.")
                If objCall.WaitForDigit(20) = "1" Then
                    objCall.Speak(DateTime.Now.ToString())
                    objCall.WaitUntilDone(10)
                End If
                objCall.Disconnect()
            End Sub
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>Dial</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout"/>
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)">
            <summary>
            Provides access to device specific functionality.
            </summary>
            <param name="inputStruct"> A structure that contains input data.</param>
            <param name="address">An address on the line (if required for the specific function). Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if not required.</param>
            <param name="call">A call on the line (if required for the specific function). Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if not required.</param>
            <param name="outputStructType">A type of the structure that will contain output data. Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if specific function does not return any data.</param>
            <returns>An object of type <c>outputStructType</c> that contains output data or <c>null</c> reference (<c>Nothing</c> in Visual Basic) if there is no output data.</returns>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecific</c> method allows the application to access device specific functions implemented by the TSP.
            Input and output parameters for device specific functions are usualy described as C structures
            in TAPI documentation for the telephony hardware. You have to define similar structures/classes in your
            code and use them to pass input and output parameters to <c>DeviceSpecific</c> method. Please see the
            code snapshot below for more details.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use <c>DeviceSpecific</c> method.
            </para>
            <note>
            This method should be used when device specific function has fixed size structures as input and output data.
            Use <see cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Byte[],Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Int32)"/> when input or output data
            have variable length. Please feel free to contact us and we will gladly help with more complex scenarios.
            </note>
            </remarks>
            <example>The following code shows how to use Cisco device specific function that turns on message waiting light.
            <para>C#</para>
            <code>
            // Define a structure that holds parameters for Cisco MsgWaiting function
            struct CiscoLineDevSpecificMsgWaiting
            {
                public int MsgType;
                public int BlinkRate;
            }
            ...
            // Turn on message waiting light on Cisco phone
            CiscoLineDevSpecificMsgWaiting msgWaiting;
            msgWaiting.MsgType = SLDST_MSG_WAITING;
            msgWaiting.BlinkRate = PHONELAMPMODE_STEADY;
            line.DeviceSpecific(msgWaiting, null, null, null);
            </code>
            <para>VB.NET</para>
            <code>
            ' Define a structure that holds parameters for Cisco MsgWaiting function
            Structure CiscoLineDevSpecificMsgWaiting
                Public MsgType As Integer
                Public BlinkRate As Integer
            End Structure
            ...
            ' Turn on message waiting light on Cisco phone
            Dim msgWaiting As CiscoLineDevSpecificMsgWaiting
            msgWaiting.MsgType = SLDST_MSG_WAITING
            msgWaiting.BlinkRate = PHONELAMPMODE_STEADY
            objLine.DeviceSpecific(msgWaiting, Nothing, Nothing, Nothing)
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>DeviceSpecific</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecific"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Byte[],Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Int32)">
            <summary>
            Provides access to device specific functionality.
            </summary>
            <param name="inputData"> A byte array that contains input data.</param>
            <param name="address">An address on the line (if required for the specific function). Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if not required.</param>
            <param name="call">A call on the line (if required for the specific function). Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if not required.</param>
            <param name="outputDataSize">Size of output data, in bytes. Set to zero if specific function does not return any data.</param>
            <returns>A byte array with output data or <c>null</c> reference (<c>Nothing</c> in Visual Basic) if there is no output data.</returns>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            <c>DeviceSpecific</c> method allows the application to access device specific functions implemented by the TSP.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use <c>DeviceSpecific</c> method.
            </para>
            <note>
            This method should be used when input or output data have variable length. Make sure to specify <c>outputDataLength</c>
            large enough to hold all output data. Use <see cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
            when device specific function has fixed size structures as input and output data.
            Please feel free to contact us and we will gladly help with more complex scenarios.
            </note>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>DeviceSpecific</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecific"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.DeviceSpecificFeature(System.Object,System.UInt32,System.Type)">
            <summary>
            Provides access to device specific features.
            </summary>
            <param name="inputStruct">A structure that contains input data.</param>
            <param name="feature">The parameter value uniquely identifies the feature to invoke on the device.</param>
            <param name="outputStructType">A type of the structure that will contain output data. Set to <c>null</c> reference (<c>Nothing</c> in Visual Basic) if specific function does not return any data.</param>
            <returns>An object of type <c>outputStructType</c> that contains output data or <c>null</c> reference (<c>Nothing</c> in Visual Basic) if there is no output data.</returns>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecificFeature</c> method allows the application to access device specific features implemented by the TSP.
            Input and output parameters for device specific functions are usualy described as C structures
            in TAPI documentation for your telephony hardware. You have to define similar structures/classes in your
            code and use them to pass input and output parameters to <c>DeviceSpecific</c> method. Please see the
            code snapshot below for more details.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use <c>DeviceSpecificFeature</c> method.
            </para>
            <note>
            This method should be used when device specific feature has fixed size structures as input and output data.
            Use <see cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecificFeature(System.Byte[],System.UInt32,System.Int32)"/> when input or output data
            have variable length. Please feel free to contact us and we will gladly help with more complex scenarios.
            </note>
            </remarks>
            <example>The following code shows how to use Cisco device specific feature to put Cisco phone into Do Not Disturb mode.
            <para>C#</para>
            <code>
            // Define a structure that holds parameters for Cisco DoNotDisturb feature
            struct CCiscoLineDevSpecificFeature_DoNotDisturb
            {
                public int MsgType;
                public int Operation;
            }
            ...
            // Put Cisco phone into DND mode
            CCiscoLineDevSpecificFeature_DoNotDisturb dnd;
            dnd.MsgType = 0x1A; // PHONEBUTTONFUNCTION_DONOTDISTURB
            dnd.Operation = 1; // DoNotDisturbOperation_ENABLE
            line.DeviceSpecificFeature(dnd, 0x1A, null);
            </code>
            <para>VB.NET</para>
            <code>
            ' Define a structure that holds parameters for Cisco DoNotDisturb feature
            Structure CCiscoLineDevSpecificFeature_DoNotDisturb
                Public MsgType As Integer
                Public Operation As Integer
            End Structure
            ...
            ' Put Cisco phone into DND mode
            Dim dnd As CCiscoLineDevSpecificFeature_DoNotDisturb
            dnd.MsgType = &amp;H1A ' PHONEBUTTONFUNCTION_DONOTDISTURB
            dnd.Operation = 1 ' DoNotDisturbOperation_ENABLE
            objLine.DeviceSpecificFeature(dnd, &amp;H1A, null)
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>DeviceSpecificFeature</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecificFeature"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.DeviceSpecificFeature(System.Byte[],System.UInt32,System.Int32)">
            <summary>
            Provides access to device specific features.
            </summary>
            <param name="inputData"> A byte array that contains input data.</param>
            <param name="feature">The parameter value uniquely identifies the feature to invoke on the device.</param>
            <param name="outputDataSize">Size of output data, in bytes. Set to zero if specific function does not return any data.</param>
            <returns>A byte array with output data or <c>null</c> reference (<c>Nothing</c> in Visual Basic) if there is no output data.</returns>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            <c>DeviceSpecificFeature</c> method allows the application to access device specific features implemented by the TSP.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use <c>DeviceSpecificFeature</c> method.
            </para>
            <note>
            This method should be used when input or output data have variable length. Make sure to specify <c>outputDataLength</c>
            large enough to hold all output data. Use <see cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecificFeature(System.Object,System.UInt32,System.Type)"/>
            when device specific function has fixed size structures as input and output data.
            Please feel free to contact us and we will gladly help with more complex scenarios.
            </note>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException"><c>DeviceSpecificFeature</c> failed because of Telephony API (TAPI) error.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.DeviceSpecificFeature"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Unpark(System.String,Traysoft.AddTapi.TapiAddress)">
            <summary>
            Retrieves the call parked at the specified phone number or extension.
            </summary>
            <param name="number">Number where the call is parked.</param>
            <param name="address">Address on the line at which the unpark is to be originated.</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing unparked call.</returns>
            <remarks>
            <para>
            The parked call typically enters the idle state after it has been successfully parked and
            the corresponding <see cref="T:Traysoft.AddTapi.TapiCall"/> object is released. When the application performs
            an <c>Unpark</c> on the parked call, a new <see cref="T:Traysoft.AddTapi.TapiCall"/> object is
            created for the unparked call.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not unparked because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Park(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Unpark(System.String)">
            <summary>
            Retrieves the call parked at the specified phone number or extension.
            </summary>
            <param name="number">Number where the call is parked.</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing unparked call.</returns>
            <remarks>
            <para>
            The parked call typically enters the idle state after it has been successfully parked and
            the corresponding <see cref="T:Traysoft.AddTapi.TapiCall"/> object is released. When the application performs
            an <c>Unpark</c> on the parked call, a new <see cref="T:Traysoft.AddTapi.TapiCall"/> object is
            created for the unparked call.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not unparked because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Park(System.String)"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Pickup(System.String,System.String,Traysoft.AddTapi.TapiAddress)">
            <summary>
            Picks up a call ringing at the specified phone number or extension.
            </summary>
            <param name="number">Number/extension whose call is to be picked up.</param>
            <param name="group">Group identifier to which the ringing station belongs.
            This parameter is required on some switches to pick up calls outside of the current pickup group.</param>
            <param name="address">Address on the line at which the pickup is to be originated.</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing picked up call.</returns>
            <remarks>
            <para>
            For most telephony configurations <c>group</c> parameter can be <c>null</c> (<c>Nothing</c> in Visual Basic)
            and the application has to provide only <c>number</c> parameter. If supported by the telephony hardware,
            <c>group</c> parameter can be specified by itself with a <c>null</c> (<c>Nothing</c> in Visual Basic) for the
            <c>number</c> parameter to perform a group pick up.
            </para>
            <para>
            When a call has been picked up successfully, the application is notified by the <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/>
            event about call state changes.
            </para>
            <para>
            If <c>TapiAddress.SupportsPickupCallWaiting</c> is true, <c>Pickup</c> can be used to pick up a call
            for which the user has audibly detected the call-waiting signal but for which the provider is unable
            to perform the detection. This gives the user a mechanism to "answer" a waiting call even though the
            service provider was unable to detect the call-waiting signal. Both <c>number</c> and <c>group</c>
            parameters must be <c>null</c> (<c>Nothing</c> in Visual Basic) to pick up a call-waiting call.
            After <c>Pickup</c> has been used to pick up the second call, <see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/> can be used
            to toggle between them.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not picked up because a TAPI error occurred.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.Pickup(System.String,System.String)">
            <summary>
            Picks up a call ringing at the specified phone number or extension.
            </summary>
            <param name="number">Number/extension whose call is to be picked up.</param>
            <param name="group">Group identifier to which the ringing station belongs.
            This parameter is required on some switches to pick up calls outside of the current pickup group.</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing picked up call.</returns>
            <remarks>
            <para>
            For most telephony configurations <c>group</c> parameter can be <c>null</c> (<c>Nothing</c> in Visual Basic)
            and the application has to provide only <c>number</c> parameter. If supported by the telephony hardware,
            <c>group</c> parameter can be specified by itself with a <c>null</c> (<c>Nothing</c> in Visual Basic) for the
            <c>number</c> parameter to perform a group pick up.
            </para>
            <para>
            When a call has been picked up successfully, the application is notified by the <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/>
            event about call state changes.
            </para>
            <para>
            If <c>TapiAddress.SupportsPickupCallWaiting</c> is true, <c>Pickup</c> can be used to pick up a call
            for which the user has audibly detected the call-waiting signal but for which the provider is unable
            to perform the detection. This gives the user a mechanism to "answer" a waiting call even though the
            service provider was unable to detect the call-waiting signal. Both <c>number</c> and <c>group</c>
            parameters must be <c>null</c> (<c>Nothing</c> in Visual Basic) to pick up a call-waiting call.
            After <c>Pickup</c> has been used to pick up the second call, <see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/> can be used
            to toggle between them.
            </para>
            </remarks>
            <exception cref="T:Traysoft.AddTapi.TapiException">The call was not picked up because a TAPI error occurred.</exception>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)">
            <summary>
            Sets up a conference call for the addition of the third party.
            </summary>
            <param name="initialCall">Initial call that identifies the first and second parties of a conference call. The call state of
            <c>initialCall</c> must be <see cref="F:Traysoft.AddTapi.TapiCallState.Connected"/>. In some environments
            a call must exist to start a conference call. In other telephony environments, no call initially exists, and
            <c>initialCall</c> must be <c>null</c> (<c>Nothing</c> in Visual Basic).</param>
            <param name="consultationCall">When setting up a call for the addition of a new party, a new temporary call (consultation call)
            is automatically created. Use <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> on that call to dial the number of the third party
            that you want to add to the conference.</param>
            <param name="numParties">Expected number of parties in the conference call. This number is passed to the service provider.
            The service provider is free to do as it pleases with this number: ignore it, use it as a hint to allocate the right size
            conference bridge inside the PBX, and so on.</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing the newly created conference call.</returns>
            <remarks>
            <para>
            <c>SetupConference</c> initiates a conference for an existing two-party call that the <c>initialCall</c> parameter specifies.
            A conference call and consultation call are established, and <see cref="T:Traysoft.AddTapi.TapiCall"/> objects representing those calls are returned
            to the application. Use <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> on the consultation call to dial the third party.
            </para>
            <para>
            <c>SetupConference</c> provides two ways to establish a new conference call, depending on whether a normal two-party call
            is required to pre-exist or not. When setting up a conference call from an existing two-party call, the <c>initialCall</c>
            parameter is a call in the <see cref="F:Traysoft.AddTapi.TapiCallState.Connected"/> state that is initially added to the conference call.
            On PBXs where conference call setup does not start with an existing call, <c>initialCall</c> must be <c>null</c>.
            In either case, a consultation call is allocated for connecting to the party that is to be added to the conference.
            The application can then use <see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/> to dial the number of the other party.
            </para>
            <para>
            The conference call typically transitions into the <see cref="F:Traysoft.AddTapi.TapiCallState.OnHoldPendingConference"/> state,
            the consultation call into the <see cref="F:Traysoft.AddTapi.TapiCallState.DialTone"/> state, and the initial call (if there is one)
            into the <see cref="F:Traysoft.AddTapi.TapiCallState.Conferenced"/> state.
            </para>
            <para>
            A conference call can also be set up by a <see cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/> that is resolved into a three-way conference.
            The application may be able to toggle between the consultation call and the conference call using <see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/>.
            </para>
            <para>
            A consultation call can be canceled by invoking <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/> on it. When dropping a consultation call,
            the existing conference call typically transitions back to the connected state. The application should observe
            the <see cref="E:Traysoft.AddTapi.TapiApp.CallState"/> events to determine exactly what happens to the calls. For example, if the conference call
            reverts back to a regular two-party call, the conference call becomes idle and the original participant call can revert to connected.
            </para>
            </remarks>
            <example>The following code shows how to set up a conference and add another party to it. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            // Assuming activeCall represents an active call in Connected state
            // Conference call will be created from the active call and extension 201 added to the conference
            
            // First step: set up a conference, create consultation call and dial ext. 201
            TapiCall consultationCall;
            TapiCall conferenceCall = activeCall.Line.SetupConference(activeCall, out consultationCall, 3);
            System.Threading.Thread.Sleep(500);
            if (consultationCall.State != TapiCallState.DialTone) throw new Exception("Call state is not Dialtone");
            consultationCall.Dial("201");
            // When the state of the consultation call changes to Connected, the user can talk to ext. 201
            // before adding ext. 201 to the conference
            ...
            // Second step: connect consultation call to the conference
            consultationCall.AddToConference(conferenceCall);
            </code>
            <para>VB.NET</para>
            <code>
            ' Assuming activeCall represents an active call in Connected state
            ' Conference call will be created from the active call and extension 201 added to the conference
            
            ' First step: set up a conference, create consultation call and dial ext. 201
            Dim conferenceCall as TapiCall
            Dim consultationCall as TapiCall
            conferenceCall = activeCall.Line.SetupConference(activeCall, consultationCall, 3)
            System.Threading.Thread.Sleep(500)
            If consultationCall.State = TapiCallState.DialTone Then
              consultationCall.Dial("201")
            Else
              ' Error, consultation call is not in dialtone state
            EndIf
            ' When the state of the consultation call changes to Connected, the user can talk to ext. 201
            ' before adding ext. 201 to the conference
            ...
            ' Second step: connect consultation call to the conference
            consultationCall.AddToConference(conferenceCall)
            </code>
            </example>
            <exception cref="T:Traysoft.AddTapi.TapiException">The conference was not set up because a TAPI error occurred.</exception>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.PrepareAddToConference"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.AddToConference(Traysoft.AddTapi.TapiCall)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.RemoveFromConference"/>
        </member>
        <member name="M:Traysoft.AddTapi.TapiLine.SetupForwarding(System.Collections.Generic.IEnumerable{Traysoft.AddTapi.TapiForwardEntry},System.Int32,Traysoft.AddTapi.TapiAddress)">
            <summary>
            Sets up forwarding of calls destined for the specified address on the line, according to the specified forwarding instructions.
            </summary>
            <param name="forwardingInstructions">An array of <see cref="T:Traysoft.AddTapi.TapiForwardEntry"/> objects that describes the specific forwarding instructions.</param>
            <param name="numRingsNoAnswer">Number of rings before a call is considered a "no answer."</param>
            <param name="address">Address on the specified line whose incoming calls are to be forwarded.
            To configure call forwarding for all originating addresses on the line, set this parameter to <c>null</c> (<c>Nothing</c> in Visual Basic).</param>
            <returns>A <see cref="T:Traysoft.AddTapi.TapiCall"/> object representing a consultation call to the forwarding destination.
            Most switches do not create a consultation call when setting up call forwarding. <c>SetupForwarding</c> returns <c>null</c>
            (<c>Nothing</c> in Visual Basic) if consultation call was not created.</returns>
            <remarks>
            <para>
            When an originating address (<c>address</c> parameter) or all addresses on the line are forwarded, the specified incoming calls
            are deflected to the other number by the switch. This method provides a combination of forward and
            do-not-disturb features. This method can also cancel forwarding currently in effect.
            </para>
            <para>
            Forwarding of the address(es) remains in effect until <c>SetupForwarding</c> is called again. The most recent forwarding list
            replaces the old one. Forwarding can be canceled by specifying <c>null</c> (<c>Nothing</c> in Visual Basic)
            as the <c>forwardingInstructions</c> parameter. If a <c>null</c> destination address is specified for an entry in the forwarding
            list, the operation acts as a do-not-disturb.
            </para>
            <para>
            Forwarding status of an address can also be affected externally; for example, by administrative actions at the switch or by a user
            from another station. It may not be possible for the TSP to be aware of this state change, and it may not be able to keep in
            synchronization with the forwarding state known to the switch.
            </para>
            </remarks>
            <example>The following code shows how to set up call forwarding. Error handling has been omitted for clarity.
            <para>C#</para>
            <code>
            TapiForwardEntry[] forward = new TapiForwardEntry[2];        
            forward[0] = new TapiForwardEntry(TapiForwardMode.Busy, "5551234567", null);
            forward[1] = new TapiForwardEntry(TapiForwardMode.NoAnswer, "101", null);
            TapiCall consultationCall = line.SetupForwarding(forward, 5, null);
            // We do not need the consultationCall
            if (consultationCall != null) consultationCall.Disconnect();
            </code>
            <para>VB.NET</para>
            <code>
            Dim forward As TapiForwardEntry() = New TapiForwardEntry(2) {}
            forward(0) = New TapiForwardEntry(TapiForwardMode.Busy, "5551234567", Nothing)
            forward(1) = New TapiForwardEntry(TapiForwardMode.NoAnswer, "101", Nothing)
            Dim consultationCall As TapiCall
            consultationCall = line.SetupForwarding(forward, 5, Nothing)
            ' We do not need the consultationCall
            If consultationCall Is Not Nothing Then
              consultationCall.Disconnect()
            End If
            </code>
            </example>
            <seealso cref="M:Traysoft.AddTapi.TapiAddress.GetForwardingInfo"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.Name">
            <summary>
            Gets the name of the line.
            </summary>
            <remarks>
            This property contains a user-friendly name of the telephony line device. This is the same name as displayed in the Telephony applet in the Control Panel.
            <alert class="note">
            Users can rename a line in the Control Panel. If the application stores configuration settings associated with the line,
            <see cref="P:Traysoft.AddTapi.TapiLine.PermanentID"/> should be used instead of <c>Name</c> as the line identifier.
            </alert>
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.PermanentID">
            <summary>
            Gets the permanent ID of the line.
            </summary>
            <remarks>
            <c>PermanentID</c> stays the same after the line is renamed or re-installed. If your application stores configuration settings associated with the line, you should use <c>PermanentID</c> instead of <see cref="P:Traysoft.AddTapi.TapiLine.Name"/> as the line identifier.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.WaitForCallerID">
            <summary>
            Indicates whether AddTapi.NET should wait for Caller ID to arrive before reporting or answering incoming calls.
            </summary>
            <remarks>
            After a new incoming call is detected, AddTapi.NET waits up to 3 seconds for Caller ID information
            to arrive before reporting or answering new incoming call.
            Set this property to <c>false</c> if you do not want AddTapi.NET to wait for Caller ID and process new incoming calls immediately.
            In this case the application will have to handle <see cref="E:Traysoft.AddTapi.TapiApp.CallInfo"/> event to find out when Caller ID information becomes available
            in the <see cref="T:Traysoft.AddTapi.TapiCall"/> object.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.SpeechVoice">
            <summary>
            Gets or sets text-to-speech voice to be used for text synthesis on the line.
            </summary>
            <remarks>
            This property sets the text-to-speech (TTS) voice to use for subsequent <see cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)">TapiCall.Speak</see> calls on the line.
            The list of available TTS voices is obtained from the <see cref="P:Traysoft.AddTapi.TapiApp.Voices"/> collection.
            To use default voice selected in the Speech applet in the Control Panel, set <c>SpeechVoice</c> property to <c>null</c> (<c>Nothing</c> in Visual Basic).
            </remarks>
            <example>The following code shows how to set text-to-speech voice for text synthesis on the line.
            <para>C#</para>
            <code>
            TapiApp.Initialize("MyApp");
            TapiLine line = TapiApp.Lines[0];
            TapiVoice voice = TapiApp.Voices[0];
            line.SpeechVoice = voice;
            </code>
            <para>VB.NET</para>
            <code>
            TapiApp.Initialize("MyApp")
            Dim objLine As TapiLine
            objLine = TapiApp.Lines(0)
            Dim objVoice As TapiVoice
            objVoice = TapiApp.Voices(0)
            objLine.SpeechVoice = objVoice;
            </code>
            </example>
            <seealso cref="P:Traysoft.AddTapi.TapiApp.Voices"/>
            <seealso cref="M:Traysoft.AddTapi.TapiCall.Speak(System.String,System.Boolean)"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.SpeechRate">
            <summary>
            Gets or sets the rate of speech on the line.
            </summary>
            <remarks>
            This property specifies the speaking rate (speed) of the voice.
            Supported values range from -10 to 10, where -10 is the slowest and 10 is the fastest rate.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.SpeechVolume">
            <summary>
            Gets or sets the volume of speech on the line.
            </summary>
            <remarks>
            This property specifies the volume level of text synthesis. Volume levels are specified in percentage values ranging from zero to 100.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.NoAnswerTimeout">
            <summary>
            Gets or sets the number of seconds AddTapi.NET should wait for an answer on outgoing calls.
            </summary>
            <remarks>
            When AddTapi.NET makes an outgoing call, it waits <c>NoAnswerTimeout</c> seconds for an answer before reporting that the call was disconnected because of no answer.
            <alert class="caution">
            The line must support predictive dialing (also called hardware answer detection) in order for AddTapi.NET to detect if outgoing call was answered.
            Most voice modems do not support predictive dialing and report that the call is connected immediately after the number has been dialed, before called party picks up the phone.
            In such case this property is ignored and "no answer" is never reported.
            </alert>
            </remarks>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.CallConnected"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.CallDisconnected"/>
            <seealso cref="T:Traysoft.AddTapi.TapiDisconnectMode"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.RingsToAnswer">
            <summary>
            Gets or sets the number of rings AddTapi.NET should wait before answering incoming calls.
            </summary>
            <remarks>
            This property specifies how long AddTapi.NET waits before answering incoming calls.
            Set this property to zero if you do not want the application to answer all incoming calls automatically.
            Call <see cref="M:Traysoft.AddTapi.TapiCall.Answer"/> method in order to answer the call when <c>RingsToAnswer</c> is set to zero.
            <alert class="note">
            If telephony hardware reports incoming ring count, AddTapi.NET waits the specified number of rings.
            If incoming ring count is not available, AddTapi.NET waits <c>RingsToAnswer</c> * 6 seconds before answering a call.
            </alert>
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.SupportsVoice">
            <summary>
            Indicates whether the line suppots voice functions.
            </summary>
            <remarks>
            This property shows if the line supports voice functions, such as playing wave files and speaking text.
            Line devices that do not support voice cannot be opened in voice mode.
            If you try to open such line in automated voice mode using <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler,Traysoft.AddTapi.TapiMediaMode)"/>, AddTapi.NET will throw <see cref="T:Traysoft.AddTapi.TapiException"/>.
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler,Traysoft.AddTapi.TapiMediaMode)"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.IsOpen">
            <summary>
            Indicates whether the line has been opened for incoming or outgoing calls.
            </summary>
            <remarks>
            This property is <c>true</c> if the line is currently open, i.e. <see cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/> was called and the line was not closed yet using <see cref="M:Traysoft.AddTapi.TapiLine.Close"/>.
            Line has to be open in order to place outgoing calls or receive incoming calls on the line. 
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Open(System.Boolean,Traysoft.AddTapi.TapiCallHandler)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.Close"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.AudioOutputBufferSize">
            <summary>
            Gets or sets the size of the audio output buffer, in milliseconds.
            </summary>
            <remarks>
            This property specifies the size of audio buffer used to play wave files and speak text on the line.
            You can adjust audio buffer size if you get "choppy" sound. Default size of the audio output buffer is 500 milliseconds.
            Valid range is 200 - 5000. In addition to setting <c>AudioOutputBufferSize</c> property,
            you might need to adjust audio buffer size in the device driver of the telephony hardware to get the best output quality.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.AudioInputBufferSize">
            <summary>
            Gets or sets the size of the audio input buffer, in milliseconds.
            </summary>
            <remarks>
            This property specifies the size of audio buffer used to record wave files on the line.
            You can adjust audio buffer size if you get "choppy" sound recordings. Default size of the audio input buffer is 100 milliseconds.
            Valid range is 50 - 2000. In addition to setting <c>AudioInputBufferSize</c> property,
            you might need to adjust audio buffer size in the device driver of the telephony hardware to get the best input quality.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.AudioOutputFormat">
            <summary>
            Gets or sets the format of audio output.
            </summary>
            <remarks>
            This property specifies the format for the audio output on the line.
            Default value is <c>TapiAudioFormat.Default</c>,
            which means that AddTapi.NET will detect supported audio format automatically.
            Some telephony devices do not report supported audio formats properly. You will need to
            set <c>AudioOutputFormat</c> to a specific format (for example <c>TapiAudioFormat.PCM_8kHz16BitMono</c>)
            for such devices.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.AudioInputFormat">
            <summary>
            Gets or sets the format of audio input.
            </summary>
            <remarks>
            This property specifies the format for the audio input on the line.
            Default value is <c>TapiAudioFormat.Default</c>,
            which means that AddTapi.NET will detect supported audio format automatically.
            Some telephony devices do not report supported audio formats properly. You will need to
            set <c>AudioInputFormat</c> to a specific format (for example <c>TapiAudioFormat.PCM_8kHz16BitMono</c>)
            for such devices.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.OpenMediaModes">
            <summary>
            Indicates for which media types (modes) the line device is currently open.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.AvailableMediaModes">
            <summary>
            Indicates which media types (modes) the line device supports.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.Addresses">
            <summary>
            Gets a list of addresses available on the line.
            </summary>
            <remarks>
            Telephony system is modeled as a set of lines represented by <see cref="T:Traysoft.AddTapi.TapiLine"/> objects,
            each with one or more addresses represented by <see cref="T:Traysoft.AddTapi.TapiAddress"/> objects.
            Most systems have one line for each phone number or extension, with one address on each line.
            Use <c>Addresses</c> property to obtain a list of available addresses for systems
            with multiple addresses on each line.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.DeviceSpecificExtensionID">
            <summary>
            Gets an identifier of the device specific extension supported by the line device.
            </summary>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Four IDs in <see cref="T:Traysoft.AddTapi.TapiDeviceSpecificExtensionID"/> together specify a universally unique extension
            identifier that identifies a line device class extension.
            All 4 IDs are zeros if the line provides no extensions.
            </para>
            <para>
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.DeviceSpecificExtensionVersion">
            <summary>
            Gets negotiated version of the device specific extension in use on the line.
            </summary>
            <value>
            A version number of the device specific extension negotiated using <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>.
            The high-order word is the major version number; the low-order word is the minor version number.
            For example, version 2.1 is represented as 0x00020001 (hex 20001).
            </value>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.Calls">
            <summary>
            Gets a list of calls on the line.
            </summary>
            <remarks>
            <c>Calls</c> is a collection of <see cref="T:Traysoft.AddTapi.TapiCall"/> objects representing calls on the line.
            This collection is updated automatically when a new call appears on the line or when a call becomes idle.
            Your application can subscribe to <see cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/> and <see cref="E:Traysoft.AddTapi.TapiApp.OutgoingCall"/>
            events to receive notifications when a new incoming or outgoing call is detected.
            </remarks>
            <seealso cref="T:Traysoft.AddTapi.TapiCall"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.IncomingCall"/>
            <seealso cref="E:Traysoft.AddTapi.TapiApp.OutgoingCall"/>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.DeviceStatus">
            <summary>
            Gets the current status of the line device.
            </summary>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.DisconnectOnBusy">
            <summary>
            Specifies if calls on the line should be automatically disconnected when a busy signal is detected.
            </summary>
            <remarks>
            <para>
            If <c>DisconnectOnBusy</c> property is <c>true</c> (default value), AddTapi.NET disconnects
            the call and sets <see cref="P:Traysoft.AddTapi.TapiCall.DisconnectMode"/> to <see cref="F:Traysoft.AddTapi.TapiDisconnectMode.Busy"/>
            when a busy signal is detected. This behavior is appropriate for most applications.
            </para>
            Set <c>DisconnectOnBusy</c> property to <c>false</c> if the application needs to control
            when busy calls are disconnected. Please note that the application has to call
            <see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/> in order to disconnect the call in busy state and
            release the line.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.MaxNumActiveCalls">
            <summary>
            Gets the maximum number of calls that can be active on the line.
            </summary>
            <value>
            Maximum number of (minimum bandwidth) calls that can be active
            (connected) on the line at any one time. The actual number of
            active calls may be lower if higher bandwidth calls have been
            established on the line.
            </value>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.ProviderInfo">
            <summary>
            Gets the Telephony Service Provider (TSP) information for the line.
            </summary>
            <remarks>
            <c>ProviderInfo</c> provides information about the provider hardware and/or software, such as the vendor name and version numbers of hardware and software.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.SwitchInfo">
            <summary>
            Gets the switch (PBX) information for the line.
            </summary>
            <remarks>
            <c>SwitchInfo</c> provides information about the switch to which the line device is connected, such as the switch manufacturer, the model name, the software version, and so on.
            </remarks>
        </member>
        <member name="P:Traysoft.AddTapi.TapiLine.DeviceSpecificInfo">
            <summary>
            Gets device specific information about the line device.
            </summary>
            <remarks>
            <para>
            Many TSPs provide functionality specific to the telephony system using device specific extensions.
            Please refer to the TAPI documentation for the telephony hardware to find out
            about device specific functionality supported by the telephony service provider.
            </para>
            <para>
            <c>DeviceSpecificInfo</c> property allows the application to retrieve device specific information about the line.
            The information provided in <c>DeviceSpecificInfo</c> property is described in TAPI documentation for the telephony hardware.
            </para>
            <para>
            The application has to negotiate a version of the extension supported by the line device using
            <see cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/> before opening the line in order
            to use device specific functionality.
            </para>
            </remarks>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.NegotiateDeviceSpecificExtensionVersion(System.UInt32,System.UInt32)"/>
            <seealso cref="M:Traysoft.AddTapi.TapiLine.DeviceSpecific(System.Object,Traysoft.AddTapi.TapiAddress,Traysoft.AddTapi.TapiCall,System.Type)"/>
        </member>
        <member name="T:Traysoft.AddTapi.TapiLineDeviceState">
            <summary>
            Describes various device state changes in the <see cref="E:Traysoft.AddTapi.TapiApp.LineDeviceState"/> event.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Ringing">
            <summary>
            The ring signal is detected on the line. The application is notified on each ring cycle by repeated <see cref="E:Traysoft.AddTapi.TapiApp.LineDeviceState"/> events with the <c>Ringing</c> flag set.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Connected">
            <summary>
            The line was previously disconnected and is now connected to TAPI.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Disconnected">
            <summary>
            This line was previously connected and is now disconnected from TAPI.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.MsgWaitOn">
            <summary>
            The message waiting indicator is turned on.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.MsgWaitOff">
            <summary>
            The message waiting indicator is turned off.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.InService">
            <summary>
            The line is connected to TAPI. This happens when TAPI is first activated or when the line wire is physically plugged in and in-service at the switch while TAPI is active.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.OutOfService">
            <summary>
            The line is out of service at the switch or physically disconnected. TAPI cannot be used to operate on the line device.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Maintenance">
            <summary>
            Maintenance is being performed on the line at the switch. TAPI cannot be used to operate on the line device.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Open">
            <summary>
            The line has been opened by another application.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.Close">
            <summary>
            The line has been closed by another application.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.NumCalls">
            <summary>
            The number of calls on the line device has changed.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.DeviceSpecific">
            <summary>
            The line's device-specific information has changed. The application should check <see cref="P:Traysoft.AddTapi.TapiLineDeviceStatus.DeviceSpecificInfo"/> for updated information.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiLineDeviceState.All">
            <summary>
            A mask that includes all line device states.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallFeatures">
            <summary>
            Indicate operations that can be invoked for a given address or call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Accept">
            <summary>
            Accept the call (<see cref="M:Traysoft.AddTapi.TapiCall.Accept"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Answer">
            <summary>
            Answer the call (<see cref="M:Traysoft.AddTapi.TapiCall.Answer"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.BlindTransfer">
            <summary>
            Perform a blind (one-step) transfer on the call (<see cref="M:Traysoft.AddTapi.TapiCall.Transfer(System.String)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.CompleteTransfer">
            <summary>
            Complete the call transfer (<see cref="M:Traysoft.AddTapi.TapiCall.CompleteTransfer(Traysoft.AddTapi.TapiCall,System.Boolean)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Dial">
            <summary>
            Dial the destination number for the call (<see cref="M:Traysoft.AddTapi.TapiCall.Dial(System.String)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Drop">
            <summary>
            Drop (disconnect) the call (<see cref="M:Traysoft.AddTapi.TapiCall.Disconnect"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.GatherDigits">
            <summary>
            Gather digits from the call (<see cref="M:Traysoft.AddTapi.TapiCall.GatherDigits(System.Int32,System.String,System.Int32,System.Int32)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.GenerateDigits">
            <summary>
            Generate digits on the call (<see cref="M:Traysoft.AddTapi.TapiCall.GenerateDigits(System.String)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Hold">
            <summary>
            Put the call on hold (<see cref="M:Traysoft.AddTapi.TapiCall.Hold"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.MonitorDigits">
            <summary>
            Monitor digits on the call (<see cref="M:Traysoft.AddTapi.TapiCall.WaitForDigit(System.Int32)"/> and <see cref="E:Traysoft.AddTapi.TapiApp.DigitDetected"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.MonitorTones">
            <summary>
            Monitor silence and tones on the call (<see cref="M:Traysoft.AddTapi.TapiCall.WaitForSilence(System.Int32,System.Int32)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Park">
            <summary>
            Park the call (<see cref="M:Traysoft.AddTapi.TapiCall.Park(System.String)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.PrepareAddToConference">
            <summary>
            Prepare the call for addition to a conference (<see cref="M:Traysoft.AddTapi.TapiCall.PrepareAddToConference"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.Redirect">
            <summary>
            Redirect the call to another destination (<see cref="M:Traysoft.AddTapi.TapiCall.Redirect(System.String)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.RemoveFromConference">
            <summary>
            Remove the call from the conference (<see cref="M:Traysoft.AddTapi.TapiCall.RemoveFromConference"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.SetupConference">
            <summary>
            Set up a conference (<see cref="M:Traysoft.AddTapi.TapiLine.SetupConference(Traysoft.AddTapi.TapiCall,Traysoft.AddTapi.TapiCall@,System.Int32)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.SetupTransfer">
            <summary>
            Set up a transfer (<see cref="M:Traysoft.AddTapi.TapiCall.SetupTransfer"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.SwapHold">
            <summary>
            Perform a swap hold operation (<see cref="M:Traysoft.AddTapi.TapiCall.SwapHold(Traysoft.AddTapi.TapiCall)"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.UnHold">
            <summary>
            Take the call off hold (<see cref="M:Traysoft.AddTapi.TapiCall.Unhold"/>).
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallFeatures.All">
            <summary>
            A mask that includes all call features.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiVoice">
            <summary>
            Represents a text-to-speech voice available on the computer.
            </summary>
        </member>
        <member name="M:Traysoft.AddTapi.TapiVoice.ToString">
            <summary>
            Overriden. Returns a string that contains the name of the voice.
            </summary>
            <returns>A string that contains the name of the voice.</returns>
        </member>
        <member name="P:Traysoft.AddTapi.TapiVoice.Name">
            <summary>
            Gets the name of the voice.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiDisconnectMode">
            <summary>
            Describes different reasons for a disconnect of a call.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Unknown">
            <summary>
            The reason for the disconnect is unknown but may become known later.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Normal">
            <summary>
            The call was terminated normally either locally or by a remote party.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Busy">
            <summary>
            The called number is busy.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.NoAnswer">
            <summary>
            The called party did not answer within the specified timeout.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.NoDialTone">
            <summary>
            A dial tone was not detected.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Error">
            <summary>
            The call was terminated because of an error.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.OutOfOrder">
            <summary>
            The call could not be connected or was disconnected because the destination device is out of order.
            This could occur if for example there was a hardware failure.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Forwarded">
            <summary>
            The call was forwarded by the switch.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Pickup">
            <summary>
            The call was picked up from elsewhere.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.Cancelled">
            <summary>
            The call was cancelled.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiDisconnectMode.BadAddress">
            <summary>
            The destination address (phone number or extension) is invalid.
            </summary>
        </member>
        <member name="T:Traysoft.AddTapi.TapiCallInfoState">
            <summary>
            Describes various call information items in the <see cref="E:Traysoft.AddTapi.TapiApp.CallInfo"/> event.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.Origin">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.Origin"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.Reason">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.Reason"/> for the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.Trunk">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.Trunk"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.CallerID">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.CallerID"/> or <see cref="P:Traysoft.AddTapi.TapiCall.CallerIDName"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.CalledID">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.CalledID"/> or <see cref="P:Traysoft.AddTapi.TapiCall.CalledIDName"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.ConnectedID">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.ConnectedID"/> or <see cref="P:Traysoft.AddTapi.TapiCall.ConnectedIDName"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.RedirectionID">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.RedirectionID"/> or <see cref="P:Traysoft.AddTapi.TapiCall.RedirectionIDName"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.RedirectingID">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.RedirectingID"/> or <see cref="P:Traysoft.AddTapi.TapiCall.RedirectingIDName"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.Display">
            <summary>
            The <see cref="P:Traysoft.AddTapi.TapiCall.Display"/> of the call has changed or became available.
            </summary>
        </member>
        <member name="F:Traysoft.AddTapi.TapiCallInfoState.All">
            <summary>
            A mask that includes all call info states.
            </summary>
        </member>
    </members>
</doc>
