v2.30c
rebuilt everything on VS2022.

v2.30
1. Added interface to call outside programs for new calls.
Added sample code, newcall.py(local program) and newcall.php(http post)

v2.22
1. Added the following two new functions:

EnableAddingDateAndTimeInAudio
Description: Enable adding an announcement in recording audio, to indicate the date and time for the recorded call.

SetAddingDateAndTimeInAudioText
Description: How to announce the date and time in recording. If it is "", default it is " Call recorded %s. Audio of recorded call:  ". Recorder will use current system date and time to replace %s.

v2.21
1. Added two functions for dynamically starting recording on channel
StartChanRecording
StopChanRecording
2. Updated doc
3. Fixed the recording issue for edge dynamic audio codecs
4. Fixed issue for recording only 30 minutes per audio file(wav and mp3)

v2.20
1. Redesigned GUI of VR2WinApp.exe
2. Rebuild the project using Visual Studio 2015

v2.16
1. Completely switched to use Npcap SDK
2. Added feature to save individual pcap file for each call
3. Better logic for detecting Npcap or WinPcap driver, and provided interface for it

v2.15b
1. Bug fix for a situation that BIB didn't record. It turned out two calls are not coming at same time.

v2.15
1. Added Cisco BIB Recording option
2. Added supports and docs for Npcap

v2.14 2020-09-23
1. Added check to prevent multiple instances running
2. Added interfaces to post call recording data through XML services
3. A bug fix for switching between models

v2.13c 2018-09-09
1. Added "email recording" & "copy audio file" for quick search and complex search
2. Added import recording folder to DB in Database setting

v2.13a 2017-10-23
1. Added interfaces for dumping traffic into a .pcap file


v2.13 2017-08-20
1. Supporting decoding opus codec


v2.12g 2017-05-09
1. Trying to fix driver error: 
read error: PacketReceivePacket failed


v2.12f 2017-04-29
1. Added cleaning up recording files according to FIFO(First In First Out) when disk has certain amount of free space.

v2.12e   2017-04-22
1. Added the event for SIP MESSAGE to record text
The callback function is:
typedef void (VR_CALLBACK *VR_CB_call_sip_info)(int ChanIndex, const char* CallerIP, const char* CallerID, const char* CalleeIP, const char* CalleeID, const char* UniqueID, const char* RequestURI, const char* ContactAddr, const char* info1, const char* info2, const char* SIPCallID, const char* SIPInvite);

When info1 is "SIP MESSAGE TEXT", then info2 is the text message.

v2.12d

1. Added the option to record RAW file
void VR_API VR_SetAudioFileFormat(int f); 
f: 0 = wav, 1 = mp3, 2 = gsm, 3 = .wzp, 4 = raw


v2.12c

1. Added function SetRecordStereo
Description: Set if the recording wav file is stereo. (Left channel is caller and right channel is callee) 

Format: 
C/C++: void VR_API VR_SetRecordStereo(int b);
.NET:  void SetRecordStereo(int b);
OCX:  void SetRecordStereo(int b);

Parameters:
b: 1 = true(stereo), 0 = false(mono, default)



v2.12
1. Fixed a display issue for searching result
2. Fixed RTP search by name of extension
3. Set RTP extension and PBX by MAC address, not only IP address

v2.11
1. Added TAPI support for correcting caller and called id

v2.10d2 and v2.10d3
Optimized on threading model of the recorder core for large amount of concurrent calls.

v2.10d1

1. Fixed a serious issue of recorder crash by transfering large log files of SIP over the net
2. Fixed a serious issue of recorder crash caused by strcat_s.

v2.10c
1. Added a new function for restarting recording on a channel
void VR_API VR_RestartChanRecording(int ch, const char* newWavFile);


v2.10b
1. Added SetPromiscuousMode, so it can control if use Promiscuous Mode or not for Network card.
Some network card driver just doesn't support capture on Promiscuous Mode, for example D-Link Wireless USB Adapter.
2. Integrated ManagerClient into PCBest VoIP Recorder new GUI for the third running mode.


v2.10a
1. Fixed a problem with some Cisco CCM(SKINNY), it has duplicated call info somehow.

v2.10
1. Removed ManagerClient from the package. Introduced new GUI VR2WinApp.exe.
Made it one client for both service or desktop management.

v2.06O
1. Added function 	
void VR_API VR_SetDumpFile(const char* fn);
It is for saving all packets to a pcap file.

2. Added function : public static void VR_SetPauseOption(int ch, int opt)
opt: 
     0 = not insert.
     1 = insert blank/silence audio in wav for paused period
     2 = auto-pause + not insert blank/silence audio in wav for paused period
     3 = auto-pause + insert blank/silence audio in wav for paused period




v2.06n

1. Added 8 functions:

	void VR_API VR_PauseRecording(int ch, int pause);
	void VR_API VR_RecordSIPHeadersInXML(const char* headers); //seperated by ';'
	void VR_API VR_SetExtenPattern(const char* patterns); //seperated by ';', * for any length of string, and ? for one digit
	int VR_API VR_GetChanByCallID(const char* call_id);
	int VR_API VR_GetChanBySIPID(const char* sip_id);
	int VR_API VR_GetChanByPChargingVector(const char* pcv);
	int VR_API VR_GetChanByPAssertedIdentity(const char* pai);
	int VR_API VR_GetChanByRemotePartyID(const char* rpi);

2. Replaced VR_SetPauseDTMFKey with VR_SetPauseDTMFStr

2.06m

1. Added two new functions:

GetLicTo
Description: If your license is valid by calling above IsLicensed function, you can call this function to get license information.

Format: 
C/C++:  const char* VR_GetLicTo();
.NET:  string GetLicTo();
OCX:  BSTR GetLicTo();

Parameters:
none

Return:
License information.

Sample code: 


ValidateLicence

Description: Call this function to validate a license key for the local machine or for USB key. You can use this function to develop your own license validation process application.

Format: 
C/C++:  const char* VR_ValidateLicence(const char *sKey, unsigned int numChan, const char* appVersion, const char* sMacAddr);
.NET:  string ValidateLicence(string sKey, uint numChan, string appVersion, string sMacAddr);
OCX:  BSTR ValidateLicence(BSTR sKey, ULONG numChan, BSTR appVersion, BSTR sMacAddr);

Parameters:
sKey: the license key supplied by PC Best Networks
numChan: How many channels the key is for, or the application plans to open and use
appVersion: leave it blank('')
sMacAddr: if you wish the license key is associated to a specifical MAC address of local, please specify, otherwise leave it blank. If you are using USB key, please set this to USB driver letter, like "e:", or "f:".

Return:
License information with the license file path generated.
Sample code: 
ValidateLicence("ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", 4, "", "");
ValidateLicence("ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", 4, "", "g:"); //USB
ValidateLicence("ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", 4, "", "98-A1-DC-E2-6B-75"); //On NIC MAC address 98-A1-DC-E2-6B-75.



v2.06l
1. Added SetRecordCallLegs function to enable recording each leg of the call.


v2.06k
1. Added g722 decode
2. Enhanced MGCP protocol

v2.06j
1. Added a function to get how many packets have been processed by core engine:
uint GetSysProcessedPacketCount()

2. Added a function to allow application level stop recording on a channel
void StopChanRecording(int ch)

v2.06i
1. Fixed a potential crash for retrieving REMOTE_PARTY_ID
2. Added RecordOnlyAfterAnswer support into VR2 and SDK

v2.06h
1. Enhanced Quick Search for VoIP Recorder 2
2. Added Complex Search for VoIP Recorder 2 

v2.06g
1. Fixed a memory leak with h232 and RTP recording
2. Made IAX2 recorder work

v2.06f
1. Added Avaya CDR support for trunk correction


v2.06e
1. Added a feature to pause recording by detecting DTMF key


2.06d
1. Added callback function VR_SetCB_Call_SIP_Info(p).

P format is:
void cb_Call_SIP_Info(int ChanIndex, string CallerIP, string CallerID, string CalleeIP, string CalleeID, string UniqueID, string RequestURI, string ContactAddr, string PAssertedIdentity, string PChargingVector, string SIPCallID, string SIPInviteMsg);


2. Fixed a problem to get caller id of Avaya IP Office 500.


2.06c
1. Added GetChanSIPMsg
2. Added DTMF detection for SIP recording
3. Fixed a bug for hold/unhold on two legs of same call
4. Added support for SIP UPDATE message


2.06b
1. Fixed an issue with early media recording.

2.06a
1. added support for DNS when setting RTP extension
if set RTP extension with "dns-" prefix, recorder will use DNS server to resolve the string behind to IP address every 5 minutes.

2.06
1. Fixed an issue for RTP calls only showing connecting status.

2.05a
1. Added support for 60ms PCMA and PCMU packet.


2.05
1. Removed functions:
    ;VR_SetFilterCount
    ;VR_SetFilterItem
    ;VR_SetFilterType  
    ;VR_SetExcludeCount
    ;VR_SetExcludeItem
    ;VR_SetExcludeType

Added two functions to replace them. Now support dynamical call to define Filter and Exclude list:
	void VR_API VR_SetFilter(const char* s, int act); //act == 1 add, 0 == remove
	void VR_API VR_SetExclude(const char* s, int act); //act == 1 add, 0 == remove

Modified On_RecvOffered return value from void to integer for C++.
BY using this interface, app can cancel a call recording.

2. Added one more function:
VR_SetUsePacketTime(int b);


2.04
1. Added three new functions for NIC operation:
    short VR_API VR_GetNICIPCount(short idx);
    const char* VR_API VR_GetNICIP(short idxNIC, short idxIP);
    void VR_API VR_SetNICByIP(const char* ipAddr);

2. Added one new call-back function for c++,.NET interface to generate customized xml file name.
	void VR_API VR_SetCB_GetXMLFileName(VR_CB_get_xml_file_name p);

3. Added two more parameters for GetWavFileName and GetXMLFileName callback. They are
string callerID, string calleeID

4. Optimized engine. Made SIP call record early media.

2.03
1. Added call-back functionf or fatal-error in dll, and .net interface too.
2. Added a new function to allow customer inject ethernet frame data rather opening real NIC device:
int	VR_API VR_ProcessEthernetFrame(struct timeval* ts, const unsigned char* pkt_data, unsigned int pkt_len);
3. Added email notification
in the xml config, <SMTPServer> and <NotifyEmails> are added for this feature.
4. Added ID mapping
xml config, <IDMaps> is added.
5. Added a new sample FrameFeeder to show how to use new interface VR_ProcessEthernetFrame.
6. Added one more parameter(int codec) for callback function call-idle.
7. Added one new call-back function for C++ interface to generate customized recording file name.
For .NET, added SetCB_GetWAVFileName callback to allow customized setting for wav filename

8. Added a new sample for Borland C++ Builder 6.

2.02 
1. Fixed Filters bug.
2. Added Excludes list.
3. Supported MAC addr in Filters and Excludes list.
4. Fixed a slow sound issue because the switch mirror port has every packet duplicated.
5. Added display name in Caller and Callee field of DB, and made ManageClient search use LIKE.