VoIP/SIP client (softphone) for Windows
When looking for a SIP and media stack I've spotted libre/librem/baresip from creytiv.com. It has I believe pretty unique combination of simplicity, completeness and most of all permissive BSD-style license allowing commercial and closed-source derivatives.
Note: page is organized in chronological way. This specification refers to latest version.
- portable, small (~2MB disk space) Win32 application with settings stored as JSON
- single account, single call (although multiple instances can run simultaneously)
- programmable keypad (similar to many bench phones: Speed dial/BLF/MWI/DTMF/Redial/Blind transfer/Hold/Mute/...; customizable button height, top/bottom margins, caption, icon)
- BLF with state-based number dialed on click (call transfer, call pickup with BLF)
- console-only mode (intended to work as additional BLF console / extra sidecar for desk phone)
- click-to-call / "callto" web browser integration
- Bellcore-dr1...dr8 ring selection
- call recording (wave files) with separate records browser
- plugin interface for external software/hardware integration (supporting EX-03/EX-02/EX-B USB phones, PC speaker as a ringer, pausing/resuming SMplayer on call)
- customizable local and global hotkeys allowing e.g. calling to number copied to clipboard, answer/hangup call without restoring application from tray
- separate audio device selection for input, output, ringing and paging/intercom
- auto-answer after time and/or with respect to Call-info answer-after parameter
- BSD-like license; customizable and brandable
Minimal subset (no video support, no codecs besides G.711, just the essentials for voice calls)
of libre/librem/baresip as a console application built with Turbo C++ 2006 Explorer. If you're not
a Borland products user stay with original source code that can be used with i.e. VC++ 2003.
bsip_tc_20111215.7z - source only
GUI SIP client
SIP client with graphical user interface built upon re/rem/baresip stack.
Feature set is very limited, but whole project is self-contained and easy to compile -
no external dependencies. GUI is using simplest possible model: single registration
account and single call at a time, but application is portable and using configuration
from a local JSON file, so many instances can be run simultaneously with different configurations.
Each instance takes ~1.8 MB of disc space (including wave files with signals such as ringing).
- Initial release: Version 0.1
tSIP_0_1_src.7z (435 kB)
- 2012.01.11 Minor fixes
- lib project dependencies handled in a better way (#pragma link "re.lib", library search directory changed depending on current build configuration),
- FIXED: possible Access Violation errors on quit or restart,
- added missing handling of transport and expires configuration parameters,
- ignoring incorrect stale=FALSE (treating always as stale=TRUE) parameter put by some other device with SIP/401 message that was causing periodical loss of registration; hopefully this would be only temporary change.
- 2012.01.16 tSIP_0_1_2_bin.7z,
- re/rem/baresip sources updated to version 0.4,
- winwave.c: fix for small, non-recurrent memleak,
- added baresip portaudio module and necessary PortAudio v19/DirectSound statically linked library; PortAudio is now default sound backend, WaveIn/WaveOut is left as an alternative,
- removed unnecessary parts from displayed call URI.
- 2012.01.28 tSIP_0_1_3_bin.7z,
- added baresip speex module and required statically linked library,
- added transmitted and received SIP message logging option,
- ua_find(): trying to match incoming requests using AOR if matching by Contact fails; matching by Contact only may cause interoperability problems (see Nokia: Problems with incoming VoIP 3.x calls).
- 2012.04.28 tSIP_0_1_4_bin.7z,
- re/rem/baresip sources updated to version 0.4.1,
- GUI: added auth username to configuration,
- GUI: fixed problem with temporary freezing when opening log window after long work time.
- 2012.05.10 tSIP_0_1_5_bin.7z,
- added baresip gsm module and statically linked gsm library,
- added module for G.726-32 codec and G.726 code from older SpanDSP version (copyright Sun Microsystems and Steve Underwood, public domain),
- added codec set configuration (enable/disable particular codecs).
- 2012.07.22 tSIP_0_1_6_bin.7z,
- added local address setting - equivalent of baresip "sip_listen", may be required when using on machines with more than one network interface to specify interface to bind to.
- 2013.11.20 tSIP_0_1_7_bin.7z,
- application version that handles multiple accounts and multiple calls was moved to separate branch (mtSIP),
- updated re (0.4.5), rem (0.4.4), baresip (0.4.6) sources,
- log window: added "Save to file" to context menu and "Log to file" checkbox (duplicating settings),
- added re-register button (forcing immediate re-registration),
- eliminated GUI freezing when application was closing during registration that would fail due to no response from 2nd party,
- auto-answer with specified SIP code,
- added (very crude) call history,
- added redial button,
- making call: assumed that if sip: prefix is present uri domain does not have to be added (previously: unable to call i.e. sip:192.168.1.11 uri, call function was assuming that domain was not present if "@" in uri was not present).
- 2014.03.19 tSIP_0_1_8_bin.7z,
- moved baresip code into separate static library (mostly to speed up often unnecessarly forced by TC++ whole project rebuilds),
- dialpad: added A, B, C, D DTMFs,
- added Flash button (sent as DTMF event),
- added Hold function,
- added blind transfer function.
- 2014.05.27 tSIP_0_1_9_bin.7z,
- added Speed Dial / BLF panel (application/dialog-info+xml subscription).
- 2014.06.01 tSIP_0_1_10_bin.7z,
- FIXED: account configuration: entering password is not required,
- FIXED: FLASH is no longer displayed as 'R' when dialing,
- FIXED: inconsistent application state when UA was restarted (configuration changed) during a call,
- making call with [Enter] in number edit field,
- auto-repetition for "backspace" button.
- 2014.08.07 tSIP_0_1_11_bin.7z,
Added Accept header to SUBSCRIBE message. Although it shouldn't be required (see RFC6665, 3.1.3), Asterisk 11.9.0 is dropping these type of message with error: WARNING: chan_sip.c:27847 handle_request_subscribe: SUBSCRIBE failure: no Accept header: pvt: stateid: -1, laststate: 0, dialogver: 0, subscribecont: '', subscribeuri: ''. Thanks to Barry Mercer for reporting.
- 2014.09.27 tSIP_0_1_12_bin.7z,
- added WebRTC Acoustic Echo Canceller as static library,
- AEC selection: none/Speex/WebRTC,
- fixed audio problem with WaveIn audio input (waveInUnprepareHeader() misorder).
Note: this is local echo canceller - it eliminates echo introduced by local speakerphone-microphone audio path (and heard by our caller), not echo that may be heard from second party.
- 2014.10.03 tSIP_0_1_13_bin.7z,
- separate audio module selection for audio source, output and output for ringing.
- 2014.10.05 tSIP_0_1_14_bin.7z,
- crude contact list / phonebook,
- json-cpp code moved into separate static library,
- fixed status text when account changed to account without registration,
- added CALL_STATE_OUTGOING, UA_EVENT_CALL_OUTGOING (feedback before contacting 2nd party on outgoing call),
- added CALL_EVENT_TRYING, UA_EVENT_CALL_TRYING (info on receiving SIP/100).
- 2014.10.16 tSIP_0_1_15_bin.7z,
- fixed audio device selection for winwave output (default device was always opened),
- tray icon, File/Minimize to tray, "X" button minimizes to tray,
- settings: Start minimized to tray,
- status text as tray hint,
- cleanup: Hangup()/CALL_STATE_CLOSED code duplication,
- simple tray notifier window, related settings added.
- 2014.11.02 tSIP_0_1_16_bin.7z,
- replaced str_error calls in SIP replies with fixed text (when replying to re-INVITE with image media only invalid message was generated with "Unknown error" followed by empty line),
- fixed minor built problems: reference to missing module with webrtc, not all projects included in main project group, missing (strangely only with particular TC++ copy installed) mmsystem.h include,
- fixed: no ring tones when working directory was different than application directory (e.g. when using start softphone01\tSIP.exe from batch file),
- clearing BLF icon from speed dial panel when BLF subscription is disabled,
- settings: delay for the auto answer, randomized (for fuzzing purposes) from specified range.
- 2014.11.23 tSIP_0_1_17_bin.7z,
- fixed audio device enumeration in settings window,
- GUI scaling (main window),
- intercom/paging (separate audio output on incoming INVITE with Call-Info with answer-after),
- winwave: fixed handle leaks (waveInUnprepareHeader called after waveInClose, with invalid dev handle),
- configurable buttons (in a similar way to e.g. Yealink phones):
- type (disabled, speed dial, BLF, DTMF, redial, transfer, hold, ...)
- caption - displayed text
- basic number (if applicable for selected type)
- height - allowing customize different buttons size or just fit more buttons in a column
- top and bottom margins - allowing to insert some space before/after button or just get rid of excessive buttons leaving only few visible (buttons are using flow layout)
- show/hide image
- images selection for non-BLF and BLF type buttons; customized images are intended for better representation of information type supplied e.g. with custom asterisk hints
- note: multiple buttons of the same type can be programmed and their state is synchronized; in case of BLF there is only single subscription to server if multiple buttons with same number are added
- removed A, B, C, D DTMF keys from main keypad; note: these signs can be programed with DTMF type (programmable) key
- setting: double width for speed dial.
- 2014.11.29 tSIP_0_1_18_1_bin.7z,
- additional configuration for BLF buttons: number dialed when button is pressed can be changed to different than number for subscription and depend on subscribed number state; this can be treated as generalized "Call pickup" function available e.g. on Yealink phones (to get identical behavior mark "early" for override and enter complete number that has to be used to pickup call from other extension on PABX)
- new button type: unsolicited MWI (dislaying number of new and old messages on voice mail); image shown when there are new messages is shared with BLF "early" setting, example images are included - see screenshot
- new button type: MUTE
- 2014.12.06 tSIP_0_1_19_bin.7z, tSIP_0_1_19_src.7z
- 2015.01.04 Version 0.1.21
- fixed command line execution when other instance was not found (accessing released memory)
- settings: console-only mode - intended to work as an extra console for desktop phone
- changed registration expires in default configuration to 0; this disables registration by default - deregistration attempt from non-existent server (long timeout) is annoying and it's not very likely that default registration server address (i.e. localhost) would match user registrar
- moved ring initialization to top level project (fixes issue with short ringtone being played even with auto-answer with zero delay)
- separate ringtones selection for INVITEs with Alert-Info: info=<Bellcore-dr1> header (Bellcore-dr1 ... Bellcore-dr8) and for default ring; note: wav files have to be placed in application directory
- new function and button type: mute ring
- settings: action for "X" button in main window: minimize to tray or close
- 2015.01.15 tSIP_0_1_22_bin.7z,
- FIXED: SIP/500 response was sent since v0.1.21 on missing Alert-Info,
- new setting for BLF button: action when button is pressed during call:
- none (= no action, same as in previous version)
- DTMF dialing with optional prefix to be added (prefix can be PABX transfer code or even "R" for FLASH if PABX supports it)
- blind transfer using REFER (default)
- (again) more console columns (up to 5 + 1 "basic") giving up to 55 buttons (up to 75 with reduced button height); minor clean-up to make adding more columns later easier (change EXT_CONSOLE_COLUMNS + add item to combobox in settings window),
- version info: added file description (presented e.g. in Process Explorer and some firewalls).
- 2015.01.19 tSIP_0_1_23_bin.7z,
minor improvements to call history:
- keeping only user part of URI from incoming call
- size increased to 1000 entries
- not skipping entries with duplicated numbers / URIs
- storing call time
- displaying call direction and completion
settings: shortcuts (local to the application)
- hide application
- answer/hangup call
- equivalent of pressing configurable (console) button; for button ID check caption of button edit window
- settings: width for console columns
- minor improvements to call history:
- 2015.01.31 tSIP_0_1_24_bin.7z,
- fixed console-only mode
- switching to/from console-only mode does not require restart
- note: you can use 0.0.0.0:XXXX to bind to specific port without entering any specific IP address (and you may need binding to fixed port if you'd like to e.g. make calls using IP address, without registering to any server)
- log: added timestamp to log entries with SIP sent/received messages
- global hotkeys (hotkeys that work even when application is hidden); since it may be quite hard to find unique hotkey combinations use them sparingly - my recommendation would be using global hotkeys for show/hide app and answer/hangup and local hotkeys for other actions
- 2015.02.07 tSIP_0_1_25_src.7z
- build options: instruction set changed to Pentium Pro for all projects and targets
- TimeCounter.h: time measurement utility for basic testing
- setting focus to call number edit box on startup and when application is called with global show/hide hotkey (allowing dialing number without using mouse while keeping application hidden normally)
- hotkeys: new action available: redial (although same effect can be achieved by assigning redial function to one of the speed dial keys and then assigning this button as action)
- fixed: unitialized values for new hotkey button (i.e. "global" checkbox often set by default)
- fixed: halt in global buttons unregister loop
- contacts: note field added
- contact note popup window (auto popup on incoming and/or outgoing call if note is not empty and specified option is set); window position and size is stored in configuration
- new button type: show contact note popup
- 2015.02.18 tSIP_0_1_25_1_bin.7z,
- fixed regression (0.1.25): "Cannot focus disabled or invisible window" exception when starting application minimized to tray
- Branding.[h|c] - common application name/protocol handler definition to reduce differences between branded and regular version
- 2015.02.28 tSIP_0_1_26_bin.7z,
- (very basic) call recording
- settings: on/off switch (all calls are recorder automatically when enabled)
- writing files to \recordings subdirectory
- filename contains date, time, direction ("1" for incoming, "0" for outgoing) and 2nd party number/URI encoded in base64
- output format: WAV, both direction mixed into single channel, PCM 8000sps, 16bit (~55MB per hour)
- (very basic) call recording
- 2015.03.04 tSIP_0_1_27_bin.7z,
- recording can be disabled and hidden altogether (e.g. for legal reasons) without recompiling by opening executable with resource editor and changing "RECORDING_ENABLED" string to any other value; for extra protection from user manipulation Yoda's Protector or similar tool may be used
- settings window can be closed with Esc key
- new hotkey action type: call to number from clipboard (select number in web browser, hit Ctrl+C and than assigned global shortcut to call; I'd suggest using global hotkey with Ctrl, e.g. Ctrl + Browser Forward Key for this purpose)
- fixed: global hotkeys not working with Win Vista and earlier systems because of MOD_NOREPEAT flag used; added OS detection and app-based antirepeat (with 1s timeout) for systems older than Win7
- settings: restore minimized / bring main window to front on incoming call
- settings: show tray notifier window on outgoing call (e.g. when using global hotkeys)
- 2015.04.11 tSIP_0_1_28_bin.7z,
- DLL plugin system for interfacing external devices; implemented interface for EX-03 USB phone (aka @phone); most likely compatible also with EX-02 and few other similar devices
- FIXED: incorrect parameter (branding module not used) in protocol handler links
- protocol handler: added "ANSWER" parameter (next to "HANGUP")
- 2015.04.16 tSIP_0_1_29_bin.7z,
- FIXED: global hotkey unregistration and phone interface shutdown with "X" button when this button was configured to minimize to tray; added TfrmMain::Finalize()
- 2015.05.04 RingAction.7z: mini-plugin that executes hidden command line shell (cmd.exe) with specified
parameter (command) when softphone starts ringing. In my particular usage this is intended to stop media player (that is SMplayer) on incoming
call. SMplayer can be controlled with -send-command option:
D:\progs\smplayer\smplayer -send-action play && D:\progs\smplayer\smplayer -send-action pauseEach time both play and pause commands are sent to handle both cases when SMplayer is playing or is not playing at the moment (pause command itself works as play/pause switch). Command to execute is specified with JSON .cfg file, using JSON editor might help with proper escaping for complex command lines.
- 2015.05.10 RingPCSpeaker.7z: mini-plugin: ringing using PC speaker (with WinAPI Beep() - does not work as expected with 64-bit windows version as it is routed to default sound device instead of activating physical PC speaker as with 32-bit windows).
- 2015.05.31 tSIP_0_1_30_bin.7z,
- FIXED: regression: call history not saved on system shutdown (WM_ENDSESSION handler)
- fixed handling of missing plugin DLL
- contacts: CSV import
- 2015.06.06 tSIP_0_1_31_bin.7z,
- contact note popup and contact node editor: URLs are highlighted and opened in default browser when clicked
- recordings: custom directory can be set for output (e.g. located on shared network drive)
- added exe location to "About" window (click to open application directory)
- call duration is displayed in "Connected" state
- 2015.07.04 tSIP_0_1_33_bin.7z,
- recording: encoding of number/URI in wav file name changed to filesystems-safe version of base64 alphabet
- new button type: HTTP query - open specified URL (e.g. search engine or web-based corporate database) with number from last (or current) incoming call passed as parameter; by default google is used
- settings: added RTP/RTCP local port range selection
- 2015.07.06 RecordViewer - simple browser for recorder calls