tSIP plugin: Polycom CX300 USB phone support
This plugin adds support for Polycom CX300 USB phone to tSIP softphone.
Polycom CX300 is a USB device dedicated for Microsoft Lync. Like with other similar products, USB host sees it as USB audio + HID. From what I can find it was later partially supported by Microsoft Teams and then support was completely dropped in March 2024. As it implements USB Telephony Usage Page (0x0B) it is possible that it works at least partially with other software, but I have not tested it.
There are two other devices that look identical but I don't know if they have identical software: Plantronics Calisto 540 (P540-M) and Snom UC600. Plantronics acquired Polycom in July 2018. The new company, a combination of both Plantronics and Polycom, was renamed to Poly in 2019. Then Poly was sold to HP in 2022.
Teardown
I was able to buy this phone for $10 in 2025 in good visual condition, but with hidden handset speaker fault.
Headset socket on the bottom.
It looks like it is made in 2012, I don't know if CX300 R2 is different or not.
Graphical display with backlights - holds two text lines.
Some basic configuration is available from phone itself.
Handset speaker was not working (open circuit), so I had to open it. It looks like handset is either ultrasonically welded or glued with minimal amound of glue.
I would be able to glue it back without significant damage. Overall it seems well-made (acoustic isolation), but I would prefer screws.
This handset and its cable is compatible with the ones used in analog/POTS phones.
35 mm diameter speaker. I haven't found replacement yet, so I'm using handset from POTS phone at the moment.
That's a nice microphone assembly.
Plastic (glue?) seem up close.
AT91SAM7SE256. Nice to see something that does not come from China.
AT91SAM7SE chips are almost identical to AT91SAM7S series, but do have One External Bus Interface (EBI) supporting SDRAM,
static memory, CompactFlash and NAND Flash (hardware Hamming ECC, 1 bit correction / 2 bit detection per 512 B, mostly limited to SLC NAND).
TLV320AIC33 codec.
According to https://www.ti.com/packaging/en/docs/partlookup.tsp this chip with "BTI" marking is
TPA2013 - class-D audio amplifier with integrated boost converter. Useful output power up to ~2 W.
Hook switch using transmissive optical sensor.
Plenty of rubber elements everywhere.
Rubber of foam elements on literally every surface that can touch something else.
Installation
- copy plugin dll file from /bin/Release inside archive to tSIP/phones subfolder
- activate plugin in tSIP Settings/Plugins; version 0.2 has two separate dll variants for Windows 7 and Windows 10, choose the proper one
- when USB phone is connected - select Polycom CX300 audio devices in tSIP Audio I/O settings tab
In the idle state plugin displays date + time.
Usage
Since Polycom CX300 does not have dedicated [OK] or [green handset] button, by default I've assigned [#] to dial/send function (actual call initiation after digits are dialed). This can be changed in plugin settings (manually editing plugin cfg JSON file created by plugin dll next to itself) to [*] or disabled by setting e.g. empty string.
[Backspace] key rejects incoming call.
Detailed logging (like logging incoming HID reports when keys are pressed) can be enabled in plugin cfg file - for development purposes.
LEDs with Microsoft Lync symbol are blinking red during incoming ring, otherwise they are set to green color if softphone is successfully registered.
After short testing I believe that this phone has some built-in acoustic echo cancellation or suppression. When testing in speakerphone mode I've observed ~30dB return loss on the other side.
Overall audio quality seem decent, I've observed severe distortion when playing audio with higher low frequency content (music from sip:3333@sip2sip.info) but it looks like it is specific to G.722 codec (Opus is fine).
It looks like switching between handset, speakerphone and headset modes is handled by the device itself. Current mode is visible in reports though, it could be shown in the softphone GUI, though it is presented with LEDs built into phone buttons, so it is probably enough.
Microphone mute button is handled by phone itself and it state is presented with LED built into button.
[Hold] button calls tSIP Lua ToggleHold() function. It looks like phone generates same event when hook is shortly pressed.
Display support was added in version 0.2. Due to OS differences I had to build two separate dll variants: for Windows 7 and Windows 10.
Voicemail LED built into [1] button is turned on if MWI button is configured on the softphone and there are new messages in received notification (unsolicited). If [1] button is long pressed, tSIP would make call the number found on first configured MWI button.
Issues
I was using https://github.com/probonopd/OpenPhone as a reference (thank you!). It works well under Linux but unfortunately display is not working under tested Windows versions (7 and 10 64-bit) and I initially had the same problem. After a lot of try-and-error I've solved it by opening device twice (two separate HID usages) and sending different reports to different instances. Unfortunately device behavior is not consistent between Windows 7 and 10 (and/or I'm missing some important detail) and two separate plugin dll variants are needed for these systems.
Source/binary
- 2025.11.29 Version 0.1, tSIP-plugin-PhonePolycomCX300_0_1.zip, compiled using Code::Blocks 16.01 / MinGW.
- 2025.12.04 Version 0.2, tSIP-plugin-PhonePolycomCX300_0_2.zip
- solved issues with display handling
- splitting into two separate dll files: one for Windows 7, one for Windows 10 to handle OS differences
- added Redial (requires tSIP 0.3.11+)
- added controlling voicemail LED from MWI (requires tSIP 0.3.11+)
- calling voicemail on long press of [1] button (requires tSIP 0.3.11+)
Back to tSIP softphone