Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libcec for openSUSE:Factory checked in at 2026-06-02 16:01:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libcec (Old) and /work/SRC/openSUSE:Factory/.libcec.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libcec" Tue Jun 2 16:01:54 2026 rev:15 rq:1356416 version:7.1.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libcec/libcec.changes 2025-03-13 22:04:38.426618240 +0100 +++ /work/SRC/openSUSE:Factory/.libcec.new.1937/libcec.changes 2026-06-02 16:02:26.902274610 +0200 @@ -1,0 +2,16 @@ +Mon Jun 1 16:38:46 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 7.1.1 (includes 7.1.0): + * Add Teufel vendor ID + * Add system audio mode request & status support + * RPi: check that passive mode can be set during adapter + detection + * Make CMake obey INSTALL_BINDIR / INSTALL_LIBDIR + * Various build fixes and NULL-handling corrections +- Drop libcec-cmake_install_lib_dir.patch: the lib-install-dir + fix is now included upstream +- Do not ship the static library (libcec.a) +- Spec cleanup: convert ncurses-devel to pkgconfig(ncurses), + drop obsolete Group tags + +------------------------------------------------------------------- Old: ---- libcec-7.0.0.tar.gz libcec-cmake_install_lib_dir.patch New: ---- libcec-7.1.1.tar.gz ----------(Old B)---------- Old: * Various build fixes and NULL-handling corrections - Drop libcec-cmake_install_lib_dir.patch: the lib-install-dir fix is now included upstream ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libcec.spec ++++++ --- /var/tmp/diff_new_pack.BZvUV4/_old 2026-06-02 16:02:27.866314587 +0200 +++ /var/tmp/diff_new_pack.BZvUV4/_new 2026-06-02 16:02:27.878315085 +0200 @@ -1,7 +1,7 @@ # # spec file for package libcec # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2012 Guillaume GARDET <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -21,19 +21,18 @@ %define libname %{name}%{sover} %bcond_with enable_rpi_build Name: libcec -Version: 7.0.0 +Version: 7.1.1 Release: 0 Summary: Library to control devices with TV remote control via HDMI License: GPL-2.0-or-later URL: https://github.com/Pulse-Eight/libcec Source: https://github.com/Pulse-Eight/libcec/archive/libcec-%{version}.tar.gz -Patch1: libcec-cmake_install_lib_dir.patch BuildRequires: cmake BuildRequires: gcc-c++ -BuildRequires: ncurses-devel BuildRequires: pkgconfig BuildRequires: swig BuildRequires: pkgconfig(libudev) +BuildRequires: pkgconfig(ncurses) BuildRequires: pkgconfig(p8-platform) BuildRequires: pkgconfig(python3) BuildRequires: pkgconfig(udev) @@ -56,7 +55,6 @@ %package -n cec-client Summary: Control your device with your TV remote control via HDMI -Group: Hardware/TV Requires: %{libname} = %{version} %description -n cec-client @@ -73,7 +71,6 @@ %package -n python3-%{name} Summary: Python bindings for %{name} -Group: Hardware/TV %description -n python3-%{name} In combination with the right hardware, libcec allows to control @@ -89,7 +86,6 @@ %package -n %{libname} Summary: USB CEC adapter communication library -Group: System/Libraries %description -n %{libname} In combination with the right hardware, libcec allows to control @@ -98,7 +94,6 @@ %package devel Summary: Development files for the USB CEC adapter communication library -Group: Development/Libraries/C and C++ Requires: %{libname} = %{version} %description devel @@ -120,6 +115,9 @@ %install %cmake_install +# do not ship the static library +rm -f %{buildroot}%{_libdir}/libcec.a + %ldconfig_scriptlets -n %{libname} %files -n cec-client ++++++ libcec-7.0.0.tar.gz -> libcec-7.1.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/.github/workflows/stale.yml new/libcec-libcec-7.1.1/.github/workflows/stale.yml --- old/libcec-libcec-7.0.0/.github/workflows/stale.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/libcec-libcec-7.1.1/.github/workflows/stale.yml 2025-06-23 12:57:23.000000000 +0200 @@ -0,0 +1,25 @@ +name: Close stale issues and pull requests + +on: + schedule: + - cron: '30 * * * *' + +jobs: + stale: + + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-stale: 90 + days-before-close: 1 + operations-per-run: 500 + stale-issue-message: "This issue has now been marked as stale because there hasn't been any activity for 90 days. Please test if this issue is still relevant when using the [latest version of libCEC](https://github.com/Pulse-Eight/libcec/releases/tag/libcec-7.0.0) and remove the stale label or add a comment to reset the stale state." + stale-issue-label: 'stale' + stale-pr-message: "This pull request has now been marked as stale because there hasn't been any activity for 90 days. Please check if this pull request is still relevant when using the [latest version of libCEC](https://github.com/Pulse-Eight/libcec/releases/tag/libcec-7.0.0) and remove the stale label or add a comment to reset the stale state." + stale-pr-label: 'stale' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/CMakeLists.txt new/libcec-libcec-7.1.1/CMakeLists.txt --- old/libcec-libcec-7.0.0/CMakeLists.txt 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/CMakeLists.txt 2025-06-23 12:57:23.000000000 +0200 @@ -2,16 +2,16 @@ project(libcec) set(LIBCEC_VERSION_MAJOR 7) -set(LIBCEC_VERSION_MINOR 0) -set(LIBCEC_VERSION_PATCH 0) +set(LIBCEC_VERSION_MINOR 1) +set(LIBCEC_VERSION_PATCH 1) # cec-client add_subdirectory(src/cec-client) -add_dependencies(cec-client cec) +add_dependencies(cec-client cec-shared) # cecc-client add_subdirectory(src/cecc-client) -add_dependencies(cecc-client cec) +add_dependencies(cecc-client cec-shared) # pyCecClient add_subdirectory(src/pyCecClient) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/debian/changelog.in new/libcec-libcec-7.1.1/debian/changelog.in --- old/libcec-libcec-7.0.0/debian/changelog.in 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/debian/changelog.in 2025-06-23 12:57:23.000000000 +0200 @@ -1,3 +1,39 @@ +libcec (7.1.1.1~#DIST#) #DIST#; urgency=low + + [ Lars Op den Kamp ] + * fixed: missing cmake include after da0497bdcf2b25c6ed916939123f3ae18a607452 + * fixed: CMakeLists on windows + * fixed: generating pdb in release mode. cleanups + * fixed: also install cec.dll in .net directories (dep of LibCecSharp) + + -- Lars Op den Kamp <[email protected]> Mon, 23 Jun 2025 12:54:27 +0200 + +libcec (7.1.0.1~#DIST#) #DIST#; urgency=medium + + [ Lars Op den Kamp ] + * fixed: physical address auto detection. closes #679. closes #687 + * updated README.linux.md. closes #688 + + [ fuzzard ] + * [libcec] fix incorrect preprocessor command + * [cmake] CheckPlatform correctly check correct x86_64 variable + * [cmake] incorrect usage of _M_ARM64 + + [ chincheta0815 ] + * add Teufel vendor id + * RPiCECAdapterDetection: Include check that we can set passive mode + * correct typo + * add system audio mode request & system audio mode status + * update ceccloader.h + * make cmake obey INSTALLDIR and LIBDIR vars + + [ Andrij Abyzov ] + * Fix another NULL return + * Don't use Bash for setting build variables + * Fix PRId64 define + + -- Lars Op den Kamp <[email protected]> Thu, 19 Jun 2025 12:54:31 +0200 + libcec (7.0.0.1~#DIST#) #DIST#; urgency=medium [ Lars Op den Kamp ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/docs/README.linux.md new/libcec-libcec-7.1.1/docs/README.linux.md --- old/libcec-libcec-7.0.0/docs/README.linux.md 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/docs/README.linux.md 2025-06-23 12:57:23.000000000 +0200 @@ -20,7 +20,7 @@ To compile libCEC on a new Debian/Ubuntu installation, follow these instructions: ``` apt-get update -apt-get install cmake libudev-dev libxrandr-dev python-dev swig +apt-get install cmake libudev-dev libxrandr-dev python3-dev swig git clone https://github.com/Pulse-Eight/libcec.git mkdir libcec/build cd libcec/build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/docs/README.raspberrypi.md new/libcec-libcec-7.1.1/docs/README.raspberrypi.md --- old/libcec-libcec-7.0.0/docs/README.raspberrypi.md 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/docs/README.raspberrypi.md 2025-06-23 12:57:23.000000000 +0200 @@ -1,5 +1,10 @@ -### Raspberry Pi -If you're compiling for a Raspberry Pi, then the path to the required headers and libraries can be set manually, in case it's not in a standard system directory: +# Raspberry Pi + +## Linux Kernel vs. Raspberry Pi driver +On a recent Raspberry Pi that's using the `vc4_kms_3d` dtoverlay, you have to use the [Linux Kernel driver](#compilation-using-the-linux-kernel-driver) and disable the Raspberry Pi driver with `-DHAVE_RPI_API=0` to use CEC. + +## Raspberry Pi driver +If you're compiling the old Raspberry Pi API driver, then the path to the required headers and libraries can be set manually, in case it's not in a standard system directory: ``` cmake -DRPI_INCLUDE_DIR=/path/to/vc/include \ -DRPI_LIB_DIR=/path/to/vc/lib \ @@ -18,6 +23,29 @@ .. ``` +## Compilation using the Linux Kernel driver +To compile libCEC on a new Raspbian installation, follow these instructions: +``` +sudo apt-get update +sudo apt-get -y install cmake libudev-dev libxrandr-dev python3-dev swig git +cd +git clone https://github.com/Pulse-Eight/platform.git +mkdir platform/build +cd platform/build +cmake .. +make +sudo make install +cd +git clone https://github.com/Pulse-Eight/libcec.git +mkdir libcec/build +cd libcec/build +cmake -DHAVE_LINUX_API=1 -DHAVE_RPI_API=0 .. +make -j4 +sudo make install +sudo ldconfig +``` + +## Compilation using the old Raspberry Pi driver To compile libCEC on a new Raspbian installation, follow these instructions: ``` sudo apt-get update diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/include/cec.h new/libcec-libcec-7.1.1/include/cec.h --- old/libcec-libcec-7.0.0/include/cec.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/include/cec.h 2025-06-23 12:57:23.000000000 +0200 @@ -484,6 +484,12 @@ */ virtual bool AudioEnable(bool enable) = 0; + /*! + * @brief Get the current system audio mode status (if an AVR is connected) + * @return The current system audio mode status, or -1 if unknown + */ + virtual uint8_t SystemAudioModeStatus(void) = 0; + #if CEC_LIB_VERSION_MAJOR >= 5 virtual bool GetStats(struct cec_adapter_stats* stats) = 0; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/include/cecc.h new/libcec-libcec-7.1.1/include/cecc.h --- old/libcec-libcec-7.0.0/include/cecc.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/include/cecc.h 2025-06-23 12:57:23.000000000 +0200 @@ -55,7 +55,7 @@ extern DECLSPEC void libcec_clear_configuration(CEC_NAMESPACE libcec_configuration* configuration); #if CEC_LIB_VERSION_MAJOR >= 5 extern DECLSPEC int libcec_set_callbacks(libcec_connection_t connection, CEC_NAMESPACE ICECCallbacks* callbacks, void* cbParam); -extern DECLSPEC int libcec_disabled_callbacks(libcec_connection_t connection); +extern DECLSPEC int libcec_disable_callbacks(libcec_connection_t connection); #else extern DECLSPEC int libcec_enable_callbacks(libcec_connection_t connection, void* cbParam, CEC_NAMESPACE ICECCallbacks* callbacks); #endif @@ -116,6 +116,8 @@ extern DECLSPEC uint8_t libcec_audio_mute(libcec_connection_t connection); extern DECLSPEC uint8_t libcec_audio_unmute(libcec_connection_t connection); extern DECLSPEC uint8_t libcec_audio_get_status(libcec_connection_t connection); +extern DECLSPEC int libcec_system_audio_mode(libcec_connection_t connection, int bEnable); +extern DECLSPEC uint8_t libcec_system_audio_mode_get_status(libcec_connection_t connection); extern DECLSPEC int8_t libcec_detect_adapters(libcec_connection_t connection, CEC_NAMESPACE cec_adapter_descriptor* deviceList, uint8_t iBufSize, const char* strDevicePath, int bQuickScan); #ifdef SWIG %cstring_bounded_output(char* buf, 50); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/include/ceccloader.h new/libcec-libcec-7.1.1/include/ceccloader.h --- old/libcec-libcec-7.0.0/include/ceccloader.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/include/ceccloader.h 2025-06-23 12:57:23.000000000 +0200 @@ -63,11 +63,17 @@ typedef struct { libcec_connection_t connection; libcecc_lib_instance_t lib_instance; + libcec_connection_t (CDECL *initialise)(CEC_NAMESPACE libcec_configuration* configuration); void (CDECL *destroy)(libcec_connection_t connection); int (CDECL *open)(libcec_connection_t connection, const char* strPort, uint32_t iTimeout); void (CDECL *close)(libcec_connection_t connection); void (CDECL *clear_configuration)(CEC_NAMESPACE libcec_configuration* configuration); +#if CEC_LIB_VERSION_MAJOR >= 5 + int (CDECL *set_callbacks)(libcec_connection_t connection, CEC_NAMESPACE ICECCallbacks* callbacks, void* cbParam); + int (CDECL *disable_callbacks)(libcec_connection_t connection); +#else int (CDECL *enable_callbacks)(libcec_connection_t connection, void* cbParam, CEC_NAMESPACE ICECCallbacks* callbacks); +#endif int8_t (CDECL *find_adapters)(libcec_connection_t connection, CEC_NAMESPACE cec_adapter* deviceList, uint8_t iBufSize, const char* strDevicePath); int (CDECL *ping_adapters)(libcec_connection_t connection); int (CDECL *start_bootloader)(libcec_connection_t connection); @@ -97,7 +103,9 @@ int (CDECL *set_hdmi_port)(libcec_connection_t connection, CEC_NAMESPACE cec_logical_address baseDevice, uint8_t iPort); int (CDECL *volume_up)(libcec_connection_t connection, int bSendRelease); int (CDECL *volume_down)(libcec_connection_t connection, int bSendRelease); +#if CEC_LIB_VERSION_MAJOR >= 5 int (CDECL *mute_audio)(libcec_connection_t connection, int bSendRelease); +#endif int (CDECL *send_keypress)(libcec_connection_t connection, CEC_NAMESPACE cec_logical_address iDestination, CEC_NAMESPACE cec_user_control_code key, int bWait); int (CDECL *send_key_release)(libcec_connection_t connection, CEC_NAMESPACE cec_logical_address iDestination, int bWait); int (CDECL *get_device_osd_name)(libcec_connection_t connection, CEC_NAMESPACE cec_logical_address iAddress, CEC_NAMESPACE cec_osd_name name); @@ -105,8 +113,12 @@ int (CDECL *set_stream_path_physical)(libcec_connection_t connection, uint16_t iPhysicalAddress); CEC_NAMESPACE cec_logical_addresses (CDECL *get_logical_addresses)(libcec_connection_t connection); int (CDECL *get_current_configuration)(libcec_connection_t connection, CEC_NAMESPACE libcec_configuration* configuration); +#if CEC_LIB_VERSION_MAJOR >= 5 + int (CDECL *can_save_configuration)(libcec_connection_t connection); +#else int (CDECL *can_persist_configuration)(libcec_connection_t connection); int (CDECL *persist_configuration)(libcec_connection_t connection, CEC_NAMESPACE libcec_configuration* configuration); +#endif int (CDECL *set_configuration)(libcec_connection_t connection, const CEC_NAMESPACE libcec_configuration* configuration); void (CDECL *rescan_devices)(libcec_connection_t connection); int (CDECL *is_libcec_active_source)(libcec_connection_t connection); @@ -119,6 +131,8 @@ uint8_t (CDECL *audio_mute)(libcec_connection_t connection); uint8_t (CDECL *audio_unmute)(libcec_connection_t connection); uint8_t (CDECL *audio_get_status)(libcec_connection_t connection); + int (CDECL *system_audio_mode)(libcec_connection_t connection, int bEnable); + uint8_t (CDECL *system_audio_mode_get_status)(libcec_connection_t connection); int8_t (CDECL *detect_adapters)(libcec_connection_t connection, CEC_NAMESPACE cec_adapter_descriptor* deviceList, uint8_t iBufSize, const char* strDevicePath, int bQuickScan); void (CDECL *menu_state_to_string)(const CEC_NAMESPACE cec_menu_state state, char* buf, size_t bufsize); void (CDECL *cec_version_to_string)(const CEC_NAMESPACE cec_version version, char* buf, size_t bufsize); @@ -140,11 +154,17 @@ if (!lib || !iface) return -1; + _libcecc_resolve(lib, iface->initialise, "libcec_initialise", libcec_connection_t(CDECL *)(CEC_NAMESPACE libcec_configuration*)); _libcecc_resolve(lib, iface->destroy, "libcec_destroy", void(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->open, "libcec_open", int(CDECL *)(libcec_connection_t, const char*, uint32_t)); _libcecc_resolve(lib, iface->close, "libcec_close", void(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->clear_configuration, "libcec_clear_configuration", void(CDECL *)(CEC_NAMESPACE libcec_configuration*)); +#if CEC_LIB_VERSION_MAJOR >= 5 + _libcecc_resolve(lib, iface->set_callbacks, "libcec_set_callbacks", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE ICECCallbacks*, void*)); + _libcecc_resolve(lib, iface->disable_callbacks, "libcec_disable_callbacks", int(CDECL *)(libcec_connection_t)); +#else _libcecc_resolve(lib, iface->enable_callbacks, "libcec_enable_callbacks", int(CDECL *)(libcec_connection_t, void*, CEC_NAMESPACE ICECCallbacks*)); +#endif _libcecc_resolve(lib, iface->find_adapters, "libcec_find_adapters", int8_t(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_adapter*, uint8_t, const char*)); _libcecc_resolve(lib, iface->ping_adapters, "libcec_ping_adapters", int(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->start_bootloader, "libcec_start_bootloader", int(CDECL *)(libcec_connection_t)); @@ -174,7 +194,9 @@ _libcecc_resolve(lib, iface->set_hdmi_port, "libcec_set_hdmi_port", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_logical_address, uint8_t)); _libcecc_resolve(lib, iface->volume_up, "libcec_volume_up", int(CDECL *)(libcec_connection_t, int)); _libcecc_resolve(lib, iface->volume_down, "libcec_volume_down", int(CDECL *)(libcec_connection_t, int)); +#if CEC_LIB_VERSION_MAJOR >= 5 _libcecc_resolve(lib, iface->mute_audio, "libcec_mute_audio", int(CDECL *)(libcec_connection_t, int)); +#endif _libcecc_resolve(lib, iface->send_keypress, "libcec_send_keypress", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_logical_address, CEC_NAMESPACE cec_user_control_code, int)); _libcecc_resolve(lib, iface->send_key_release, "libcec_send_key_release", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_logical_address, int)); _libcecc_resolve(lib, iface->get_device_osd_name, "libcec_get_device_osd_name", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_logical_address, CEC_NAMESPACE cec_osd_name)); @@ -182,8 +204,12 @@ _libcecc_resolve(lib, iface->set_stream_path_physical, "libcec_set_stream_path_physical", int(CDECL *)(libcec_connection_t, uint16_t)); _libcecc_resolve(lib, iface->get_logical_addresses, "libcec_get_logical_addresses", CEC_NAMESPACE cec_logical_addresses(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->get_current_configuration, "libcec_get_current_configuration", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE libcec_configuration*)); +#if CEC_LIB_VERSION_MAJOR >= 5 + _libcecc_resolve(lib, iface->can_save_configuration, "libcec_can_save_configuration", int(CDECL *)(libcec_connection_t)); +#else _libcecc_resolve(lib, iface->can_persist_configuration, "libcec_can_persist_configuration", int(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->persist_configuration, "libcec_persist_configuration", int(CDECL *)(libcec_connection_t, CEC_NAMESPACE libcec_configuration*)); +#endif _libcecc_resolve(lib, iface->set_configuration, "libcec_set_configuration", int(CDECL *)(libcec_connection_t, const CEC_NAMESPACE libcec_configuration*)); _libcecc_resolve(lib, iface->rescan_devices, "libcec_rescan_devices", void(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->is_libcec_active_source, "libcec_is_libcec_active_source", int(CDECL *)(libcec_connection_t)); @@ -196,6 +222,8 @@ _libcecc_resolve(lib, iface->audio_mute, "libcec_audio_mute", uint8_t(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->audio_unmute, "libcec_audio_unmute", uint8_t(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->audio_get_status, "libcec_audio_get_status", uint8_t(CDECL *)(libcec_connection_t)); + _libcecc_resolve(lib, iface->system_audio_mode, "libcec_system_audio_mode", int(CDECL *)(libcec_connection_t, int)); + _libcecc_resolve(lib, iface->system_audio_mode_get_status, "libcec_system_audio_mode_get_status", uint8_t(CDECL *)(libcec_connection_t)); _libcecc_resolve(lib, iface->detect_adapters, "libcec_detect_adapters", int8_t(CDECL *)(libcec_connection_t, CEC_NAMESPACE cec_adapter_descriptor*, uint8_t, const char*, int)); _libcecc_resolve(lib, iface->menu_state_to_string, "libcec_menu_state_to_string", void(CDECL *)(const CEC_NAMESPACE cec_menu_state, char*, size_t)); _libcecc_resolve(lib, iface->cec_version_to_string, "libcec_cec_version_to_string", void(CDECL *)(const CEC_NAMESPACE cec_version, char*, size_t)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/include/cecloader.h new/libcec-libcec-7.1.1/include/cecloader.h --- old/libcec-libcec-7.0.0/include/cecloader.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/include/cecloader.h 2025-06-23 12:57:23.000000000 +0200 @@ -88,7 +88,7 @@ if (!g_libCEC) g_libCEC = LoadLibrary(strLib ? strLib : "cec.dll"); if (!g_libCEC) - return NULL; + return false; typedef bool (__cdecl*_LibCecBootloader)(void); _LibCecBootloader LibCecBootloader; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/include/cectypes.h new/libcec-libcec-7.1.1/include/cectypes.h --- old/libcec-libcec-7.0.0/include/cectypes.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/include/cectypes.h 2025-06-23 12:57:23.000000000 +0200 @@ -92,6 +92,11 @@ #define CEC_POWER_STATE_REFRESH_TIME 30000 /*! + * don't query the audio state for the same device within this timeout in milliseconds + */ +#define CEC_AUDIO_STATUS_REFRESH_TIME 200 + +/*! * unknown firmware version value */ #define CEC_FW_VERSION_UNKNOWN 0xFFFF @@ -540,7 +545,8 @@ typedef enum cec_system_audio_status { CEC_SYSTEM_AUDIO_STATUS_OFF = 0, - CEC_SYSTEM_AUDIO_STATUS_ON = 1 + CEC_SYSTEM_AUDIO_STATUS_ON = 1, + CEC_SYSTEM_AUDIO_STATUS_UNKNOWN = 2 } cec_system_audio_status; typedef enum cec_timer_cleared_status_data @@ -869,6 +875,7 @@ CEC_VENDOR_LG = 0x00E091, CEC_VENDOR_SHARP = 0x08001F, CEC_VENDOR_SONY = 0x080046, + CEC_VENDOR_TEUFEL = 0x232425, CEC_VENDOR_BROADCOM = 0x18C086, CEC_VENDOR_SHARP2 = 0x534850, CEC_VENDOR_VIZIO = 0x6B746D, @@ -1575,11 +1582,11 @@ { iPhysicalAddress = CEC_PHYSICAL_ADDRESS_TV; baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE; - iHDMIPort = CEC_DEFAULT_HDMI_PORT; + iHDMIPort = CEC_HDMI_PORTNUMBER_NONE; tvVendor = (uint32_t)CEC_VENDOR_UNKNOWN; clientVersion = LIBCEC_VERSION_CURRENT; serverVersion = LIBCEC_VERSION_CURRENT; - bAutodetectAddress = 0; + bAutodetectAddress = 1; bGetSettingsFromROM = CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM; bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE; bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/project/nsis/libcec-pdb.nsh new/libcec-libcec-7.1.1/project/nsis/libcec-pdb.nsh --- old/libcec-libcec-7.0.0/project/nsis/libcec-pdb.nsh 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/project/nsis/libcec-pdb.nsh 2025-06-23 12:57:23.000000000 +0200 @@ -3,7 +3,7 @@ SectionIn 1 SetOutPath "$INSTDIR" - File "${BINARY_SOURCE_DIR}\lib\cec.pdb" + File "${BINARY_SOURCE_DIR}\cec.pdb" File "${BINARY_SOURCE_DIR}\cec-tray.pdb" SetOutPath "$INSTDIR\netfx" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/project/nsis/sections.nsh new/libcec-libcec-7.1.1/project/nsis/sections.nsh --- old/libcec-libcec-7.0.0/project/nsis/sections.nsh 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/project/nsis/sections.nsh 2025-06-23 12:57:23.000000000 +0200 @@ -95,6 +95,7 @@ ; Copy binaries SetOutPath "$INSTDIR\net8.0" + File "${BINARY_SOURCE_DIR}\cec.dll" File "${BINARY_SOURCE_DIR}\net8.0\LibCecSharpCore.deps.json" File "${BINARY_SOURCE_DIR}\net8.0\LibCecSharpCore.dll" File "${BINARY_SOURCE_DIR}\net8.0\LibCecSharpCore.runtimeconfig.json" @@ -111,6 +112,7 @@ ; Copy binaries SetOutPath "$INSTDIR\netfx" + File "${BINARY_SOURCE_DIR}\cec.dll" File "${BINARY_SOURCE_DIR}\LibCecSharp.dll" File "${BINARY_SOURCE_DIR}\LibCecSharp.xml" File /nonfatal "${BINARY_SOURCE_DIR}\CecSharpTester.exe" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/cec-client/CMakeLists.txt new/libcec-libcec-7.1.1/src/cec-client/CMakeLists.txt --- old/libcec-libcec-7.0.0/src/cec-client/CMakeLists.txt 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/cec-client/CMakeLists.txt 2025-06-23 12:57:23.000000000 +0200 @@ -12,6 +12,7 @@ include(CheckLibraryExists) include(CheckIncludeFiles) include(CheckCXXCompilerFlag) +include(CheckSymbolExists) include(../../cmake/WindowsDebug.cmake) check_cxx_compiler_flag("-std=c++11" SUPPORTS_CXX11) @@ -66,7 +67,9 @@ endif() else() add_definitions(-DTARGET_WINDOWS -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_WINSOCKAPI_) - if ((${WIN64}) OR (${_M_ARM64})) + check_symbol_exists(_AMD64_ Windows.h WIN64) + check_symbol_exists(_ARM64_ Windows.h ARM64) + if (WIN64 OR ARM64) string(REPLACE "/arch:SSE2" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) else() add_definitions(-D_USE_32BIT_TIME_T) @@ -85,5 +88,5 @@ DESTINATION .) else() install(TARGETS cec-client - DESTINATION bin) + DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/cec-client/cec-client.cpp new/libcec-libcec-7.1.1/src/cec-client/cec-client.cpp --- old/libcec-libcec-7.0.0/src/cec-client/cec-client.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/cec-client/cec-client.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -339,6 +339,10 @@ "[pa] {physical address} change the physical address of the CEC adapter." << std::endl << "[as] make the CEC adapter the active source." << std::endl << "[is] mark the CEC adapter as inactive source." << std::endl << + "[ea] enable system audio mode." << std::endl << + "[da] disable system audio mode." << std::endl << + "[gas] get audio status." << std::endl << + "[gsam] get system audio mode status." << std::endl << "[osd] {addr} {string} set OSD message on the specified device." << std::endl << "[ver] {addr} get the CEC version of the specified device." << std::endl << "[ven] {addr} get the vendor ID of the specified device." << std::endl << @@ -481,6 +485,54 @@ return false; } +bool ProcessCommandGAS(ICECAdapter *parser, const std::string &command, std::string & UNUSED(arguments)) +{ + if (command == "gas") + { + PrintToStdOut("Audio Status: %02x", parser->AudioStatus()); + return true; + } + + return false; +} + +bool ProcessCommandGSAM(ICECAdapter *parser, const std::string &command, std::string & UNUSED(arguments)) +{ + if (command == "gsam") + { + PrintToStdOut("System Audio Mode Status: %d", parser->SystemAudioModeStatus()); + return true; + } + + return false; +} + +bool ProcessCommandEA(ICECAdapter *parser, const std::string &command, std::string & UNUSED(arguments)) +{ + if (command == "ea") + { + if (parser->AudioEnable(true)) { + PrintToStdOut("Request System Audio Mode On sent."); + return true; + } + } + + return false; +} + +bool ProcessCommandDA(ICECAdapter *parser, const std::string &command, std::string & UNUSED(arguments)) +{ + if (command == "da") + { + if (parser->AudioEnable(false)) { + PrintToStdOut("Request System Audio Mode Off sent."); + return true; + } + } + + return false; +} + bool ProcessCommandPOLL(ICECAdapter *parser, const std::string &command, std::string &arguments) { if (command == "poll") @@ -991,6 +1043,10 @@ ProcessCommandSCAN(parser, command, input) || ProcessCommandSP(parser, command, input) || ProcessCommandSPL(parser, command, input) || + ProcessCommandEA(parser, command, input) || + ProcessCommandDA(parser, command, input) || + ProcessCommandGAS(parser, command, input) || + ProcessCommandGSAM(parser, command, input) || ProcessCommandSELF(parser, command, input) #if CEC_LIB_VERSION_MAJOR >= 5 || ProcessCommandSTATS(parser, command, input) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/cecc-client/CMakeLists.txt new/libcec-libcec-7.1.1/src/cecc-client/CMakeLists.txt --- old/libcec-libcec-7.0.0/src/cecc-client/CMakeLists.txt 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/cecc-client/CMakeLists.txt 2025-06-23 12:57:23.000000000 +0200 @@ -36,7 +36,9 @@ endif() else() add_definitions(-DTARGET_WINDOWS -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_WINSOCKAPI_) - if ((${WIN64}) OR (${_M_ARM64})) + check_symbol_exists(_AMD64_ Windows.h WIN64) + check_symbol_exists(_ARM64_ Windows.h ARM64) + if (WIN64 OR ARM64) string(REPLACE "/arch:SSE2" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) else() add_definitions(-D_USE_32BIT_TIME_T) @@ -55,5 +57,5 @@ DESTINATION .) else() install(TARGETS cecc-client - DESTINATION bin) + DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/cecc-client/cecc-client.c new/libcec-libcec-7.1.1/src/cecc-client/cecc-client.c --- old/libcec-libcec-7.0.0/src/cecc-client/cecc-client.c 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/cecc-client/cecc-client.c 2025-06-23 12:57:23.000000000 +0200 @@ -55,7 +55,7 @@ } #define sleep(x) usleep(1000000 * x) -#define PRId64 "%lld" +#define PRId64 "lld" #endif static ICECCallbacks g_callbacks = { @@ -110,7 +110,7 @@ break; } - printf("%s[" PRId64 "]\t%s\n", strLevel, message->time, message->message); + printf("%s[%" PRId64 "]\t%s\n", strLevel, message->time, message->message); } } @@ -320,6 +320,54 @@ return 0; } +static int cec_process_command_ea(const char* data) +{ + if (strncmp(data, "ea", 2) == 0) + { + if (g_iface.system_audio_mode(g_iface.connection, 1)) { + printf("Request System Audio Mode On sent.\n"); + return 1; + } + } + + return 0; +} + +static int cec_process_command_da(const char* data) +{ + if (strncmp(data, "da", 2) == 0) + { + if (g_iface.system_audio_mode(g_iface.connection, 0)) { + printf("Request System Audio Mode Off sent.\n"); + return 1; + } + } + + return 0; +} + +static int cec_process_command_gas(const char *data) +{ + if (strncmp(data, "gas", 2) == 0) + { + printf("Audio Status: %02x\n", g_iface.audio_get_status(g_iface.connection)); + return 1; + } + + return 0; +} + +static int cec_process_command_gsam(const char *data) +{ + if (strncmp(data, "gsam", 2) == 0) + { + printf("System Audio Mode Status: %d\n", g_iface.system_audio_mode_get_status(g_iface.connection)); + return 1; + } + + return 0; +} + static int cec_process_command_scan(const char* data) { if (strncmp(data, "scan", 4) == 0) @@ -386,6 +434,10 @@ return 0; cec_process_command_as(buffer) || + cec_process_command_ea(buffer) || + cec_process_command_da(buffer) || + cec_process_command_gas(buffer) || + cec_process_command_gsam(buffer) || cec_process_command_scan(buffer); //TODO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/dotnetlib/CecSharpTypes.h new/libcec-libcec-7.1.1/src/dotnetlib/CecSharpTypes.h --- old/libcec-libcec-7.0.0/src/dotnetlib/CecSharpTypes.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/dotnetlib/CecSharpTypes.h 2025-06-23 12:57:23.000000000 +0200 @@ -817,6 +817,7 @@ Sony = 0x080046, Broadcom = 0x18C086, Sharp2 = 0x534850, + Teufel = 0x232425, Vizio = 0x6B746D, Benq = 0x8065E9, HarmanKardon = 0x9C645E, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/dotnetlib/LibCecSharp/LibCecSharp.vcxproj new/libcec-libcec-7.1.1/src/dotnetlib/LibCecSharp/LibCecSharp.vcxproj --- old/libcec-libcec-7.0.0/src/dotnetlib/LibCecSharp/LibCecSharp.vcxproj 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/dotnetlib/LibCecSharp/LibCecSharp.vcxproj 2025-06-23 12:57:23.000000000 +0200 @@ -100,7 +100,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)cec-static.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)cec.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> <GenerateDebugInformation>true</GenerateDebugInformation> <AssemblyDebug>true</AssemblyDebug> <TargetMachine>MachineX86</TargetMachine> @@ -122,7 +122,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)cec-static.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)cec.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> <GenerateDebugInformation>true</GenerateDebugInformation> <AssemblyDebug>true</AssemblyDebug> <TargetMachine>MachineX64</TargetMachine> @@ -143,7 +143,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)cec-static.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)cec.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> <TargetMachine>MachineX86</TargetMachine> </Link> </ItemDefinitionGroup> @@ -162,7 +162,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)cec-static.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)cec.lib;$(OutDir)lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/dotnetlib/LibCecSharpCore/LibCecSharpCore.vcxproj new/libcec-libcec-7.1.1/src/dotnetlib/LibCecSharpCore/LibCecSharpCore.vcxproj --- old/libcec-libcec-7.0.0/src/dotnetlib/LibCecSharpCore/LibCecSharpCore.vcxproj 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/dotnetlib/LibCecSharpCore/LibCecSharpCore.vcxproj 2025-06-23 12:57:23.000000000 +0200 @@ -91,7 +91,7 @@ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)..\cec-static.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)..\cec.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> @@ -103,7 +103,7 @@ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)..\cec-static.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)..\cec.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> @@ -115,7 +115,7 @@ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)..\cec-static.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)..\cec.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -127,7 +127,7 @@ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles> </ClCompile> <Link> - <AdditionalDependencies>$(OutDir)..\cec-static.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>$(OutDir)..\cec.lib;$(OutDir)..\lib\p8-platform.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/CECClient.cpp new/libcec-libcec-7.1.1/src/libcec/CECClient.cpp --- old/libcec-libcec-7.0.0/src/libcec/CECClient.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/CECClient.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -263,17 +263,14 @@ } // reset to defaults if something went wrong - ResetPhysicalAddress(); + if (m_processor->CECInitialised()) { + ResetPhysicalAddress(); + } return false; } bool CCECClient::SetPhysicalAddress(const uint16_t iPhysicalAddress) { - if (m_configuration.iPhysicalAddress == iPhysicalAddress) - { - return true; - } - // update the configuration { CLockObject lock(m_mutex); @@ -828,6 +825,13 @@ return device && audio && audio->IsPresent() ? audio->GetAudioStatus(device->GetLogicalAddress()) : (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN; } +uint8_t CCECClient::SystemAudioModeStatus(void) +{ + CCECBusDevice *device = GetPrimaryDevice(); + CCECAudioSystem *audio = m_processor->GetAudioSystem(); + return device && audio && audio->IsPresent() ? audio->GetSystemAudioModeStatus(device->GetLogicalAddress()) : (uint8_t)CEC_SYSTEM_AUDIO_STATUS_UNKNOWN; +} + bool CCECClient::SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait /* = true */) { CCECBusDevice *dest = m_processor->GetDevice(iDestination); @@ -1367,6 +1371,7 @@ uint16_t iPhysicalAddress = !!m_processor ? m_processor->GetDetectedPhysicalAddress() : CEC_INVALID_PHYSICAL_ADDRESS; + CLockObject lock(m_mutex); if (CLibCEC::IsValidPhysicalAddress(iPhysicalAddress) && (iPhysicalAddress != CEC_PHYSICAL_ADDRESS_TV)) @@ -1808,11 +1813,11 @@ bool CCECClient::AudioEnable(bool enable) { - CCECBusDevice* device = enable ? GetPrimaryDevice() : nullptr; + CCECBusDevice* device = GetPrimaryDevice(); CCECAudioSystem* audio = m_processor->GetAudioSystem(); return !!audio ? - audio->EnableAudio(device) : + audio->AudioEnable(device, enable) : false; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/CECClient.h new/libcec-libcec-7.1.1/src/libcec/CECClient.h --- old/libcec-libcec-7.0.0/src/libcec/CECClient.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/CECClient.h 2025-06-23 12:57:23.000000000 +0200 @@ -303,6 +303,7 @@ virtual uint8_t AudioMute(void); virtual uint8_t AudioUnmute(void); virtual uint8_t AudioStatus(void); + virtual uint8_t SystemAudioModeStatus(void); virtual bool SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait = true); virtual bool SendKeyRelease(const cec_logical_address iDestination, bool bWait = true); virtual std::string GetDeviceOSDName(const cec_logical_address iAddress); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/CECProcessor.cpp new/libcec-libcec-7.1.1/src/libcec/CECProcessor.cpp --- old/libcec-libcec-7.0.0/src/libcec/CECProcessor.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/CECProcessor.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -884,17 +884,24 @@ // mark as uninitialised client->SetInitialised(false); + uint16_t detectedAddress = 0; + if ((configuration.bAutodetectAddress == 1) + && (!CLibCEC::IsValidPhysicalAddress(configuration.iPhysicalAddress)) + && ((detectedAddress = GetDetectedPhysicalAddress()) != CEC_INVALID_PHYSICAL_ADDRESS) + && CLibCEC::IsValidPhysicalAddress(detectedAddress)) { + configuration.iPhysicalAddress = detectedAddress; + } // get the settings from eeprom { libcec_configuration config; config.Clear(); m_communication->GetConfiguration(config); { - CLockObject lock(m_mutex); if (configuration.bGetSettingsFromROM == 1) { if (!config.deviceTypes.IsEmpty()) configuration.deviceTypes = config.deviceTypes; - if (CLibCEC::IsValidPhysicalAddress(config.iPhysicalAddress)) + if (!CLibCEC::IsValidPhysicalAddress(configuration.iPhysicalAddress) + && CLibCEC::IsValidPhysicalAddress(config.iPhysicalAddress)) configuration.iPhysicalAddress = config.iPhysicalAddress; snprintf(configuration.strDeviceName, LIBCEC_OSD_NAME_SIZE, "%s", config.strDeviceName); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/CECTypeUtils.h new/libcec-libcec-7.1.1/src/libcec/CECTypeUtils.h --- old/libcec-libcec-7.0.0/src/libcec/CECTypeUtils.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/CECTypeUtils.h 2025-06-23 12:57:23.000000000 +0200 @@ -466,7 +466,7 @@ case CEC_SYSTEM_AUDIO_STATUS_OFF: return "off"; default: - return "unknown"; + return "UNKNOWN"; } } @@ -533,6 +533,8 @@ return "Pulse Eight"; case CEC_VENDOR_GOOGLE: return "Google"; + case CEC_VENDOR_TEUFEL: + return "Teufel"; default: return "Unknown"; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/CMakeLists.txt new/libcec-libcec-7.1.1/src/libcec/CMakeLists.txt --- old/libcec-libcec-7.0.0/src/libcec/CMakeLists.txt 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/CMakeLists.txt 2025-06-23 12:57:23.000000000 +0200 @@ -161,7 +161,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libcec.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/libcec.rc) add_definitions(-DDLL_EXPORT) add_definitions(-DTARGET_WINDOWS -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_WINSOCKAPI_) - if ((${WIN64}) OR (${_M_ARM64})) + if (WIN64 OR ARM64) string(REPLACE "/arch:SSE2" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) else() add_definitions(-D_USE_32BIT_TIME_T) @@ -186,53 +186,50 @@ ${PROJECT_SOURCE_DIR}/../../include/ceccloader.h ${PROJECT_SOURCE_DIR}/../../include/cectypes.h ${PROJECT_SOURCE_DIR}/../../include/version.h - DESTINATION include/libcec) + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libcec) # external dependencies include(cmake/LinkPlatformSupport.cmake) -# libCEC shared target -add_library(cec SHARED ${CEC_SOURCES}) -install(TARGETS cec - DESTINATION ${LIB_DESTINATION}) -set_target_properties(cec PROPERTIES VERSION ${LIBCEC_VERSION_MAJOR}.${LIBCEC_VERSION_MINOR}.${LIBCEC_VERSION_PATCH} - SOVERSION ${LIBCEC_VERSION_MAJOR}) -target_link_libraries(cec ${cec_depends}) +set(libsrc ${CEC_SOURCES}) +add_library(libobj OBJECT ${libsrc}) +set_property(TARGET libobj PROPERTY POSITION_INDEPENDENT_CODE 1) + + +add_library(cec-shared SHARED $<TARGET_OBJECTS:libobj>) +set_target_properties(cec-shared PROPERTIES + VERSION ${LIBCEC_VERSION_MAJOR}.${LIBCEC_VERSION_MINOR}.${LIBCEC_VERSION_PATCH} + SOVERSION ${LIBCEC_VERSION_MAJOR} + OUTPUT_NAME cec) +target_link_libraries(cec-shared ${cec_depends}) + + +add_library(cec-static STATIC $<TARGET_OBJECTS:libobj>) +set_target_properties(cec-static PROPERTIES + VERSION ${LIBCEC_VERSION_MAJOR}.${LIBCEC_VERSION_MINOR}.${LIBCEC_VERSION_PATCH} + SOVERSION ${LIBCEC_VERSION_MAJOR} + OUTPUT_NAME cec) +target_link_libraries(cec-static ${cec_depends}) if(WIN32) if (MSVC) # generate pdb in release mode too - set_target_properties(cec - PROPERTIES - COMPILE_PDB_NAME_DEBUG cec${CMAKE_DEBUG_POSTFIX} + cmake_policy(SET CMP0141 NEW) + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Release,RelWithDebInfo>:ProgramDatabase>") + + set_target_properties(cec-shared PROPERTIES + COMPILE_PDB_NAME_DEBUG cec COMPILE_PDB_NAME_RELEASE cec COMPILE_PDB_NAME_MINSIZEREL cec COMPILE_PDB_NAME_RELWITHDEBINFO cec) - endif(MSVC) - - # libCEC static target used by .net wrappers - add_library(cec-static STATIC ${CEC_SOURCES}) - install(TARGETS cec-static - DESTINATION ${LIB_DESTINATION}) - set_target_properties(cec-static PROPERTIES VERSION ${LIBCEC_VERSION_MAJOR}.${LIBCEC_VERSION_MINOR}.${LIBCEC_VERSION_PATCH} - SOVERSION ${LIBCEC_VERSION_MAJOR}) - target_link_libraries(cec-static ${cec_depends}) - - if (MSVC) - # generate pdb in release mode too - set_target_properties(cec-static - PROPERTIES - COMPILE_PDB_NAME_DEBUG cec-static${CMAKE_DEBUG_POSTFIX} - COMPILE_PDB_NAME_RELEASE cec-static - COMPILE_PDB_NAME_MINSIZEREL cec-static - COMPILE_PDB_NAME_RELWITHDEBINFO cec-static) # install generated pdb - install(FILES $<TARGET_FILE_DIR:cec>/cec.pdb - DESTINATION "${CMAKE_INSTALL_LIBDIR}") - install(FILES $<TARGET_FILE_DIR:cec-static>/cec-static.pdb - DESTINATION "${CMAKE_INSTALL_LIBDIR}") + install(FILES $<TARGET_FILE_DIR:cec-shared>/cec.pdb + DESTINATION ${LIB_DESTINATION}) endif(MSVC) endif(WIN32) +install(TARGETS cec-shared cec-static + DESTINATION ${LIB_DESTINATION}) + include(cmake/DisplayPlatformSupport.cmake) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/LibCEC.cpp new/libcec-libcec-7.1.1/src/libcec/LibCEC.cpp --- old/libcec-libcec-7.0.0/src/libcec/LibCEC.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/LibCEC.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -532,7 +532,7 @@ #define FEATURES "'P8 USB' 'P8 USB detect'" #if defined(_WIN64) #define HOST_TYPE "Windows (x64)" -#elseif defined(_M_ARM64) +#elif defined(_M_ARM64) #define HOST_TYPE "Windows (ARM64)" #else #define HOST_TYPE "Windows (x86)" @@ -582,6 +582,11 @@ return m_client ? m_client->AudioStatus() : (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN; } +uint8_t CLibCEC::SystemAudioModeStatus(void) +{ + return m_client ? m_client->SystemAudioModeStatus() : (uint8_t)CEC_SYSTEM_AUDIO_STATUS_UNKNOWN; +} + int8_t CLibCEC::DetectAdapters(cec_adapter_descriptor *deviceList, uint8_t iBufSize, const char *strDevicePath /* = nullptr */, bool bQuickScan /* = false */) { int8_t iAdaptersFound = CAdapterFactory(this).DetectAdapters(deviceList, iBufSize, strDevicePath); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/LibCEC.h new/libcec-libcec-7.1.1/src/libcec/LibCEC.h --- old/libcec-libcec-7.0.0/src/libcec/LibCEC.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/LibCEC.h 2025-06-23 12:57:23.000000000 +0200 @@ -164,6 +164,7 @@ cec_command CommandFromString(const char* strCommand); bool AudioEnable(bool enable); + uint8_t SystemAudioModeStatus(void); bool GetStats(struct cec_adapter_stats* stats); CCECProcessor * m_cec; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/LibCECC.cpp new/libcec-libcec-7.1.1/src/libcec/LibCECC.cpp --- old/libcec-libcec-7.0.0/src/libcec/LibCECC.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/LibCECC.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -544,6 +544,22 @@ (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN; } +int libcec_system_audio_mode(libcec_connection_t connection, int bEnable) +{ + ICECAdapter* adapter = static_cast<ICECAdapter*>(connection); + return adapter ? + adapter->AudioEnable(bEnable) : + -1; +} + +uint8_t libcec_system_audio_mode_get_status(libcec_connection_t connection) +{ + ICECAdapter* adapter = static_cast<ICECAdapter*>(connection); + return adapter ? + adapter->SystemAudioModeStatus() : + (uint8_t)CEC_SYSTEM_AUDIO_STATUS_UNKNOWN; +} + int8_t libcec_detect_adapters(libcec_connection_t connection, cec_adapter_descriptor* deviceList, uint8_t iBufSize, const char* strDevicePath, int bQuickScan) { ICECAdapter* adapter = static_cast<ICECAdapter*>(connection); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/adapter/RPi/RPiCECAdapterDetection.cpp new/libcec-libcec-7.1.1/src/libcec/adapter/RPi/RPiCECAdapterDetection.cpp --- old/libcec-libcec-7.0.0/src/libcec/adapter/RPi/RPiCECAdapterDetection.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/adapter/RPi/RPiCECAdapterDetection.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -39,6 +39,7 @@ extern "C" { #include <interface/vmcs_host/vc_cecservice.h> #include <interface/vchiq_arm/vchiq_if.h> +#include <bcm_host.h> } using namespace CEC; @@ -54,6 +55,10 @@ if ((iResult = vchi_connect(NULL, 0, vchiq_instance)) != VCHIQ_SUCCESS) return false; + bcm_host_init(); + iResult = vc_cec_set_passive(true); + if (iResult != VCHIQ_SUCCESS) + return false; return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/cmake/CheckPlatformSupport.cmake new/libcec-libcec-7.1.1/src/libcec/cmake/CheckPlatformSupport.cmake --- old/libcec-libcec-7.0.0/src/libcec/cmake/CheckPlatformSupport.cmake 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/cmake/CheckPlatformSupport.cmake 2025-06-23 12:57:23.000000000 +0200 @@ -50,14 +50,14 @@ # force python2 for eventghost set(PYTHON_USE_VERSION 2) elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64") - check_symbol_exists(_X64_ Windows.h WIN64) - check_symbol_exists(_AMD64_ Windows.h AMD64) - if (DEFINED WIN64 OR DEFINED AMD64) + check_symbol_exists(_AMD64_ Windows.h WIN64) + if (DEFINED WIN64) set(LIB_INFO "${LIB_INFO} (x64)") endif() elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM") set(LIB_INFO "${LIB_INFO} (arm)") elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64") + check_symbol_exists(_ARM64_ Windows.h ARM64) set(LIB_INFO "${LIB_INFO} (arm64)") else() message(FATAL_ERROR "Unknown architecture id: ${MSVC_C_ARCHITECTURE_ID}") @@ -325,7 +325,7 @@ SET_SOURCE_FILES_PROPERTIES(libcec.i PROPERTIES CPLUSPLUS ON) set_property(SOURCE libcec.i PROPERTY SWIG_MODULE_NAME cec) SWIG_ADD_LIBRARY(pycec LANGUAGE python TYPE MODULE SOURCES libcec.i) - SWIG_LINK_LIBRARIES(${SWIG_MODULE_pycec_REAL_NAME} cec ${PYTHON_LIBRARIES}) + SWIG_LINK_LIBRARIES(${SWIG_MODULE_pycec_REAL_NAME} cec-shared ${PYTHON_LIBRARIES}) if (NOT WIN32) target_compile_options(pycec PUBLIC "-Wno-unused-parameter") endif() @@ -363,16 +363,16 @@ if (${PYTHON_MAJOR_VERSION} EQUAL 2) install(TARGETS ${SWIG_MODULE_pycec_REAL_NAME} - DESTINATION lib/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/${PYTHON_LIB_INSTALL_PATH}/cec) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/${PYTHON_LIB_INSTALL_PATH}/cec) install(FILES ${CMAKE_BINARY_DIR}/src/libcec/cec.py - DESTINATION lib/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}) install(FILES ${CMAKE_SOURCE_DIR}/src/libcec/cmake/__init__.py - DESTINATION lib/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/cec) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/cec) else() install(TARGETS ${SWIG_MODULE_pycec_REAL_NAME} - DESTINATION lib/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/${PYTHON_LIB_INSTALL_PATH}) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}/${PYTHON_LIB_INSTALL_PATH}) install(FILES ${CMAKE_BINARY_DIR}/src/libcec/cec.py - DESTINATION lib/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION}/${PYTHON_PKG_DIR}) endif() endif() endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/cmake/SetBuildInfo.cmake new/libcec-libcec-7.1.1/src/libcec/cmake/SetBuildInfo.cmake --- old/libcec-libcec-7.0.0/src/libcec/cmake/SetBuildInfo.cmake 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/cmake/SetBuildInfo.cmake 2025-06-23 12:57:23.000000000 +0200 @@ -14,8 +14,8 @@ set(LIB_INFO "") # add git revision to compile info - find_program(HAVE_GIT_BIN git /bin /usr/bin /usr/local/bin) - if(HAVE_GIT_BIN) + find_program(GIT_BIN git /bin /usr/bin /usr/local/bin) + if(GIT_BIN) execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/cmake/git-rev.sh OUTPUT_VARIABLE GIT_REVISION) string(STRIP ${GIT_REVISION} GIT_REVISION) message(STATUS "git found: ${GIT_REVISION}") @@ -29,12 +29,12 @@ set(LIB_INFO "${LIB_INFO} compiled on ${BUILD_DATE}") # add user who built this to compile info - find_program(HAVE_WHOAMI_BIN whoami /bin /usr/bin /usr/local/bin) + find_program(WHOAMI_BIN whoami /bin /usr/bin /usr/local/bin) if (DEFINED ENV{SOURCE_DATE_EPOCH}) set(BUILD_USER "(reproducible)") else() - if(HAVE_WHOAMI_BIN) - execute_process(COMMAND bash -c "whoami" OUTPUT_VARIABLE BUILD_USER) + if(WHOAMI_BIN) + execute_process(COMMAND "${WHOAMI_BIN}" OUTPUT_VARIABLE BUILD_USER) string(STRIP ${BUILD_USER} BUILD_USER) set(LIB_INFO "${LIB_INFO} by ${BUILD_USER}") else() @@ -46,11 +46,11 @@ if (DEFINED ENV{SOURCE_DATE_EPOCH}) set(BUILD_HOST "(reproducible)") else() - find_program(HAVE_HOSTNAME_BIN hostname /bin /usr/bin /usr/local/bin) - if(HAVE_HOSTNAME_BIN) - execute_process(COMMAND bash -c "hostname" ARGS -f OUTPUT_VARIABLE BUILD_HOST RESULT_VARIABLE RETURN_HOST) + find_program(HOSTNAME_BIN hostname /bin /usr/bin /usr/local/bin) + if(HOSTNAME_BIN) + execute_process(COMMAND ${HOSTNAME_BIN} -f OUTPUT_VARIABLE BUILD_HOST RESULT_VARIABLE RETURN_HOST) if (RETURN_HOST) - execute_process(COMMAND bash -c "hostname" OUTPUT_VARIABLE BUILD_HOST) + execute_process(COMMAND ${HOSTNAME_BIN} OUTPUT_VARIABLE BUILD_HOST) endif() string(STRIP ${BUILD_HOST} BUILD_HOST) set(LIB_INFO "${LIB_INFO}@${BUILD_HOST}") @@ -58,11 +58,11 @@ endif() # add host info on which this was built to compile info - find_program(HAVE_UNAME_BIN uname /bin /usr/bin /usr/local/bin) - if(HAVE_UNAME_BIN) - execute_process(COMMAND bash -c "uname" ARGS -s OUTPUT_VARIABLE BUILD_SYSNAME) - execute_process(COMMAND bash -c "uname" ARGS -r OUTPUT_VARIABLE BUILD_SYSVER) - execute_process(COMMAND bash -c "uname" ARGS -m OUTPUT_VARIABLE BUILD_SYSARCH) + find_program(UNAME_BIN uname /bin /usr/bin /usr/local/bin) + if(UNAME_BIN) + execute_process(COMMAND "${UNAME_BIN}" -s OUTPUT_VARIABLE BUILD_SYSNAME) + execute_process(COMMAND "${UNAME_BIN}" -r OUTPUT_VARIABLE BUILD_SYSVER) + execute_process(COMMAND "${UNAME_BIN}" -m OUTPUT_VARIABLE BUILD_SYSARCH) string(STRIP ${BUILD_SYSNAME} BUILD_SYSNAME) string(STRIP ${BUILD_SYSVER} BUILD_SYSVER) string(STRIP ${BUILD_SYSARCH} BUILD_SYSARCH) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/devices/CECAudioSystem.cpp new/libcec-libcec-7.1.1/src/libcec/devices/CECAudioSystem.cpp --- old/libcec-libcec-7.0.0/src/libcec/devices/CECAudioSystem.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/devices/CECAudioSystem.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -47,7 +47,8 @@ CCECAudioSystem::CCECAudioSystem(CCECProcessor *processor, cec_logical_address address, uint16_t iPhysicalAddress /* = CEC_INVALID_PHYSICAL_ADDRESS */) : CCECBusDevice(processor, address, iPhysicalAddress), - m_systemAudioStatus(CEC_SYSTEM_AUDIO_STATUS_ON), + m_iLastAudioStatusUpdate(0), + m_systemAudioModeStatus(CEC_SYSTEM_AUDIO_STATUS_UNKNOWN), m_audioStatus(CEC_AUDIO_VOLUME_STATUS_UNKNOWN) { m_type = CEC_DEVICE_TYPE_AUDIO_SYSTEM; @@ -58,6 +59,7 @@ CLockObject lock(m_mutex); if (m_audioStatus != status) { + m_iLastAudioStatusUpdate = GetTimeMs(); LIB_CEC->AddLog(CEC_LOG_DEBUG, ">> %s (%X): audio status changed from %2x to %2x", GetLogicalAddressName(), m_iLogicalAddress, m_audioStatus, status); m_audioStatus = status; return true; @@ -69,10 +71,10 @@ bool CCECAudioSystem::SetSystemAudioModeStatus(const cec_system_audio_status mode) { CLockObject lock(m_mutex); - if (m_systemAudioStatus != mode) + if (m_systemAudioModeStatus != mode) { - LIB_CEC->AddLog(CEC_LOG_DEBUG, ">> %s (%X): system audio mode status changed from %s to %s", GetLogicalAddressName(), m_iLogicalAddress, ToString(m_systemAudioStatus), ToString(mode)); - m_systemAudioStatus = mode; + LIB_CEC->AddLog(CEC_LOG_DEBUG, ">> %s (%X): system audio mode changed from %s to %s", GetLogicalAddressName(), m_iLogicalAddress, ToString((cec_system_audio_status)m_systemAudioModeStatus), ToString(mode)); + m_systemAudioModeStatus = mode; return true; } @@ -96,8 +98,8 @@ cec_system_audio_status state; { CLockObject lock(m_mutex); - LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< %x -> %x: set system audio mode '%2x'", m_iLogicalAddress, dest, m_audioStatus); - state = m_systemAudioStatus; + LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< %x -> %x: set system audio mode '%d'", m_iLogicalAddress, dest, m_systemAudioModeStatus); + state = (cec_system_audio_status)m_systemAudioModeStatus; } return m_handler->TransmitSetSystemAudioMode(m_iLogicalAddress, dest, state, bIsReply); @@ -108,8 +110,8 @@ cec_system_audio_status state; { CLockObject lock(m_mutex); - LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< %x -> %x: system audio mode '%s'", m_iLogicalAddress, dest, ToString(m_systemAudioStatus)); - state = m_systemAudioStatus; + LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< %x -> %x: system audio mode '%s'", m_iLogicalAddress, dest, ToString((cec_system_audio_status)m_systemAudioModeStatus)); + state = (cec_system_audio_status)m_systemAudioModeStatus; } return m_handler->TransmitSystemAudioModeStatus(m_iLogicalAddress, dest, state, bIsReply); @@ -150,6 +152,21 @@ return bReturn; } +bool CCECAudioSystem::RequestSystemAudioModeStatus(const cec_logical_address initiator, bool bWaitForResponse /* = true */) +{ + bool bReturn(false); + + if (!IsHandledByLibCEC() && + !IsUnsupportedFeature(CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS)) + { + MarkBusy(); + LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< requesting system audio mode status of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress); + bReturn = m_handler->TransmitRequestSystemAudioModeStatus(initiator, m_iLogicalAddress, bWaitForResponse); + MarkReady(); + } + return bReturn; +} + uint8_t CCECAudioSystem::GetAudioStatus(const cec_logical_address initiator, bool bUpdate /* = false */) { bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT); @@ -157,7 +174,8 @@ { CLockObject lock(m_mutex); bRequestUpdate = bIsPresent && - (bUpdate || m_audioStatus == CEC_AUDIO_VOLUME_STATUS_UNKNOWN); + (bUpdate || m_audioStatus == CEC_AUDIO_VOLUME_STATUS_UNKNOWN || + GetTimeMs() - m_iLastAudioStatusUpdate >= CEC_AUDIO_STATUS_REFRESH_TIME); } if (bRequestUpdate) @@ -170,10 +188,32 @@ return m_audioStatus; } -bool CCECAudioSystem::EnableAudio(CCECBusDevice* device /* = nullptr */) +uint8_t CCECAudioSystem::GetSystemAudioModeStatus(const cec_logical_address initiator, bool bUpdate /* = false */) +{ + bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT); + bool bRequestUpdate(false); + { + CLockObject lock(m_mutex); + bRequestUpdate = bIsPresent && + (bUpdate || m_systemAudioModeStatus == CEC_SYSTEM_AUDIO_STATUS_UNKNOWN); + } + + if (bRequestUpdate) + { + CheckVendorIdRequested(initiator); + RequestSystemAudioModeStatus(initiator); + } + + CLockObject lock(m_mutex); + return m_systemAudioModeStatus; +} + +bool CCECAudioSystem::AudioEnable(CCECBusDevice* device, bool bEnable /* = true */) { - uint16_t audioAddress = !!device ? - device->GetCurrentPhysicalAddress() : - CEC_INVALID_PHYSICAL_ADDRESS; - return m_handler->TransmitSystemAudioModeRequest(m_iLogicalAddress, audioAddress); + cec_logical_address iLogicalAddress = device->GetLogicalAddress() ? + device->GetLogicalAddress() : CECDEVICE_UNKNOWN; + uint16_t physicalAddress = bEnable ? device->GetCurrentPhysicalAddress() : + CEC_INVALID_PHYSICAL_ADDRESS; + + return m_handler->TransmitSystemAudioModeRequest(iLogicalAddress, physicalAddress); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/devices/CECAudioSystem.h new/libcec-libcec-7.1.1/src/libcec/devices/CECAudioSystem.h --- old/libcec-libcec-7.0.0/src/libcec/devices/CECAudioSystem.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/devices/CECAudioSystem.h 2025-06-23 12:57:23.000000000 +0200 @@ -53,14 +53,17 @@ uint8_t VolumeDown(const cec_logical_address source, bool bSendRelease = true); uint8_t MuteAudio(const cec_logical_address source); uint8_t GetAudioStatus(const cec_logical_address initiator, bool bUpdate = false); - bool EnableAudio(CCECBusDevice* device = nullptr); + uint8_t GetSystemAudioModeStatus(const cec_logical_address initiator, bool bUpdate = false); + bool AudioEnable(CCECBusDevice* device, bool bEnable = true); bool TransmitActiveSource(bool bIsReply) { (void)bIsReply; return false; } protected: bool RequestAudioStatus(const cec_logical_address initiator, bool bWaitForResponse = true); + bool RequestSystemAudioModeStatus(const cec_logical_address initiator, bool bWaitForResponse = true); - cec_system_audio_status m_systemAudioStatus; + int64_t m_iLastAudioStatusUpdate; + uint8_t m_systemAudioModeStatus; uint8_t m_audioStatus; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/implementations/CECCommandHandler.cpp new/libcec-libcec-7.1.1/src/libcec/implementations/CECCommandHandler.cpp --- old/libcec-libcec-7.0.0/src/libcec/implementations/CECCommandHandler.cpp 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/implementations/CECCommandHandler.cpp 2025-06-23 12:57:23.000000000 +0200 @@ -987,6 +987,14 @@ return Transmit(command, !bWaitForResponse, false); } +bool CCECCommandHandler::TransmitRequestSystemAudioModeStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse /* = true */) +{ + cec_command command; + cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS); + + return Transmit(command, !bWaitForResponse, false); +} + bool CCECCommandHandler::TransmitRequestPhysicalAddress(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse /* = true */) { cec_command command; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/libcec/implementations/CECCommandHandler.h new/libcec-libcec-7.1.1/src/libcec/implementations/CECCommandHandler.h --- old/libcec-libcec-7.0.0/src/libcec/implementations/CECCommandHandler.h 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/libcec/implementations/CECCommandHandler.h 2025-06-23 12:57:23.000000000 +0200 @@ -74,6 +74,7 @@ virtual bool TransmitRequestMenuLanguage(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); virtual bool TransmitRequestOSDName(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); virtual bool TransmitRequestAudioStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); + virtual bool TransmitRequestSystemAudioModeStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); virtual bool TransmitRequestPhysicalAddress(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); virtual bool TransmitRequestPowerStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bUpdate, bool bWaitForResponse = true); virtual bool TransmitRequestVendorId(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse = true); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/src/pyCecClient/CMakeLists.txt new/libcec-libcec-7.1.1/src/pyCecClient/CMakeLists.txt --- old/libcec-libcec-7.0.0/src/pyCecClient/CMakeLists.txt 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/src/pyCecClient/CMakeLists.txt 2025-06-23 12:57:23.000000000 +0200 @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.12.0) project(pyCecClient) +include(GNUInstallDirs) + # Python if(WIN32 AND "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86") set(PYTHON_USE_VERSION 2) @@ -22,7 +24,7 @@ DESTINATION python) else() install(PROGRAMS pyCecClient.py - DESTINATION bin + DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME pyCecClient) endif() endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcec-libcec-7.0.0/windows/build-all.cmd new/libcec-libcec-7.1.1/windows/build-all.cmd --- old/libcec-libcec-7.0.0/windows/build-all.cmd 2025-02-26 10:40:16.000000000 +0100 +++ new/libcec-libcec-7.1.1/windows/build-all.cmd 2025-06-23 12:57:23.000000000 +0200 @@ -22,9 +22,9 @@ SET BUILDARCH=%1 ) -rem optional parameter: build type (Release) +rem optional parameter: build type (RelWithDebInfo) IF "%2" == "" ( - SET BUILDTYPE=Release + SET BUILDTYPE=RelWithDebInfo ) ELSE ( SET BUILDTYPE=%2 ) @@ -59,7 +59,7 @@ rem Compile libCEC CD "%MYDIR%..\project" ECHO. * compiling release libCEC libraries for %BUILDARCH% -CALL "%MYDIR%build-lib.cmd" %BUILDARCH% Release %VSVERSION% "%BUILDPATH%\Release" nmake +CALL "%MYDIR%build-lib.cmd" %BUILDARCH% RelWithDebInfo %VSVERSION% "%BUILDPATH%\Release" nmake IF %errorlevel% neq 0 ( ECHO. *** failed to build libCEC for %BUILDARCH% *** PAUSE
