AddTapi.NET 3.0 has been released

Last week we released new version 3.0 of our telephony library AddTapi.NET. You can download demo version of AddTapi.NET from To upgrade purchased version of AddTapi.NET, please send your serial number to Here is a list of new features in AddTapi.NET 3.0:

2-step/consultation call transfer

In addition to one-step/blind transfer, AddTapi.NET 3.0 supports 2-step or consultation call transfer. To start a 2-step transfer, call TapiCall.SetupTransfer() to create a new consultation call. Wait until call state changes to Dialtone, then use TapiCall.Dial() to dial the destination number for the transfer. When consultation call is connected, use TapiCall.CompleteTransfer() to complete the transfer.

Call park/unpark support

New TapiCall.Park() and TapiLine.Unpark() methods were added to park/unpark calls. Version 3.0 supports both directed and nondirected call parking.

3-way conference support

New version adds support for 3-way conference (if supported by the telephony system). To create a 3-way conference, call TapiCall.SetupTransfer() on the existing call to create a second call. Wait until call state changes to Dialtone, then use TapiCall.Dial() to dial the number you want to add to the conference. When the second call is connected, use TapiCall.CompleteTransfer() with the second parameter set to true to join the calls and create 3-way conference.

New call recording engine

AddTapi.NET 3.0 has new audio engine for recording calls. New engine has better performance when recording on many lines simultaneously and is more robust overall. TapiCall.StopPlayback() is now a synchronous operation that stops playback immediately. This change allows call recording to start faster after playing a message, and prevents from loosing first second of the recording on telephony hardware that does not support simultaneous playback and recording. Because new version initializes audio engine as soon as the call is connected, your application can call TapiCall.StartRecording() from the CallConnected event handler.

Call privilege handling

AddTapi.NET 3.0 automatically obtains owner privilege for calls when required, eliminating “application doesn’t have owner privilege” errors. New TapiCall.Privilege property provides information about the current call privilege.

Dialing on existing call

New TapiCall.Dial() method allows applications to dial on existing call. This is useful in many scenarios. For example, when user picks up a phone, new call in Dialtone state is created. Your application can use TapiCall.Dial() method to dial the number on this call.

WaitForDigit and GatherDigits improvements

In AddTapi.NET 3.0 TapiCall.WaitForDigit() and TapiCall.GatherDigits() methods accept negative timeout value. Negative value means that the timeout should start after playback initiated by the Play(String) or Speak(String) is completed.

Additional information about line and address capabilities

New version adds CallFeatures, MaxNumActiveCalls, SupportsPredictiveDialing, IsRoutePoint, IsQueue, MaxNumActiveCalls and MaxNoAnswerTimeout properties that provide additional information about features and capabilities of the telephony hardware.

TapiLine.Calls collection

Added TapiLine.Calls collection that contains all active calls on the line to simplify call management in some scenarios.

DigitDetected event

Version 3.0 adds DigitDetected event that fires when a DTMF digit is detected on the line. This event provides alternative asynchronous mechanism for handling digits received during the call. TapiCall.WaitForDigit() and TapiCall.GatherDigits() are easier to use synchronous methods for handling DTMF digits.

Other small fixes and improvements

– Added TapiCall.Trunk property to make call tracking across multiple trunks easier.

– Added TapiLine.DisconnectOnBusy property.

– Fixed a bug that caused device-specific functions to fail on some hardware.

– Fixed a bug with TapiCall.WaitUntilDone() always returning false when zero timeout is specified.

– Added checks to prevent multiple initialization of AddTapi.NET library.

AddEmail 3.0 has been released

We have released new version 3.0 of AddEmail ActiveX. You can download demo version of AddEmail from To upgrade your purchased AddEmail, please send your serial number to

AddEmail ActiveX 3.0 adds several new features and improvements while maintaining complete compatibility with previous versions. Source code written for AddEmail ActiveX 1.x and 2.x should compile and work with AddEmail ActiveX 3.0 without any modifications. Major new features added to version 3.0 are listed below. For more detailed information please refer to the AddEmail Manual.

Windows 7 and Windows Server 2008 R2 compatibility

AddEmail ActiveX 3.0 is fully compatible with all editions of Windows 7 and Windows Server 2008 R2, 64-bit and 32-bit versions. On 64-bit OS please use 32-bit version of regsvr32 to register AddEmail.dll on the computer. Run command prompt as an Administrator and type in:

c:\windows\syswow64\regsvr32 c:\addemail\addemail.dll

(assuming you copied AddEmail.dll to C:\AddEmail\ folder). You should see a message saying that the dll was registered successfully.

Automatic import of HTML with embedded images

With new version your program can automatically create HTML emails with embedded images by importing HTML files from disk. AddEmail imports specified HTML file, adds all images referenced in the HTML as inline attachments and modifies HTML as needed. Please refer to the ImportHTML and SimpleSendHtml topics in AddEmail Manual for more information.

SimpleSendXXX methods allow to specify sender’s and recipients’ names

New version adds support for “First LastName <>” format to SimpleSend, SimpleSendHtml and SimpleSendAttachment methods. Now you can specify names in addition to e-mail addresses for sender and recipients in SimpleSendXXX methods.

Support for Unicode (non-ASCII) attachment names

New version supports Unicode characters in MailAttachment.File and MailAttachment.Name properties. AddEmail will automatically encode attachment name if it has any non-ASCII characters.

ReplyTimeout property

New property has been added to specify how long AddEmail waits for a response from SMTP server before reporting timeout error. Please refer to ReplyTimeout topic for more information.

PhoneTray Dialup 2.38

PhoneTray Dialup 2.38 has been released. Please download the latest version from To update your version just download version 2.38 and install it over the previous version. As always, this update is free for all registered users of PhoneTray Dialup. New in version 2.38:

  • Added Modem-on-Hold support for USB and PCI modems with LSI/Agere chipset on Windows 7. Make sure to install the latest drivers from our website. Click here to download the drivers.
  • Added Modem-on-Hold support for USB modems with Conexant ACF chipset (for example Zoom 3095) on all versions of Windows.
  • Improved offline caller id support on Windows 7, Windows Vista and Windows XP.

Please let us know if you encounter any problems with the new version.

Happy Holidays!

Just in time for the holidays we released PhoneTray Dialup 2.37 and PhoneTray Free 1.37. You can download new versions from Upgrading is simple: download and install new version into the same folder where previous version is installed. All your settings, call history and privacy manager numbers will be intact.

Merry Christmas and Happy New Year! See you all in 2010!

Nobody told me it’s impossible, so I did it.

I just read this great post on Derek Sivers’s blog: There’s no speed limit. (The lessons that changed my life.) You should go and read it right now because what Derek says is so inspirational and so true. There is no limit to what you can achieve if you are motivated and inspired. I want to tell you how I started programming, hope you find it relevant and interesting.

I was 14 when my girlfriend at the time told me that her uncle got a home computer. It was Yamaha MSX and it was one of the first home computers in our town. Of course it had games and I started playing until my girlfriend’s patience ran out. After playing games for a couple of days I was very curious how it all works. I asked and asked, and after a while was given MSX BASIC book, I assume just to stop me from bothering everyone with all those questions 🙂 I still remember that it was a xerox copy, pages and pages of poorly translated text with some code and pictures. We didn’t study programming or computers in school, so it was all very new, strange and foreign. But I was captivated. I read the book couple of times (don’t remember if I understood much after the first reading) and after several days I started writing a game. Graphical card game. In MSX BASIC. Using pen and paper. You see, I had access to the computer only few times a week for an hour or two. I had to be ready to type in and run my code when I get to the computer.

So here I was, writing BASIC code on paper and tracing it line by line with my index finger 🙂 But it turned out it’s hard to add something in the middle of your code when you write it on paper. I started to leave every other line empty so I could put another line of code in between but it wasn’t enough. I didn’t know (or didn’t understand) about subroutines/functions but I figured out GOTO. It was great! I could put  GOTO on an empty line and execute additional code written on a separate piece of paper. I know all programmers are laughing reading this, but I was happy that I didn’t have to squeeze several lines of code into one line in the notepad anymore!

Showing playing cards on the screen was hard. You just can’t hold all those pixels and coordinates in your head. But I found the way. I got sheets of graph paper and drew X and Y axes with screen coordinates on them. I could put dots on paper so they form a picture I wanted, then check coordinates of each dot and enter them into my program. It worked! Graph paper was my video memory simulator 🙂 Later I figured out how to copy small picture from one place on the screen to another (sprite graphics) and things became much easier.

I don’t want to bore you with other details but in a month or so my game was working. It grew to 40 pages of BASIC code in my notepad and it was a mess but it worked! It was shuffling a deck using random number generator, displaying cards, making decisions how to play and even winning against human opponents from time to time! I was so thrilled! By the end of that summer (I started at the beginning of summer break) I got crafty and even programmed the game to cheat a little.

Now if you ask anyone they would say that learning programming like that is just not possible. I would say the same thing myself if it wasn’t me who started that way. But back then nobody told me it’s impossible, so I did it. I wasn’t lucky enough to have a teacher to challenge me like Derek’s teacher but I was motivated. No, I was MOTIVATED. I was INSPIRED. I wanted to make it work. It was hard and it was challenging but I loved every minute of it. And over 20 years later I still remember the thrill of seeing my program work for the first time. That’s why I became a programmer and that’s why I write code every day.

Derek Sivers is right. There’s no speed limit. You can do so much more than anyone expects if you’re passionate about it. And it doesn’t matter if everyone says that you want to do the impossible.