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.

Polycom CX300

Polycom CX300

Headset socket on the bottom.
Polycom CX300

It looks like it is made in 2012, I don't know if CX300 R2 is different or not.
Polycom CX300

Polycom CX300

Graphical display with backlights - holds two text lines.
Polycom CX300

Some basic configuration is available from phone itself.
Polycom CX300

Polycom CX300

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.
Polycom CX300

35 mm diameter speaker. I haven't found replacement yet, so I'm using handset from POTS phone at the moment.
Polycom CX300

Polycom CX300

That's a nice microphone assembly.
Polycom CX300

Plastic (glue?) seem up close.
Polycom CX300

Polycom CX300

Polycom CX300

Polycom CX300

Polycom CX300

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).
Polycom CX300

TLV320AIC33 codec.
Polycom CX300

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.
Polycom CX300

Polycom CX300

Polycom CX300

Hook switch using transmissive optical sensor.
Polycom CX300

Plenty of rubber elements everywhere.
Polycom CX300

Rubber of foam elements on literally every surface that can touch something else.
Polycom CX300

Polycom CX300

Polycom CX300

Installation

In the idle state plugin displays date + time.
Polycom CX300

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

Github: https://github.com/tomek-o/tSIP-plugin-PhonePolycomCX300.

Back to tSIP softphone