Jabra SDK Core for Windows User Guide

Revision History

Revision Date Author Description
4.3 2018-09-27 Removed load and save settings interfaces
4.2 2018-09-25 Mathias Immerkaer Updated library interfaces - Removed lock references
4.1 2018-04-12 Abhishek Rao Updated library interfaces
4.0 2017-12-12 Abhishek Rao Updated library interfaces
3.0 2017-11-10 Charanteja EguvaintiBabu Updated features of dongle & child separation and Firmware Updater download from cloud.
2.0 2017-08-24 Charanteja EguvaintiBabu Updated features for Save & Load Setting, Logging and Firmware Updater.
1.0 2017-05-09 Chandrashekar D Kadlajji Initial Draft

Introduction

Jabra SDK V2 is a dynamic linking library (dll), provides interfaces to perform below functionalities in Jabra devices:

  • Device Settings: Allows the user to view and change settings of the attached Jabra devices
  • Remote Call control (RCC): Allows user to perform remote call control functionalities
    • Get and set HID reports to and from the attached Jabra device
    • Answer and End
    • Mute and Unmute Call
    • Ring indication
    • Hold and Resume Call
    • Manual Audio
  • Get device serial number, battery status if supported by the device
  • Button configuration (button takeover and remote MMI)
  • Child device support with Link360, Link370
  • Busy light indication
  • Concurrency support for multiple applications of SDK
  • Co-existence with Jabra Direct
  • Device events logging
  • Device firmware update

The SDK is built as a C++ dynamic library with C interfaces.

Abbreviations and Acronyms

Acronym Description
API Application Programming Interface
DLL Dynamic Linked Library
HID Human Interface Device
SDK Software Development Kit
IDE Integrated Development Environment
USB Universal Serial Bus
HTTP Hypertext Transfer Protocol
JSON JavaScript Object Notation
WPF Windows Presentation Foundation
RCC Remote Call Control
MMI Man Machine Interface
FWU Firmware Updater

SDK Installation

SDK Windows release package would consist of the following directories:

  • demo - Demo application and it's source code
  • doc - user guide and release notes
  • library - static and dynamic libraries required for development and header files
  • readme text file

The directories contain following assets:

Assets Description
readme.txt Provides information on Jabra SDK V2
doc/Jabra SDK V2 User Guide Windows 4.1.pdf User Guide and API documentation
doc/Jabra_SDK_V2_API_Doc.chm Doxygen generated API documentation
doc/ReleaseNotes.txt Release information and supported devices listv
library/[platform]/libjabra.dll Jabra SDK dynamic library for platform (x86 and x64)
library/[platform]/libjabra.lib Static library for platform (x86 and x64)
library/Headers/JabraNativeHid.h Header file defining the RCC APIs
library/Headers/JabraDeviceConfig.h Header file defining the dynamic setting APIs
library/Headers/Common.h Header file defining the common interfaces used across Jabra SDK V2
demo/Jabra SDK Demo Demo application
demo/src Demo application source code (Visual Studio C# project)
Wrapper/Nuget/jabrasdk.1.2.1994.nupkg Jabra SDK .Net Wrapper

Supported Jabra Devices

The following Jabra devices are supported by the SDK:

  • PRO 9470, PRO 9460, PRO 9450, Biz 2300, Motion Office, Evolve 65 USB, Biz 2400 II CC, PRO 930, PRO 935 (single and dual), PRO 925 (single and dual), Evolve 40 /80, Link 265, Evolve 30 || (Joker), Evolve 20 /30, Biz 1500, Biz 2400 II, Evolve 30, Link 260, Evolve 75, Evolve 75E, Engage 65 /75
  • Motion UC (Over BT)
  • Link 360, Link 370
  • Speak 410, Speak 510, Speak 710, Speak 810
  • Link 230, Link 850, Link 860 => Only settings applicable

Note: The headset may be wireless but the connection to the system must be via USB (e.g. using a Jabra LINK 360 Bluetooth USB Adapter). In present scope, the library does not support Jabra Bluetooth headsets that are directly connected to the Windows system via Bluetooth.

Prerequisites

The prerequisites for the SDK are:

Developing application Using Jabra SDK V2

System requirements

  • Windows version: 7(32 bit & 64 bit) and above
  • Visual Studio: 2015
  • Microsoft .NET framework version 4.5.2 and above
  • Network connection

Library Interfaces

Common.h: Common interfaces for device
API Name Description
Jabra_GetVersion Gets the version of the SDK library
Jabra_SetAppID Application should set the application name using this interface. The Client ID/App ID must be obtained by registering to Jabra portal by App developers. This is a mandatory step, which needs to be done before initialization, failing which, callbacks will not be registered with SDK
Jabra_Initialize Initializes the Jabra library. Argument details to the function are described here: Library Initialization
Jabra_Uninitialize Performs library memory cleanup
Jabra_IsFirstScanForDevicesDone Checks if device scan during initialization is done. It is recommended to register for the corresponding callback during initialization
Jabra_IsDeviceAttached Checks if a device is attached. It is recommended to register for the corresponding callback during initialization
Jabra_GetAttachedJabraDevices Gets the list of attached Jabra devices
Jabra_GetBatteryStatus Queries the current battery status with info of charging state and low battery indication. Only supported by devices with a battery
Jabra_GetSerialNumber Returns the serial number of the specified Jabra device. The serial number is provided by an online Jabra service and hence requires network access
Jabra_GetFirmwareVersion Returns the firmware version of the specified Jabra device
Jabra_GetDeviceImagePath Gets the attached device image path. The image is provided by Jabra Cloud service (and stored in the device’s local directory) and hence requires network access for the first time
Jabra_GetDeviceImageThumbnailPath Gets the device thumbnail image. The image is provided by Jabra cloud service (and stored in the device’s local directory) and hence requires network access for the first time
Jabra_FreeDeviceInfo Frees the device information structure members. This is called right after handling device attach event by the application
Jabra_ConnectToJabraApplication Integrates softphone app to Jabra applications like Jabra Direct (JD)
Jabra_DisconnectFromJabraApplication Disconnects the Jabra SDK application from Jabra Direct
Jabra_SetSoftphoneReady Sets the softphone to ready
Jabra_IsSoftphoneInFocus Indicates whether the softphone is in focus
Jabra_SetBTPairing Sets the Bluetooth device into pairing mode
Jabra_SearchNewDevices Query for available Bluetooth devices which are switched on, within range and ready to connect
Jabra_StopBTPairing Stops the search for available Bluetooth devices
Jabra_SetAutoPairing Enables/disables auto pairing. When Bluetooth adapter is plugged into the PC it will attempt to connect with the last connected Bluetooth device. If it cannot connect, it will automatically search for new Bluetooth devices to connect to if auto pairing is set
Jabra_GetAutoPairing Queries whether auto pairing mode is enabled or disabled
Jabra_ClearPairingList Clears the list of paired Bluetooth devices to the Bluetooth adapter
Jabra_ConnectBTDevice Connect/Reconnect Bluetooth device to the Jabra Bluetooth adapter. Ensure the Bluetooth device is switched on and within range
Jabra_ConnectNewDevice Connects to Bluetooth device with specified device details
Jabra_DisconnectBTDevice Disconnects Bluetooth device from Bluetooth adapter
Jabra_GetConnectedBTDeviceName Queries the name of connected Bluetooth device with Bluetooth Adapter
Jabra_GetErrorString Returns the error string from the error status
Jabra_IsBusylightSupported Checks if busylight is supported by the device
Jabra_GetBusylightStatus Checks the status of busylight
Jabra_SetBusylightStatus Enables/Disables the busylight status
Jabra_RegisterBusylightEvent Registration of callback to receive busylight events
Jabra_RegisterPairingListCallback Register callback to receive list of paired devices with BT adapter
Jabra_IsPairingListSupported Checks if pairing list is supported by the device
Jabra_GetPairingList Gets the list of devices which are paired previously to Bluetooth adapter
Jabra_FreePairingList Frees the memory allocated for the list of paired devices
Jabra_ConnectPairedDevice Connect a device which was already paired
Jabra_DisConnectPairedDevice Disconnect a paired device
Jabra_ClearPairedDevice Clears the specified device from paired device list
Jabra_IsRemoteMMISupported Checks if remote MMI feature is supported by the device
Jabra_GetButtonFocus Configures the remote MMI events for a device
Jabra_ReleaseButtonFocus Releases the remote MMI events configured in the device
Jabra_GetSupportedButtonEvents Gets the supported remote MMI for a device
Jabra_FreeButtonEvents Free the memory allocated for the button events
Jabra_RegisterForGNPButtonEvent Register callback function to get notified on GNP Button events
Jabra_ConfigureLogging API to configure the logging of events.
Jabra_RegisterLoggingCallback Register callback function for logging.
Jabra_GetWarrantyEndDate Gets the warranty end date if the device is in warranty period else returns a null pointer.
Jabra_CheckForFirmwareUpdate Checks if any latest firmware is available on the server.
Jabra_GetLatestFirmwareInformation Gives the latest available firmware on the server based on user request.
Jabra_FreeFirmwareInfo Frees the memory allocated for the firmware information.
Jabra_DownloadFirmware Downloads the selected firmware version.
Jabra_GetFirmwareFilePath Gets the file path where the firmware file for the respective version has been downloaded.
Jabra_UpdateFirmware Updates the firmware of the device to the firmware version specified.
Jabra_CancelFirmwareDownload Cancels the firmware download.
Jabra_RegisterFirmwareProgressCallBack Registers firmware progress callback to get notified about firmware download progress.
Jabra_GetLastFirmwareUpdateErrorInfo API to get the detailed error response for the last firmware action performed.
Jabra_FreeFirmwareErrorInfo Frees the memory allocated for the firmware error info structure.
Jabra_GetESN Gets ESN (electronic serial number) of the device
Jabra_GetCurrentLanguageCode Gets the language code for the current language of the device
Jabra_IsLeftEarbudStatusSupported Checks if left earbud status supported by the device
Jabra_GetLeftEarbudStatus Gets left earbud connection status of the device
Jabra_RegisterLeftEarbudStatus Registers left earbud connection status event. Can only be called when a device is attached
Jabra_RegisterHearThroughSettingChangeHandler Registers HearThrough setting change event. Can only be called when a device is attached
Jabra_IsEqualizerSupported Checks if equalizer is supported by the device
Jabra_IsEqualizerEnabled Checks if equalizer is enabled in the device
Jabra_EnableEqualizer Enables/disables equalizer in the device
Jabra_GetEqualizerParameters Gets equalizer parameters for a device
Jabra_SetEqualizerParameters Set equalizer parameters for a device
Jabra_GetNpsUrl Get the NPS URL based on device, app name and app version
Jabra_ProductRegistration Registers a product with the provided information
Jabra_ExecuteAVRCPCommand Tells the device to execute a AVRCP command
Jabra_Reconnect Recreates the session, Input and Output streams for all devices which are connected to the phone and not to the app
Jabra_IsFeatureSupported Checks if a feature is supported by a device
Jabra_GetSupportedFeatures Gets array of features supported by a device
Jabra_FreeSupportedFeatures Frees a list of features obtained by calling Jabra_GetSupportedFeatures
Jabra_GetMultiESN Get ESN for all device components
Jabra_FreeMap Release memory allocated by functions returning a Map_Int_String*
Jabra_GetSearchDeviceList Gets the list of new devices which are available to pair & connect
Jabra_RequestNoHangupToneNextTime Request that the headset does not play its 'end of call' tone when the SCO closes next time.
Jabra_IsCertifiedForSkypeForBusiness Indicates whether the device is certified for Skype for Business
Jabra_FreeCharArray Free a char array
Jabra_IsUploadRingtoneSupported Checks if ringtone upload is supported by the device
Jabra_UploadRingtone Upload ringtone to device
Jabra_RegisterUploadProgress Registration for upload progress event
Jabra_IsUploadImageSupported Checks if image upload is supported by the device
Jabra_UploadImage Upload image to device
Jabra_IsSetDateTimeSupported Checks if date and time synchronization is supported by the device
Jabra_SetDateTime Set date and time to device
Jabra_GetSupportedDeviceEvents Supported events by device
Jabra_SetSubscribedDeviceEvents Set device events to subscribe to
Jabra_GetAudioFileParametersForUpload Get details of audio file for uploading to device
Jabra_UploadWavRingtone Upload ringtone to device in .wav format
JabraDeviceConfig.h: Device setting interfaces
API Name Description
Jabra_GetSettings Gets the attached Jabra device setting. Returns pointer to the device settings structure containing all settings for a particular device
Jabra_FreeDeviceSettings Once the device setting is requested by the application, memory needs to be freed by calling this API by the application
Jabra_SetSettings Updates/Sets the setting details of the attached Jabra device. Returns a return code to indicate if settings were applied successfully or not
Jabra_FreeString Once the device image path is requested, application needs to release the memory by calling this API to prevent memory leak
Jabra_GetFailedSettingNames Queries the list of failed setting names
Jabra_FreeFailedSettings Memory of failed setting names can be released by the application using this interface to prevent memory leak
Jabra_IsFactoryResetSupported Returns whether the device supports factory reset
Jabra_FactoryReset Restores to factory settings of the device
Jabra_FreeDeviceSettings Memory allocated to device settings can be released by the application using this interface to prevent memory leak
Jabra_GetSetting Gets the unique setting identified by a GUID of a device
Jabra_GetNamedAsset Requests a named asset for the specified device
Jabra_FreeAsset Releases an asset previously obtained with Jabra_GetNamedAsset()
Jabra_GetSetting Gets the unique setting identified by a GUID of a device
JabraNativeHID.h: RCC interfaces
API Name Description
Jabra_IsOffhookSupported Returns true if off hook is supported for a specific Jabra device
Jabra_SetOffhook Set the specified device off hook/on hook
Jabra_IsRingerSupported Returns true if ringer is supported for a specific Jabra device
Jabra_SetRinger Set ringer on/off for the specified device
Jabra_IsMuteSupported Returns true if ringer is supported for a specific Jabra device
Jabra_SetMute Set mute on/off for the specified device
Jabra_IsHoldSupported Returns true if hold is supported for a specific Jabra device
Jabra_SetHold Set hold on/off for the specified device
Jabra_IsOnlineSupported Returns true if online mode is supported for a specific Jabra device
Jabra_SetOnline Turn online mode on/off for a wireless headset. Online mode opens an audio link (radio link) between a base/dongle and a headset
Jabra_WriteHIDCommand Interface for sending HID output reports with device ID, Usage Page and Usage. This function is for advanced users. It is recommended to use the dedicated functions: Jabra_SetOffHook, Jabra_SetRinger, Jabra_SetMute, Jabra_SetHold, and Jabra_SetOnline

Steps to initialize the library

The below steps are mandatory for initializing the Jabra SDK

  • Valid App ID/Client ID must be set to SDK using Jabra_SetAppID API. If app id is not set, SDK initialization will fail. Kindly note, App ID/Client ID must be obtained by the application developers by registering with Jabra portal - https://developer.jabra.com/
  • The library is initialized using the Jabra_Initialize API. The arguments consist of pointers to five callback functions and an instance number
Parameter Description
FirstScanForDeviceDoneFunc This callback function is called when the library has finished the initial scanning for Jabra devices
DeviceAttachedFunc This callback function is called when a new Jabra device is attached or the library has been initialized and found a Jabra device
DeviceRemovedFunc This callback function is called when a Jabra device is removed
ButtonInDataRawHidFunc This callback function is called when new input data has been received. Data is raw HID data
ButtonInDataTranslatedFunc This callback function is called when new input data has been received. Data is represented at a higher level of abstraction than the raw HID data
Instance Optional instance number. Can be 0 if not used

Important: As callbacks are executed in SDK context, application must perform only small/light-weight activity. For bulky functionality, it should continue using application thread

Library initialization must be done only once. Before process shutdown Jabra_Uninitialize() must be called in order to perform memory cleanup.

Note: For RCC to be reflected in device, HID button inputs from a device to the PC must be acknowledged by the OS. Otherwise the next button input transition will not be detected by the system. A button input is acknowledged by setting the corresponding button output to the same value as the input value. For example, when you receive an OffHook = true, you must call Jabra_SetOffHook (deviceId, true). After acknowledging the input you can set the new desired state. For example, to reject the off-hook request you could call Jabra_SetOffHook (deviceId, false).

C# Application

User has an option to develop an application using C++ by directly consuming C interfaces. But if the application is developed in C#, a wrapper has to be created to use the APIs from these libraries.

C\# Application

Refer Library Interfaces

64-Bit Support

The library has support for both 32 bit and 64 bit applications. Two separate dll files built for x86(32 bit) and x64(64 bit) would be shared. Application developers must use the respective dll file.

Debug logging

SDK provides logging to troubleshoot issues. By default, log level is set to Warning.

Debug logs can be enabled by setting the environment variable (LIBJABRA_TRACE_LEVEL to debug) from command prompt or editing LIBJABRA_TRACE_LEVEL in system environment variables. Other supported log levels are - fatal, error, warning.

The logs will be placed at %appdata%\JabraSDK or...\AppData\Roaming\JabraSDK by default, if the environment variable LIBJABRA_RESOURCE_PATH is not set.

Application log file size is restricted to 10 MB, log exceeding this size new files are created.

10 latest log files can be stored, after that on new log file creation the oldest log is deleted.

Note: Application restart is required, in case the log environment variable is changed.

Points to Remember

  • Concurrency is maintained between all the applications which uses Jabra SDK library and Jabra Direct
  • Dependent settings are some special settings which depend on other settings. For example, based on the value of one setting, other setting(s) may get enabled or disabled
    • Application needs to handle dependency settings, based on the flag isDepedentsetting in exposed settingInfo structure
    • ListKeyValue (structure) in each setting (mainly for drop down control settings) will contain list of possible values. Along with this, ListKeyValue will also have dependent settings details
    • For each values in the ListKeyValue structure,
    • dependentcount will have the information of how many settings are dependent for this value. It will be zero, if no settings are dependent.
    • If dependentcount is non-zero, then DependencySetting (structure) will have the details of the settings, which are dependent
    • DependencySetting will have setting GUID and a flag to say whether to enable or disable
    • For some settings when disabled because of dependency, the value needs to be changed to default value. dependentDefaultValue in settingInfo structure will have default value
  • PC settings are settings, which application needs to handle as it is not device settings. And the exposed settingInfo structure has the flag, isPCsetting, to identify whether it is PC setting or not
  • Any string input given should be terminated with a NULL pointer
  • Validations like regular expression, min length, max length etc. for string input needs to be handled by application
  • The button configurations done for remote MMI should be cleared/reset on device unplug or exit of the application. The application should perform button configuration again on next start up
  • Since device does not provide any information on currently configured remote MMI\'s, it is purely demo app logic to maintain the remote MMI configurations for a device. Different instances of demo app will not know the remote MMI configured as device does not support reading of current remote MMI configurations
  • Remote MMI is restricted when supported device is paired with Dongle
  • If any of the settings fails while retrieving from the device, device settings structure will be null pointer
  • 3rd party developers have to register for the authorization token for firmware updater
  • For firmware update feature, firmware updater application (JabraSDKFirmwareUpdater) needs to be installed. It will be downloaded from cloud as part of firmware file download for Jabra device from Jabra_DownloadFirmware API
  • Jabra_DownloadFirmware API to be called before calling firmware update API to get the firmware file path

Bluetooth/Dongle devices

  • The USB dongle and the paired Bluetooth headset is shown as separate entries
  • The call control is not supported for USB dongles (e.g. Jabra Link 360) unless they are paired with a Bluetooth headset
  • Only USB devices can be reset to default factory setting
  • When Dongle is paired with the Speak 710 device, if the user change shared use setting to off in Speak 710, then the device will disconnect the Bluetooth connection with the Dongle.

Sample application Code

Both source code and binary files for the demo application are packed along with this SDK. The demo application is a C# WPF Application built using .net framework 4.5 and C# bindings. The test program demonstrates library initialization, usage of remote call controls and device settings features using Jabra SDK V2.

Device Information View

Device Information View

Device Settings View

Device Settings View

Call Control View

Call Control View

Device information while Bluetooth dongle is connected

Device information while Bluetooth dongle is connected

Device connected to PC over Bluetooth via dongle

Device connected to PC over Bluetooth via dongle

BT Pairing while headset is connected to PC via dongle

BT Pairing while headset is connected to PC via dongle

Mapping of Button Events with user actions.

Mapping of Button Events with user actions.

Authorization Tab to generate authorization key for Firmware Updater

Authorization Tab to generate authorization key for Firmware Updater

Firmware Updater view

Firmware Updater view

Firmware updater -- initiate check for updates

Firmware updater -- initiate check for updates

Firmware Updater View -- List's latest Firmware available.

Firmware Updater View -- List's latest Firmware available.

Firmware Updater View -- Download specific firmware.

Firmware Updater View -- Download specific firmware.

Firmware Updater installation process start's on clicking update if it is not installed

Firmware Updater installation process start's on clicking update if it is not installed

Firmware Updater --Update on clicking update

Firmware Updater --Update on clicking update

Firmware Updater -- Update finished.

Firmware Updater -- Update finished.

Device Settings View -- Verify firmware version on update.

Device Settings View -- Verify firmware version on update.

Upload ringtone

Upload ringtone

Upload ringtone file selection

Upload ringtone file selection

Upload ringtone -- file upload progress view

Upload ringtone -- file upload progress view

Upload image

Upload image

Upload image - file selection

Upload image - file selection

Upload image - file upload success view

Upload image - file upload success view

Set date and time view

Set date and time view

Development Setup

  1. Create a new Sample application using Visual Studio --WPF C# Application

Visual Studio project creation start up view

Visual Studio project creation start up view

  1. Copy the Library (libjabra.dll) from the Jabra SDK V2 (from Windows Release 1.2.0.34.zip file) and place it in application Debug/ Release project folder as shown below or install NuGet package "jabrasdk.x.x.x.x.nupkg" for application to use Library (libjabra.dll) with JabraSDK.dll(.Net Wrapper).

Copy Library DLL

Copy Library DLL

Sequence Diagrams

This section shows sequence diagrams for the most common use cases. Using the same patterns like the one described here, enables more advanced use cases.

Get device setting Sequence

The following sequence diagrams illustrate how to get settings from device using this library.

Get device settings

Get device settings

Set device setting Sequence

The following sequence diagrams illustrate how to set settings from application to device using this library.

Set device settings

Set device settings

Off-Hook Sequence

The following sequence diagrams illustrate how to implement off-hook/on-hook scenarios in your softphone using this library.

Softphone Initiated

Softphone OffHook initiation

Softphone OffHook initiation

User Initiated

User OffHook initiation

User OffHook initiation

Mute Sequence

The following sequence diagrams illustrate how to implement mute/unmute scenarios in your softphone using this library.

Softphone Initiated

Softphone mute toggle

Softphone mute toggle

User Initiated

User mute toggle

User mute toggle

Hold Sequence

The following sequence diagrams illustrate how to implement hold/resume call scenarios in your softphone using this library.

Softphone Initiated

Softphone Hold/resume sequence

Softphone Hold/resume sequence

User Initiated

User Hold/resume sequence

User Hold/resume sequence

Remote MMI -- Button take over

Button takeover sequence

Button takeover sequence

Child device support

Child device handling sequence

Child device handling sequence

Logging

Logging sequence

Logging sequence

Firmware Update

Firmware update sequence

Firmware update sequence

Third party license Notice

License notice for libjsoncpp

Copyright (c) 2007-2010 Baptiste Lepilleur

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Updated license information can be found [here](https://github.com/open-source-parsers/jsoncpp/blob/master/LICENSE).

License notice for pugixml

Copyright (c) 2006-2018 Arseny Kapoulkine

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Updated license information can be found [here](http://pugixml.org/license.html).

License notice for libcurl

Copyright (c) 2006-2018 Arseny Kapoulkine

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Updated license information can be found [here](https://github.com/Araq/libcurl/blob/master/LICENSE.txt).

License notice for NAudio

Microsoft Public License (Ms-PL)

This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.

1. Definitions

The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.

A "contribution" is the original software, or any additions or changes to the software.

A "contributor" is any person that distributes its contribution under this license.

"Licensed patents" are a contributor's patent claims that read directly on its contribution.

2. Grant of Rights

(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.

(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.

3. Conditions and Limitations

(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.

(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.

(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.

(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.

(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.

 Updated license information can be found [here](https://github.com/naudio/NAudio/blob/master/license.txt).