Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package callaudiod for openSUSE:Factory 
checked in at 2022-09-29 18:14:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/callaudiod (Old)
 and      /work/SRC/openSUSE:Factory/.callaudiod.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "callaudiod"

Thu Sep 29 18:14:38 2022 rev:2 rq:1006952 version:0.1.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/callaudiod/callaudiod.changes    2022-09-02 
21:56:52.308344235 +0200
+++ /work/SRC/openSUSE:Factory/.callaudiod.new.2275/callaudiod.changes  
2022-09-29 18:15:23.131493430 +0200
@@ -1,0 +2,28 @@
+Thu Sep 01 20:33:20 UTC 2022 - [email protected]
+
+- Update to version 0.1.4:
+  * cad-pulse:
+    - Fix possible NULL dereference
+    - Improve monitor source identification
+    - Make sure speaker state is reset between calls
+    - Set D-Bus object properties on state change
+    - Simplify mic mute operation
+    - Track current state
+  * cli: Add --status flag to query current status
+  * dbus: Add properties to track the current state
+  * gitlab-ci: add `debian` folder for CI use
+  * libcallaudio:
+    - Add API to query current state
+    - Don't leak async data
+    - Improve documentation and fix more leaks
+    - Register enums as GType
+    - Use G_DBUS_PROXY_FLAGS_NONE instead of "0"
+  * manager:
+    - Add DBus properties
+    - Remove unused code
+    - Track state of operations
+  * src: make backend responsible for tracking current state
+- Package doc sub-package as noarch.
+- Add apiver define, ease future changes.
+
+-------------------------------------------------------------------

Old:
----
  callaudiod-0.1.3.obscpio

New:
----
  callaudiod-0.1.4.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ callaudiod.spec ++++++
--- /var/tmp/diff_new_pack.lqzS7A/_old  2022-09-29 18:15:23.667494482 +0200
+++ /var/tmp/diff_new_pack.lqzS7A/_new  2022-09-29 18:15:23.671494489 +0200
@@ -16,10 +16,11 @@
 #
 
 %define soname libcallaudio0_1-0
+%define apiver 0.1
 
 
 Name:           callaudiod
-Version:        0.1.3
+Version:        0.1.4
 Release:        0
 Summary:        Daemon for audio calls
 License:        GPL-3.0-or-later AND MIT
@@ -65,6 +66,7 @@
 
 %package doc
 Summary:        API documentation for %{name}
+BuildArch:      noarch
 
 %description doc
 A daemon for audio calls.
@@ -95,12 +97,12 @@
 %{_datadir}/dbus-1/services/org.mobian_project.CallAudio.service
 
 %files -n %{soname}
-%{_libdir}/libcallaudio-0.1.so.0
+%{_libdir}/libcallaudio-%{apiver}.so.*
 
 %files devel
-%{_includedir}/libcallaudio-0.1/
-%{_libdir}/libcallaudio-0.1.so
-%{_libdir}/pkgconfig/libcallaudio-0.1.pc
+%{_includedir}/libcallaudio-%{apiver}/
+%{_libdir}/libcallaudio-%{apiver}.so
+%{_libdir}/pkgconfig/libcallaudio-%{apiver}.pc
 
 %files doc
 %{_datadir}/gtk-doc/html/libcallaudio/

++++++ _service ++++++
--- /var/tmp/diff_new_pack.lqzS7A/_old  2022-09-29 18:15:23.699494544 +0200
+++ /var/tmp/diff_new_pack.lqzS7A/_new  2022-09-29 18:15:23.699494544 +0200
@@ -1,7 +1,7 @@
 <services>
   <service mode="disabled" name="obs_scm">
     <param name="url">https://gitlab.com/mobian1/callaudiod.git</param>
-    <param name="revision">refs/tags/0.1.3</param>
+    <param name="revision">refs/tags/0.1.4</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="scm">git</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.lqzS7A/_old  2022-09-29 18:15:23.719494583 +0200
+++ /var/tmp/diff_new_pack.lqzS7A/_new  2022-09-29 18:15:23.719494583 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.com/mobian1/callaudiod.git</param>
-              <param 
name="changesrevision">4cb8bd9d228d13ea67e79f4c37c674f412b32d20</param></service></servicedata>
+              <param 
name="changesrevision">a7ca6ce9d4c947f19c3f99ff2cab986c64434e57</param></service></servicedata>
 (No newline at EOF)
 

++++++ callaudiod-0.1.3.obscpio -> callaudiod-0.1.4.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/callaudiod.install 
new/callaudiod-0.1.4/.gitlab-ci/debian/callaudiod.install
--- old/callaudiod-0.1.3/.gitlab-ci/debian/callaudiod.install   1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/callaudiod.install   2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,2 @@
+/usr/bin/callaudiod
+/usr/share/dbus-1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/changelog 
new/callaudiod-0.1.4/.gitlab-ci/debian/changelog
--- old/callaudiod-0.1.3/.gitlab-ci/debian/changelog    1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/changelog    2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,5 @@
+callaudiod (@@VERSION@@~ci-1) unstable; urgency=medium
+
+  * CI build
+
+ -- CI <[email protected]>  Thu, 01 Jan 1970 00:00:00 +0000
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/control 
new/callaudiod-0.1.4/.gitlab-ci/debian/control
--- old/callaudiod-0.1.3/.gitlab-ci/debian/control      1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/control      2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,100 @@
+Source: callaudiod
+Section: comm
+Priority: optional
+Maintainer: DebianOnMobile Maintainers 
<[email protected]>
+Uploaders: Arnaud Ferraris <[email protected]>
+Build-Depends:
+ dbus,
+ debhelper-compat (= 13),
+ gtk-doc-tools,
+ jq,
+ libasound2-dev,
+ libglib2.0-dev,
+ libpulse-dev,
+ meson,
+ pkg-config,
+Standards-Version: 4.5.0
+Homepage: https://gitlab.com/mobian1/callaudiod
+Vcs-Git: https://salsa.debian.org/DebianOnMobile-team/callaudiod.git
+Vcs-Browser: https://salsa.debian.org/DebianOnMobile-team/callaudiod
+Rules-Requires-Root: no
+
+Package: callaudiod
+Architecture: any
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+ pulseaudio,
+Description: Call audio routing daemon
+ callaudiod is a daemon for dealing with audio routing during phone calls.
+ It provides a D-Bus interface allowing other programs to:
+   * switch audio profiles
+   * output audio to the speaker or back to its original port
+   * mute the microphone
+ .
+ This package contains the daemon and D-Bus interface definition.
+
+Package: libcallaudio-0-1
+Architecture: any
+Multi-Arch: same
+Section: libs
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+Description: Library for audio routing during voice calls
+ callaudiod is a daemon for dealing with audio routing during phone calls.
+ It provides a D-Bus interface allowing other programs to:
+   * switch audio profiles
+   * output audio to the speaker or back to its original port
+   * mute the microphone
+ .
+ This package contains the shared libraries for applications interfacing with
+ callaudiod.
+
+Package: libcallaudio-dev
+Architecture: any
+Multi-Arch: same
+Section: libdevel
+Depends:
+ libcallaudio-0-1 (= ${binary:Version}),
+ libglib2.0-dev,
+ ${misc:Depends},
+ ${shlibs:Depends},
+Description: Development files for libcallaudio
+ callaudiod is a daemon for dealing with audio routing during phone calls.
+ It provides a D-Bus interface allowing other programs to:
+   * switch audio profiles
+   * output audio to the speaker or back to its original port
+   * mute the microphone
+ .
+ This package contains development files to use when writing applications that
+ interface with callaudiod.
+
+Package: libcallaudio-doc
+Architecture: all
+Section: doc
+Depends:
+ ${misc:Depends}
+Suggests: devhelp
+Description: Documentation for libcallaudio's API
+ callaudiod is a daemon for dealing with audio routing during phone calls.
+ It provides a D-Bus interface allowing other programs to:
+   * switch audio profiles
+   * output audio to the speaker or back to its original port
+   * mute the microphone
+ .
+ This package contains the API documentation.
+
+Package: libcallaudio-tools
+Architecture: any
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+Description: Helper tools for libcallaudio
+ callaudiod is a daemon for dealing with audio routing during phone calls.
+ It provides a D-Bus interface allowing other programs to:
+   * switch audio profiles
+   * output audio to the speaker or back to its original port
+   * mute the microphone
+ .
+ This package contains helper tools for libcallaudio.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/copyright 
new/callaudiod-0.1.4/.gitlab-ci/debian/copyright
--- old/callaudiod-0.1.3/.gitlab-ci/debian/copyright    1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/copyright    2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,52 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: callaudiod
+Upstream-Contact: Arnaud Ferraris <[email protected]>
+Source: https://gitlab.com/mobian1/callaudiod
+
+Files: *
+Copyright:
+ 2018, 2019, 2020 Purism SPC
+ 2020 Arnaud Ferraris <[email protected]>
+License: LGPL-2.1-or-later
+
+Files:
+ src/*
+ tools/*
+Copyright:
+ 2018, 2019, 2020 Purism SPC
+ 2020 Arnaud Ferraris <[email protected]>
+License: GPL-3.0-or-later
+
+License: LGPL-2.1-or-later
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU Lesser General Public License for more details.
+ .
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU Lesser General
+ Public License version 3 can be found in 
"/usr/share/common-licenses/LGPL-2.1".
+
+License: GPL-3.0-or-later
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-0-1.install 
new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-0-1.install
--- old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-0-1.install     
1970-01-01 01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-0-1.install     
2022-03-25 09:58:37.000000000 +0100
@@ -0,0 +1 @@
+/usr/lib/*/libcallaudio-*.so.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-0-1.symbols 
new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-0-1.symbols
--- old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-0-1.symbols     
1970-01-01 01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-0-1.symbols     
2022-03-25 09:58:37.000000000 +0100
@@ -0,0 +1,36 @@
+libcallaudio-0.1.so.0 libcallaudio-0-1 #MINVER#
+* Build-Depends-Package: libcallaudio-dev
+ LIBCALLAUDIO_0_0_0@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_enable_speaker@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_enable_speaker_finish@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_enable_speaker_sync@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_mute_mic@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_mute_mic_finish@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_mute_mic_sync@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_select_mode@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_select_mode_finish@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_call_select_mode_sync@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_complete_enable_speaker@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_complete_mute_mic@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_complete_select_mode@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_get_type@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_interface_info@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_override_properties@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_get_type@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new_finish@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new_for_bus@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new_for_bus_finish@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new_for_bus_sync@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_proxy_new_sync@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_skeleton_get_type@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_dbus_call_audio_skeleton_new@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_deinit@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_enable_speaker@LIBCALLAUDIO_0_0_0 0.0.4
+ call_audio_enable_speaker_async@LIBCALLAUDIO_0_0_0 0.0.5
+ call_audio_is_inited@LIBCALLAUDIO_0_0_0 0.0.4
+ call_audio_init@LIBCALLAUDIO_0_0_0 0.0.1
+ call_audio_mute_mic@LIBCALLAUDIO_0_0_0 0.0.4
+ call_audio_mute_mic_async@LIBCALLAUDIO_0_0_0 0.0.5
+ call_audio_select_mode@LIBCALLAUDIO_0_0_0 0.0.4
+ call_audio_select_mode_async@LIBCALLAUDIO_0_0_0 0.0.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-dev.install 
new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-dev.install
--- old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-dev.install     
1970-01-01 01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-dev.install     
2022-03-25 09:58:37.000000000 +0100
@@ -0,0 +1,3 @@
+/usr/include
+/usr/lib/*/libcallaudio-*.so
+/usr/lib/*/pkgconfig/libcallaudio-*.pc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-doc.install 
new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-doc.install
--- old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-doc.install     
1970-01-01 01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-doc.install     
2022-03-25 09:58:37.000000000 +0100
@@ -0,0 +1 @@
+/usr/share/gtk-doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-tools.install 
new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-tools.install
--- old/callaudiod-0.1.3/.gitlab-ci/debian/libcallaudio-tools.install   
1970-01-01 01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/libcallaudio-tools.install   
2022-03-25 09:58:37.000000000 +0100
@@ -0,0 +1 @@
+/usr/bin/callaudiocli
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/rules 
new/callaudiod-0.1.4/.gitlab-ci/debian/rules
--- old/callaudiod-0.1.3/.gitlab-ci/debian/rules        1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/rules        2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,9 @@
+#!/usr/bin/make -f
+
+export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+%:
+       dh $@ --builddirectory=_build
+
+override_dh_auto_configure:
+       dh_auto_configure -- -Dgtk_doc=true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/source/format 
new/callaudiod-0.1.4/.gitlab-ci/debian/source/format
--- old/callaudiod-0.1.3/.gitlab-ci/debian/source/format        1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/source/format        2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1 @@
+3.0 (quilt)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/.gitlab-ci/debian/watch 
new/callaudiod-0.1.4/.gitlab-ci/debian/watch
--- old/callaudiod-0.1.3/.gitlab-ci/debian/watch        1970-01-01 
01:00:00.000000000 +0100
+++ new/callaudiod-0.1.4/.gitlab-ci/debian/watch        2022-03-25 
09:58:37.000000000 +0100
@@ -0,0 +1,3 @@
+version=4
+opts=filenamemangle=s/.*\/archive\/(\d\S+)\/callaudiod.*\.tar\.gz/callaudiod-$1\.tar\.gz/g
 \
+  https://gitlab.com/mobian1/callaudiod/tags?sort=updated_desc 
.*/archive/(\d\S+)/.*\.tar\.gz.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/callaudiod-0.1.3/data/org.mobian_project.CallAudio.xml 
new/callaudiod-0.1.4/data/org.mobian_project.CallAudio.xml
--- old/callaudiod-0.1.3/data/org.mobian_project.CallAudio.xml  2022-01-06 
20:22:37.000000000 +0100
+++ new/callaudiod-0.1.4/data/org.mobian_project.CallAudio.xml  2022-03-25 
09:58:37.000000000 +0100
@@ -26,14 +26,34 @@
       <arg direction="out" name="success" type="b"/>
     </method>
 
+    <!--
+        AudioMode:
+        0 = default audio mode, 1 = voice call mode, 255 = unknown
+    -->
+    <property name="AudioMode" type="u" access="read"/>
+
     <method name="EnableSpeaker">
       <arg direction="in" name="enable" type="b"/>
       <arg direction="out" name="success" type="b"/>
     </method>
 
+    <!--
+        SpeakerState:
+        0 = off, 1 = on, 255 = unknown
+        all other values should be considered the same as 'unknown'
+    -->
+    <property name="SpeakerState" type="u" access="read"/>
+
     <method name="MuteMic">
       <arg direction="in" name="mute" type="b"/>
       <arg direction="out" name="success" type="b"/>
     </method>
+
+    <!--
+        MicState:
+        0 = off, 1 = on, 255 = unknown
+        all other values should be considered the same as 'unknown'
+    -->
+    <property name="MicState" type="u" access="read"/>
   </interface>
 </node>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/libcallaudio/libcallaudio.c 
new/callaudiod-0.1.4/libcallaudio/libcallaudio.c
--- old/callaudiod-0.1.3/libcallaudio/libcallaudio.c    2022-01-06 
20:22:37.000000000 +0100
+++ new/callaudiod-0.1.4/libcallaudio/libcallaudio.c    2022-03-25 
09:58:37.000000000 +0100
@@ -57,7 +57,9 @@
         return TRUE;
 
     _proxy = call_audio_dbus_call_audio_proxy_new_for_bus_sync(
-                                    CALLAUDIO_DBUS_TYPE,0, CALLAUDIO_DBUS_NAME,
+                                    CALLAUDIO_DBUS_TYPE,
+                                    G_DBUS_PROXY_FLAGS_NONE,
+                                    CALLAUDIO_DBUS_NAME,
                                     CALLAUDIO_DBUS_PATH, NULL, error);
     if (!_proxy)
         return FALSE;
@@ -113,13 +115,15 @@
 
     if (async_data && async_data->cb)
         async_data->cb(ret && success, error, async_data->user_data);
+    g_free(async_data);
 }
 
 /**
  * call_audio_select_mode_async:
  * @mode: Audio mode to select
  * @cb: Function to be called when operation completes
- * @data: User data to be passed to the callback function after completion
+ * @data: User data to be passed to the callback function after completion. 
This
+ *        data is owned by the caller, which is responsible for freeing it.
  *
  * Select the audio mode to use.
  */
@@ -169,6 +173,19 @@
     return (ret && success);
 }
 
+/**
+ * call_audio_get_audio_mode:
+ *
+ * Returns: The selected #CallAudioMode.
+ */
+CallAudioMode call_audio_get_audio_mode(void)
+{
+    if (!_initted)
+        return CALL_AUDIO_MODE_UNKNOWN;
+
+    return call_audio_dbus_call_audio_get_audio_mode(_proxy);
+}
+
 static void enable_speaker_done(GObject *object, GAsyncResult *result, 
gpointer data)
 {
     CallAudioDbusCallAudio *proxy = CALL_AUDIO_DBUS_CALL_AUDIO(object);
@@ -189,13 +206,15 @@
 
     if (async_data && async_data->cb)
         async_data->cb(ret && success, error, async_data->user_data);
+    g_free(async_data);
 }
 
 /**
  * call_audio_enable_speaker_async:
  * @enable: Desired speaker state
  * @cb: Function to be called when operation completes
- * @data: User data to be passed to the callback function after completion
+ * @data: User data to be passed to the callback function after completion. 
This
+ *        data is owned by the caller, which is responsible for freeing it.
  *
  * Enable or disable speaker output.
  */
@@ -218,6 +237,20 @@
 }
 
 /**
+ * call_audio_get_speaker_state:
+ *
+ * Returns: %CALL_AUDIO_SPEAKER_ON if the speaker is on, 
%CALL_AUDIO_SPEAKER_OFF if it is off or
+ * %CALL_AUDIO_SPEAKER_UNKNOWN if the state is not known.
+ */
+CallAudioSpeakerState call_audio_get_speaker_state(void)
+{
+    if (!_initted)
+        return CALL_AUDIO_SPEAKER_UNKNOWN;
+
+    return call_audio_dbus_call_audio_get_speaker_state(_proxy);
+}
+
+/**
  * call_audio_enable_speaker:
  * @enable: Desired speaker state
  * @error: The error that will be set if the audio mode could not be selected.
@@ -264,13 +297,15 @@
 
     if (async_data && async_data->cb)
         async_data->cb(ret && success, error, async_data->user_data);
+    g_free(async_data);
 }
 
 /**
  * call_audio_mute_mic_async:
  * @mute: %TRUE to mute the microphone, or %FALSE to unmute it
  * @cb: Function to be called when operation completes
- * @data: User data to be passed to the callback function after completion
+ * @data: User data to be passed to the callback function after completion. 
This
+ *        data is owned by the caller, which is responsible for freeing it.
  *
  * Mute or unmute microphone.
  */
@@ -319,3 +354,17 @@
 
     return (ret && success);
 }
+
+/**
+ * call_audio_get_mic_state:
+ *
+ * Returns: %CALL_AUDIO_MIC_ON if the microphone is on, %CALL_AUDIO_MIC_OFF if 
it is off or
+ * %CALL_AUDIO_MIC_UNKNOWN if the state is not known.
+ */
+CallAudioMicState call_audio_get_mic_state(void)
+{
+    if (!_initted)
+        return CALL_AUDIO_MIC_UNKNOWN;
+
+    return call_audio_dbus_call_audio_get_mic_state(_proxy);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/libcallaudio/libcallaudio.h 
new/callaudiod-0.1.4/libcallaudio/libcallaudio.h
--- old/callaudiod-0.1.3/libcallaudio/libcallaudio.h    2022-01-06 
20:22:37.000000000 +0100
+++ new/callaudiod-0.1.4/libcallaudio/libcallaudio.h    2022-03-25 
09:58:37.000000000 +0100
@@ -7,6 +7,8 @@
 
 #pragma once
 
+#include "libcallaudio-enums.h"
+
 #include <glib.h>
 
 G_BEGIN_DECLS
@@ -15,15 +17,43 @@
  * CallAudioMode:
  * @CALL_AUDIO_MODE_DEFAULT: Default mode (used for music, alarms, 
ringtones...)
  * @CALL_AUDIO_MODE_CALL: Voice call mode
+ * @CALL_AUDIO_MODE_UNKNOWN: Mode unknown
  *
  * Enum values to indicate the mode to be selected.
  */
 
-typedef enum _CallAudioMode {
+typedef enum {
   CALL_AUDIO_MODE_DEFAULT = 0,
   CALL_AUDIO_MODE_CALL,
+  CALL_AUDIO_MODE_UNKNOWN = 255
 } CallAudioMode;
 
+/**
+ * CallAudioSpeakerState:
+ * @CALL_AUDIO_SPEAKER_OFF: Speaker disabled
+ * @CALL_AUDIO_SPEAKER_ON: Speaker enabled
+ * @CALL_AUDIO_SPEAKER_UNKNOWN: Unknown
+ */
+
+typedef enum {
+  CALL_AUDIO_SPEAKER_OFF = 0,
+  CALL_AUDIO_SPEAKER_ON = 1,
+  CALL_AUDIO_SPEAKER_UNKNOWN = 255
+} CallAudioSpeakerState;
+
+/**
+ * CallAudioMicState:
+ * @CALL_AUDIO_MIC_OFF: Mic disabled
+ * @CALL_AUDIO_MIC_ON: Mic enabled
+ * @CALL_AUDIO_MIC_UNKNOWN: Unknown
+ */
+
+typedef enum {
+  CALL_AUDIO_MIC_OFF = 0,
+  CALL_AUDIO_MIC_ON,
+  CALL_AUDIO_MIC_UNKNOWN = 255
+} CallAudioMicState;
+
 typedef void (*CallAudioCallback)(gboolean success,
                                   GError *error,
                                   gpointer data);
@@ -36,15 +66,18 @@
 gboolean call_audio_select_mode_async(CallAudioMode     mode,
                                       CallAudioCallback cb,
                                       gpointer          data);
+CallAudioMode call_audio_get_audio_mode(void);
 
 gboolean call_audio_enable_speaker      (gboolean enable, GError **error);
 gboolean call_audio_enable_speaker_async(gboolean          enable,
                                          CallAudioCallback cb,
                                          gpointer          data);
+CallAudioSpeakerState call_audio_get_speaker_state(void);
 
 gboolean call_audio_mute_mic      (gboolean mute, GError **error);
 gboolean call_audio_mute_mic_async(gboolean          mute,
                                    CallAudioCallback cb,
                                    gpointer          data);
+CallAudioMicState call_audio_get_mic_state(void);
 
 G_END_DECLS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/libcallaudio/meson.build 
new/callaudiod-0.1.4/libcallaudio/meson.build
--- old/callaudiod-0.1.3/libcallaudio/meson.build       2022-01-06 
20:22:37.000000000 +0100
+++ new/callaudiod-0.1.4/libcallaudio/meson.build       2022-03-25 
09:58:37.000000000 +0100
@@ -15,8 +15,16 @@
   'libcallaudio.h',
 ]
 
+libcallaudio_enum_sources = gnome.mkenums_simple(
+  'libcallaudio-enums',
+   sources : libcallaudio_headers,
+   install_header : true,
+   install_dir : libcallaudio_header_dir,
+)
+
 libcallaudio_sources = [
   generated_dbus_sources,
+  libcallaudio_enum_sources,
   libcallaudio_headers,
   'libcallaudio.c',
 ]
@@ -47,7 +55,7 @@
 )
 
 libcallaudio_dep = declare_dependency(
-  sources : [generated_dbus_sources],
+  sources : [generated_dbus_sources, libcallaudio_enum_sources[1]],
   link_with : libcallaudio,
   dependencies: libcallaudio_deps,
   include_directories : libcallaudio_inc,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/meson.build 
new/callaudiod-0.1.4/meson.build
--- old/callaudiod-0.1.3/meson.build    2022-01-06 20:22:37.000000000 +0100
+++ new/callaudiod-0.1.4/meson.build    2022-03-25 09:58:37.000000000 +0100
@@ -8,7 +8,7 @@
 project (
   'callaudiod',
   'c',
-  version : '0.1.3',
+  version : '0.1.4',
   license : 'LGPLv3+',
   meson_version : '>= 0.50.0',
   default_options :
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/src/cad-manager.c 
new/callaudiod-0.1.4/src/cad-manager.c
--- old/callaudiod-0.1.3/src/cad-manager.c      2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/src/cad-manager.c      2022-03-25 09:58:37.000000000 
+0100
@@ -10,6 +10,8 @@
 #include "cad-manager.h"
 #include "cad-pulse.h"
 
+#include "libcallaudio.h"
+
 #include <gio/gio.h>
 #include <glib-unix.h>
 
@@ -49,8 +51,6 @@
                                               G_DBUS_ERROR_FAILED,
                                               "Operation failed");
     }
-
-    free(op);
 }
 
 static gboolean cad_manager_handle_select_mode(CallAudioDbusCallAudio *object,
@@ -76,15 +76,23 @@
     }
 
     op->type = CAD_OPERATION_SELECT_MODE;
+    op->value = GUINT_TO_POINTER(mode);
     op->object = object;
     op->invocation = invocation;
     op->callback = complete_command_cb;
 
     g_debug("Select mode: %u", mode);
     cad_pulse_select_mode(mode, op);
+
     return TRUE;
 }
 
+static CallAudioMode
+cad_manager_get_audio_mode(CallAudioDbusCallAudio *object)
+{
+    return cad_pulse_get_audio_mode();
+}
+
 static gboolean cad_manager_handle_enable_speaker(CallAudioDbusCallAudio 
*object,
                                                   GDBusMethodInvocation 
*invocation,
                                                   gboolean enable)
@@ -101,15 +109,23 @@
     }
 
     op->type = CAD_OPERATION_ENABLE_SPEAKER;
+    op->value = GUINT_TO_POINTER(enable ? CALL_AUDIO_SPEAKER_ON : 
CALL_AUDIO_SPEAKER_OFF);
     op->object = object;
     op->invocation = invocation;
     op->callback = complete_command_cb;
 
     g_debug("Enable speaker: %d", enable);
     cad_pulse_enable_speaker(enable, op);
+
     return TRUE;
 }
 
+static CallAudioSpeakerState
+cad_manager_get_speaker_state(CallAudioDbusCallAudio *object)
+{
+    return cad_pulse_get_speaker_state();
+}
+
 static gboolean cad_manager_handle_mute_mic(CallAudioDbusCallAudio *object,
                                             GDBusMethodInvocation *invocation,
                                             gboolean mute)
@@ -126,38 +142,35 @@
     }
 
     op->type = CAD_OPERATION_MUTE_MIC;
+    op->value = GUINT_TO_POINTER(mute ? CALL_AUDIO_MIC_OFF : 
CALL_AUDIO_MIC_ON);
     op->object = object;
     op->invocation = invocation;
     op->callback = complete_command_cb;
 
     g_debug("Mute mic: %d", mute);
     cad_pulse_mute_mic(mute, op);
-    return TRUE;
-}
 
-static void cad_manager_constructed(GObject *object)
-{
-    G_OBJECT_CLASS(cad_manager_parent_class)->constructed(object);
+    return TRUE;
 }
 
-static void cad_manager_dispose(GObject *object)
+static CallAudioMicState
+cad_manager_get_mic_state(CallAudioDbusCallAudio *object)
 {
-    G_OBJECT_CLASS(cad_manager_parent_class)->dispose(object);
+    return cad_pulse_get_mic_state();
 }
 
 static void cad_manager_call_audio_iface_init(CallAudioDbusCallAudioIface 
*iface)
 {
     iface->handle_select_mode = cad_manager_handle_select_mode;
+    iface->get_audio_mode = cad_manager_get_audio_mode;
     iface->handle_enable_speaker = cad_manager_handle_enable_speaker;
+    iface->get_speaker_state = cad_manager_get_speaker_state;
     iface->handle_mute_mic = cad_manager_handle_mute_mic;
+    iface->get_mic_state = cad_manager_get_mic_state;
 }
 
 static void cad_manager_class_init(CadManagerClass *klass)
 {
-    GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
-    object_class->constructed = cad_manager_constructed;
-    object_class->dispose = cad_manager_dispose;
 }
 
 static void cad_manager_init(CadManager *self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/src/cad-operation.h 
new/callaudiod-0.1.4/src/cad-operation.h
--- old/callaudiod-0.1.3/src/cad-operation.h    2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/src/cad-operation.h    2022-03-25 09:58:37.000000000 
+0100
@@ -29,6 +29,7 @@
 
 struct _CadOperation {
     CadOperationType type;
+    gpointer value;
     CallAudioDbusCallAudio *object;
     GDBusMethodInvocation *invocation;
     CadOperationCallback callback;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/src/cad-pulse.c 
new/callaudiod-0.1.4/src/cad-pulse.c
--- old/callaudiod-0.1.3/src/cad-pulse.c        2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/src/cad-pulse.c        2022-03-25 09:58:37.000000000 
+0100
@@ -7,10 +7,9 @@
 
 #define G_LOG_DOMAIN "callaudiod-pulse"
 
+#include "cad-manager.h"
 #include "cad-pulse.h"
 
-#include "libcallaudio.h"
-
 #include <glib/gi18n.h>
 #include <glib-object.h>
 #include <pulse/pulseaudio.h>
@@ -33,6 +32,8 @@
 {
     GObject parent_instance;
 
+    GObject *manager;
+
     pa_glib_mainloop  *loop;
     pa_context        *ctx;
 
@@ -42,11 +43,14 @@
 
     gboolean has_voice_profile;
     gchar *speaker_port;
+    gchar *earpiece_port;
 
     GHashTable *sink_ports;
     GHashTable *source_ports;
 
-    CallAudioMode current_mode;
+    CallAudioMode audio_mode;
+    CallAudioSpeakerState speaker_state;
+    CallAudioMicState mic_state;
 };
 
 G_DEFINE_TYPE(CadPulse, cad_pulse, G_TYPE_OBJECT);
@@ -149,7 +153,7 @@
     prop = pa_proplist_gets(info->proplist, PA_PROP_DEVICE_CLASS);
     if (prop && strcmp(prop, SINK_CLASS) != 0)
         return;
-    if (g_str_has_suffix(info->name, "monitor"))
+    if (info->monitor_of_sink != PA_INVALID_INDEX)
         return;
     if (info->card != self->card_id || self->source_id != -1)
         return;
@@ -194,6 +198,14 @@
     if (op)
         pa_operation_unref(op);
 
+    if (self->mic_state == CALL_AUDIO_MIC_UNKNOWN) {
+        if (info->mute)
+            self->mic_state = CALL_AUDIO_MIC_OFF;
+        else
+            self->mic_state = CALL_AUDIO_MIC_ON;
+        g_object_set(self->manager, "mic-state", self->mic_state, NULL);
+    }
+
     target_port = get_available_source_port(info, NULL);
     if (target_port) {
         op = pa_context_set_source_port_by_index(ctx, self->source_id,
@@ -313,6 +325,15 @@
             } else {
                 self->speaker_port = g_strdup(port->name);
             }
+        } else if (strstr(port->name, SND_USE_CASE_DEV_EARPIECE) != NULL) {
+            if (self->earpiece_port) {
+                if (strcmp(port->name, self->earpiece_port) != 0) {
+                    g_free(self->earpiece_port);
+                    self->earpiece_port = g_strdup(port->name);
+                }
+            } else {
+                self->earpiece_port = g_strdup(port->name);
+            }
         }
 
         if (port->available != PA_PORT_AVAILABLE_UNKNOWN) {
@@ -323,6 +344,7 @@
     }
 
     g_debug("SINK:   speaker_port='%s'", self->speaker_port);
+    g_debug("SINK:   earpiece_port='%s'", self->earpiece_port);
 }
 
 static void init_sink_info(pa_context *ctx, const pa_sink_info *info, int eol, 
void *data)
@@ -347,6 +369,54 @@
     if (op)
         pa_operation_unref(op);
 
+    if (self->speaker_state == CALL_AUDIO_SPEAKER_UNKNOWN) {
+        self->speaker_state = CALL_AUDIO_SPEAKER_OFF;
+
+        switch (self->audio_mode) {
+        case CALL_AUDIO_MODE_CALL:
+            if (g_strcmp0(info->active_port->name, self->speaker_port) == 0) {
+                self->speaker_state = CALL_AUDIO_SPEAKER_ON;
+                g_object_set(self->manager, "speaker-state", 
self->speaker_state, NULL);
+                /*
+                 * callaudiod likely restarted after being killed during a call
+                 * during which the speaker was enabled. End processing here so
+                 * we keep the current routing and don't unexpectedly mess with
+                 * the call setup.
+                 */
+                return;
+            }
+            break;
+        case CALL_AUDIO_MODE_UNKNOWN:
+            /*
+             * Let's see if we can guess the current mode:
+             * - if current port is earpiece, we're likely in call mode
+             * - otherwise we're either in default mode, or call mode with
+             *   speaker enabled. Let's settle for the former as both 
situations
+             *   are technically equivalent.
+             *
+             * Note: this code path is only used when the card doesn't have a
+             * voice profile, otherwise things are easier to deal with.
+             */
+            if (g_strcmp0(info->active_port->name, self->earpiece_port) == 0) {
+                self->audio_mode = CALL_AUDIO_MODE_CALL;
+                g_object_set(self->manager, "audio-mode", self->audio_mode, 
NULL);
+                /*
+                 * Don't touch routing as we're likely in the middle of a call,
+                 * see above.
+                 */
+                return;
+            } else {
+                self->audio_mode = CALL_AUDIO_MODE_DEFAULT;
+                g_object_set(self->manager, "audio-mode", self->audio_mode, 
NULL);
+            }
+            break;
+        default:
+            break;
+        }
+
+        g_object_set(self->manager, "speaker-state", self->speaker_state, 
NULL);
+    }
+
     target_port = get_available_sink_port(info, NULL);
     if (target_port) {
         g_debug("  Using sink port '%s'", target_port);
@@ -425,10 +495,18 @@
 
         if (strstr(profile->name, SND_USE_CASE_VERB_VOICECALL) != NULL) {
             self->has_voice_profile = TRUE;
+            if (info->active_profile2 == profile)
+                self->audio_mode = CALL_AUDIO_MODE_CALL;
+            else
+                self->audio_mode = CALL_AUDIO_MODE_DEFAULT;
             break;
         }
     }
 
+    // We were able determine the current mode, set the corresponding D-Bus 
property
+    if (self->audio_mode != CALL_AUDIO_MODE_UNKNOWN)
+        g_object_set(self->manager, "audio-mode", self->audio_mode, NULL);
+
     g_debug("CARD:   %s voice profile", self->has_voice_profile ? "has" : 
"doesn't have");
 
     /* Found a suitable card, let's prepare the sink/source */
@@ -632,6 +710,8 @@
 
     if (self->speaker_port)
         g_free(self->speaker_port);
+    if (self->earpiece_port)
+        g_free(self->earpiece_port);
 
     pulseaudio_cleanup(self);
 
@@ -653,6 +733,10 @@
 
 static void cad_pulse_init(CadPulse *self)
 {
+    self->manager = G_OBJECT(cad_manager_get_default());
+    self->audio_mode = CALL_AUDIO_MODE_UNKNOWN;
+    self->speaker_state = CALL_AUDIO_SPEAKER_UNKNOWN;
+    self->mic_state = CALL_AUDIO_MIC_UNKNOWN;
 }
 
 CadPulse *cad_pulse_get_default(void)
@@ -684,12 +768,42 @@
     if (operation) {
         if (operation->op) {
             operation->op->success = (gboolean)!!success;
-            operation->op->callback(operation->op);
+            if (operation->op->callback)
+                operation->op->callback(operation->op);
 
-            if (operation->op->type == CAD_OPERATION_SELECT_MODE &&
-                operation->op->success) {
-                operation->pulse->current_mode = operation->value;
+            if (operation->op->success) {
+                guint new_value = GPOINTER_TO_UINT(operation->value);
+
+                switch (operation->op->type) {
+                case CAD_OPERATION_SELECT_MODE:
+                    if (operation->pulse->audio_mode != new_value) {
+                        operation->pulse->audio_mode = new_value;
+                        g_object_set(operation->pulse->manager, "audio-mode", 
new_value, NULL);
+                    }
+                    break;
+                case CAD_OPERATION_ENABLE_SPEAKER:
+                    if (operation->pulse->speaker_state != new_value) {
+                        operation->pulse->speaker_state = new_value;
+                        g_object_set(operation->pulse->manager, 
"speaker-state", new_value, NULL);
+                    }
+                    break;
+                case CAD_OPERATION_MUTE_MIC:
+                    /*
+                     * "Mute mic" operation's value is TRUE (1) for muting the 
mic,
+                     * so ensure mic_state carries the right value.
+                     */
+                    new_value = new_value ? CALL_AUDIO_MIC_OFF : 
CALL_AUDIO_MIC_ON;
+                    if (operation->pulse->mic_state != new_value) {
+                        operation->pulse->mic_state = new_value;
+                        g_object_set(operation->pulse->manager, "mic-state", 
new_value, NULL);
+                    }
+                    break;
+                default:
+                    break;
+                }
             }
+
+            free(operation->op);
         }
 
         free(operation);
@@ -752,7 +866,7 @@
     if (info->card != operation->pulse->card_id || info->index != 
operation->pulse->sink_id)
         return;
 
-    if (operation->op->type == CAD_OPERATION_SELECT_MODE) {
+    if (operation->op && operation->op->type == CAD_OPERATION_SELECT_MODE) {
         /*
          * When switching to voice call mode, we want to switch to any port
          * other than the speaker; this makes sure we use the headphones if 
they
@@ -794,40 +908,6 @@
     }
 }
 
-static void set_mic_mute(pa_context *ctx, const pa_source_info *info, int eol, 
void *data)
-{
-    CadPulseOperation *operation = data;
-    pa_operation *op = NULL;
-
-    if (eol != 0)
-        return;
-
-    if (!info) {
-        g_critical("PA returned no source info (eol=%d)", eol);
-        return;
-    }
-
-    if (info->card != operation->pulse->card_id || info->index != 
operation->pulse->source_id)
-        return;
-
-    if (info->mute && !operation->value) {
-        g_debug("mic is muted, unmuting...");
-        op = pa_context_set_source_mute_by_index(ctx, 
operation->pulse->source_id, 0,
-                                                 operation_complete_cb, 
operation);
-    } else if (!info->mute && operation->value) {
-        g_debug("mic is active, muting...");
-        op = pa_context_set_source_mute_by_index(ctx, 
operation->pulse->source_id, 1,
-                                                 operation_complete_cb, 
operation);
-    }
-
-    if (op) {
-        pa_operation_unref(op);
-    } else {
-        g_debug("%s: nothing to be done", __func__);
-        operation_complete_cb(ctx, 1, operation);
-    }
-}
-
 /**
  * cad_pulse_select_mode:
  * @mode:
@@ -861,16 +941,21 @@
         /*
          * When ending a call, we want to make sure the mic doesn't stay muted
          */
-        CadPulseOperation *unmute_op = g_new0(CadPulseOperation, 1);
+        CadOperation *unmute_op = g_new0(CadOperation, 1);
+        unmute_op->type = CAD_OPERATION_MUTE_MIC;
 
-        unmute_op->pulse = operation->pulse;
-        unmute_op->value = FALSE;
+        cad_pulse_mute_mic(FALSE, unmute_op);
 
-        op = pa_context_get_source_info_by_index(unmute_op->pulse->ctx,
-                                                 unmute_op->pulse->source_id,
-                                                 set_mic_mute, unmute_op);
-        if (op)
-            pa_operation_unref(op);
+        /*
+         * If the card has a dedicated voice profile, disable speaker so it
+         * doesn't get automatically enabled for next call.
+         */
+        if (operation->pulse->has_voice_profile) {
+            CadOperation *disable_speaker_op = g_new0(CadOperation, 1);
+            disable_speaker_op->type = CAD_OPERATION_ENABLE_SPEAKER;
+
+            cad_pulse_enable_speaker(FALSE, disable_speaker_op);
+        }
     }
 
     if (operation->pulse->has_voice_profile) {
@@ -982,11 +1067,24 @@
     operation->op = cad_op;
     operation->value = (guint)mute;
 
-    op = pa_context_get_source_info_by_index(operation->pulse->ctx,
-                                             operation->pulse->source_id,
-                                             set_mic_mute, operation);
-    if (op)
+    if (operation->pulse->mic_state == CALL_AUDIO_MIC_OFF && 
!operation->value) {
+        g_debug("mic is muted, unmuting...");
+        op = pa_context_set_source_mute_by_index(operation->pulse->ctx,
+                                                 operation->pulse->source_id, 
0,
+                                                 operation_complete_cb, 
operation);
+    } else if (operation->pulse->mic_state == CALL_AUDIO_MIC_ON && 
operation->value) {
+        g_debug("mic is active, muting...");
+        op = pa_context_set_source_mute_by_index(operation->pulse->ctx,
+                                                 operation->pulse->source_id, 
1,
+                                                 operation_complete_cb, 
operation);
+    }
+
+    if (op) {
         pa_operation_unref(op);
+    } else {
+        g_debug("%s: nothing to be done", __func__);
+        operation_complete_cb(operation->pulse->ctx, 1, operation);
+    }
 
     return;
 
@@ -998,3 +1096,21 @@
     if (operation)
         free(operation);
 }
+
+CallAudioMode cad_pulse_get_audio_mode(void)
+{
+    CadPulse *self = cad_pulse_get_default();
+    return self->audio_mode;
+}
+
+CallAudioSpeakerState cad_pulse_get_speaker_state(void)
+{
+    CadPulse *self = cad_pulse_get_default();
+    return self->speaker_state;
+}
+
+CallAudioMicState cad_pulse_get_mic_state(void)
+{
+    CadPulse *self = cad_pulse_get_default();
+    return self->mic_state;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/src/cad-pulse.h 
new/callaudiod-0.1.4/src/cad-pulse.h
--- old/callaudiod-0.1.3/src/cad-pulse.h        2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/src/cad-pulse.h        2022-03-25 09:58:37.000000000 
+0100
@@ -7,6 +7,7 @@
 
 #pragma once
 
+#include "libcallaudio.h"
 #include "cad-operation.h"
 
 #include <glib-object.h>
@@ -22,4 +23,8 @@
 void cad_pulse_enable_speaker(gboolean enable, CadOperation *op);
 void cad_pulse_mute_mic(gboolean mute, CadOperation *op);
 
+CallAudioMode cad_pulse_get_audio_mode(void);
+CallAudioSpeakerState cad_pulse_get_speaker_state(void);
+CallAudioMicState cad_pulse_get_mic_state(void);
+
 G_END_DECLS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/src/meson.build 
new/callaudiod-0.1.4/src/meson.build
--- old/callaudiod-0.1.3/src/meson.build        2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/src/meson.build        2022-03-25 09:58:37.000000000 
+0100
@@ -17,6 +17,7 @@
     'callaudiod',
     config_h,
     generated_dbus_sources,
+    libcallaudio_enum_sources,
     [
         'callaudiod.c', 'callaudiod.h',
         'cad-manager.c', 'cad-manager.h',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/callaudiod-0.1.3/tools/callaudiocli.c 
new/callaudiod-0.1.4/tools/callaudiocli.c
--- old/callaudiod-0.1.3/tools/callaudiocli.c   2022-01-06 20:22:37.000000000 
+0100
+++ new/callaudiod-0.1.4/tools/callaudiocli.c   2022-03-25 09:58:37.000000000 
+0100
@@ -6,6 +6,7 @@
  */
 
 #include "libcallaudio.h"
+#include "libcallaudio-enums.h"
 
 #include <glib.h>
 
@@ -16,11 +17,13 @@
     int mode = -1;
     int speaker = -1;
     int mic = -1;
+    gboolean status = FALSE;
 
     const GOptionEntry options [] = {
         {"select-mode", 'm', 0, G_OPTION_ARG_INT, &mode, "Select mode", NULL},
         {"enable-speaker", 's', 0, G_OPTION_ARG_INT, &speaker, "Enable 
speaker", NULL},
         {"mute-mic", 'u', 0, G_OPTION_ARG_INT, &mic, "Mute microphone", NULL},
+        {"status", 'S', 0, G_OPTION_ARG_NONE, &status, "Print status", NULL},
         { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }
     };
 
@@ -36,6 +39,10 @@
         return 1;
     }
 
+    /* If there's nothing else to be done, print the current status */
+    if (mode == -1 && speaker == -1 && mic == -1)
+        status = TRUE;
+
     if (mode == CALL_AUDIO_MODE_DEFAULT || mode == CALL_AUDIO_MODE_CALL)
         call_audio_select_mode(mode, NULL);
 
@@ -45,6 +52,20 @@
     if (mic == 0 || mic == 1)
         call_audio_mute_mic((gboolean)mic, NULL);
 
+    if (status) {
+        CallAudioMode audio_mode = call_audio_get_audio_mode();
+        CallAudioSpeakerState speaker_state = call_audio_get_speaker_state();
+        CallAudioMicState mic_state = call_audio_get_mic_state();
+        const char *string_audio = g_enum_to_string(CALL_TYPE_AUDIO_MODE, 
audio_mode);
+        const char *string_speaker = 
g_enum_to_string(CALL_TYPE_AUDIO_SPEAKER_STATE, speaker_state);
+        const char *string_mic = g_enum_to_string(CALL_TYPE_AUDIO_MIC_STATE, 
mic_state);
+
+        g_print("Selected mode: %s\n"
+                "Speaker enabled: %s\n"
+                "Mic muted: %s\n",
+                string_audio, string_speaker, string_mic);
+    }
+
     call_audio_deinit ();
     return 0;
 }

++++++ callaudiod.obsinfo ++++++
--- /var/tmp/diff_new_pack.lqzS7A/_old  2022-09-29 18:15:23.823494787 +0200
+++ /var/tmp/diff_new_pack.lqzS7A/_new  2022-09-29 18:15:23.827494795 +0200
@@ -1,5 +1,5 @@
 name: callaudiod
-version: 0.1.3
-mtime: 1641496957
-commit: 4cb8bd9d228d13ea67e79f4c37c674f412b32d20
+version: 0.1.4
+mtime: 1648198717
+commit: a7ca6ce9d4c947f19c3f99ff2cab986c64434e57
 

Reply via email to