Changelog
libCEC 8.1.5 adds a Rust binding — the fifth language binding after C, C++, .NET, Python and Node.js — a public API for sending <play>, and fixes a set of physical address bugs that made a configured base device and HDMI port behave as if they had been ignored.
Highlights
- A Rust binding. A dependency-free
libceccrate over the C API, with a safe API, anmpscchannel for callbacks, examples, anENABLE_RUST_LIBcmake option, alibrust-libcec-devDebian package and a rustdoc reference alongside the other four. SendPlay()sends<play>to a device.cec_play_modewas part of the public API but nothing could reach it.- A configured physical address is honoured again. Three separate paths could replace it — another device reporting the same address, a base device that was in standby when the client registered, and a base device + HDMI port set alongside an explicit address.
Added
- a Rust binding: a dependency-free crate over the C API. Callbacks come either as a trait implemented on libCEC's worker thread — the only way to answer
menu_state_changed/command_handler— or as anmpsc::Receiver<CecEvent>, which is the sane default. The protocol enums are generated fromcectypes.h, andtests/layout.rsasserts every struct size and field offset against a C compiler reading the real headers. Built with-DENABLE_RUST_LIB=1, packaged aslibrust-libcec-dev SendPlay()sends<play>to a device on the bus. The transmit is virtual, so LG players are sent the user control code they act on rather than a<play>they ignore. Available in the C, C++, .NET, Python, Node.js and Rust bindings, andcec-clientgains aplaycommand (#727)Open()without a port opens the first adapter that can be opened, walking past adapters another process is already using, instead of failing
Fixed
- don't reset the physical address to HDMI port 1 on the TV when another device reports the address libCEC is using. That replaced one wrong address by another and silently overrode a configured setting. The address is kept, and the log now names the device that holds it and says to configure that device as the base device when this adapter is connected behind it (#738)
- re-derive the physical address once the configured base device reports one, instead of keeping the eeprom or default address for good. A base device that is in standby when the client registers doesn't always answer, which left a correct base device + HDMI port setting looking as broken as a wrong one (#738)
- a configured physical address is used again when a base device and HDMI port are set too, instead of being silently replaced by the address derived from that device and port. The base device and port are only meant to be used when no address was configured (#740)
- crash in
Close()when the adapter was never opened, and stop a failed open from loggingconnection openedand marking the processor initialised - the npm module and the .NET assembly shipped a stale version number.
release.pynow checks every file that repeats the version fromCMakeLists.txtand reports all mismatches at once - compile with
/Z7rather than/Ziso concurrent MSVC builds no longer race each other overmspdbsrv, and install the linker's pdb, which the Release build shipped none of
Full Changelog: libcec-8.1.4...libcec-8.1.5